gx/images/Button_icon.png000664 001750 001750 00000017075 12702465756 016606 0ustar00sergiosergio000000 000000 PNG  IHDRvOsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time03/21/09q\IDATxy\e߳ԩ-%}!B @ p(yTD}u\f.܋(> "#`Q!ЄtNWwuoTWQ<'OW{6RG"H)=ϋh-ZRJ`$ ,Ҷmk5Zkmp B鉉̑~~'<|>IqzX\n`Z }|:Z mi e/Ďgyƍl0fPD<\}\u]O?}s30-by绮vr98SɡL4W0*Z9y 9flݺT*E4}ڵk؉D(}ߏeY݋eY"Td2ɾ}HR  «zjGl`6hsގeYH) `,X@oo/'|2haΜ9~ꤔ'V̙8r9|qRٳm۶QNkQAu|<&'')^O>( ND"0880mmm477tқmX>T\.G4P(T2~mۆm\~崴 ]ާ9*Jq饗r]wN9S1 beY$ ,"LR(F'7444B=VH8LNN裏"k_ZUJAt:~Z8---\s5\xMV~ןUZ:z0%(oZ"]2/H) 8 )KLY_@7}St|wQJT5iLJ{67\ʚM#҇ր yi,")0Phm ۍC*%K)hճq_ΙgS,V-iZbt ;4k6]F<s%`bh6㐜1Z2Q,Z $Xxx"7."W\}-eUFp4C <'/6j+ !Boo?e 7/k}cYRx\[, qXnk֬-o]7)ah|)Q"uXp?П`*r/5ZهGxz}ߟ!XY"+K=t%B``ǯy7m+_/P(~ea1m ~+P͂ Bu i]1n,[ qR>-xNy/i2 CV]eyʇi!d2"Bbc {XK #/r҉+_cᢅd2ߊ ^,)oY Heyhy.hXŔdE&!R,)!  U/:hRHċF >lbbDQz<|eXJC2 WiO=x a>ϱb22SS3u)%W$m|c te(" NC1}ufx8CcccE(u0 \x'L4]aq|gbb"p%Ko>/Jfd2<ڹ;l!04Vl#B.VgK^<2U紮L| FfBh{.&.MKHdkfD"P8tG(C# !Z:Ҍ. i4b2ˍ ?޽dddğm/oE"-~)lhhX.BbOOϻ:no'7uE$T*x:eؾ_ݹS^&f&''*3ٶ.V LlU`Pa2f$t/(vFn!%Dbur9999ebbgi;GАxq'Ȉ}sR|+ ,8i5J\UF=?ZU^R ='%XJANụ92).YDs#mOyd 3h,Z6 4B?۷ej._\|_ihh/8q yg0wz"m+q U{KJ B=?ϦK.>&Farp!yt,$ yw۷yZpI'_??|!{wcVvQuD&A$'X tRPOy5AxxS#dRd)܉uֶv::hhH B_:ts̄*sum4u]ғ ӿwH%}X+0DKgyl]D -`F䕻v}hhxZs̅袋7m􎖖[|@.%b2fbbT!<^wfCKd p4J8ƲCض]lwxxo۶mn+"TK.sѢE:::ަW,p]z]O /jzjz_ġCpۓ䟆FGGyE*sYg5vvvϛ7oi$9!=Jyzzs {GDO8Ptzxll'CתbyUfŊNCCC4;6~ x~_8). T!ϻDy`تIENDB`sdl/unzip.c000664 001750 001750 00000110015 12702465756 014011 0ustar00sergiosergio000000 000000 /* unzip.c -- IO on .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Read unzip.h for more info */ #include #include #include #include #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else #include #endif #ifndef local #define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ !defined(CASESENSITIVITYDEFAULT_NO) #define CASESENSITIVITYDEFAULT_NO #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif const char unz_copyright[] = " unzip 0.15 Copyright 1998 Gilles Vollant "; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ FILE* file; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { FILE* file; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ } unz_s; /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte(fin,pi) FILE *fin; int *pi; { unsigned char c; int err = fread(&c, 1, 1, fin); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ferror(fin)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (fileName1,fileName2) const char* fileName1; const char* fileName2; { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) const char* fileName1; const char* fileName2; int iCaseSensitivity; { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #define BUFREADCOMMENT (0x400) /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir(fin) FILE *fin; { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (fseek(fin,0,SEEK_END) != 0) return 0; uSizeFile = ftell( fin ); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (fseek(fin,uReadPos,SEEK_SET)!=0) break; if (fread(buf,(uInt)uReadSize,1,fin)!=1) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer "zlib/zlib109.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen (path) const char *path; { unz_s us; unz_s *s; uLong central_pos,uL; FILE * fin ; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; fin=fopen(path,"rb"); if (fin==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(fin); if (central_pos==0) err=UNZ_ERRNO; if (fseek(fin,central_pos,SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(fin,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); fclose(s->file); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) unzFile file; unz_global_info *pglobal_info; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) uLong ulDosDate; tm_unz* ptm; { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal (file, pfile_info, pfile_info_internal, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; unz_file_info_internal *pfile_info_internal; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo (file, pfile_info, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (file) unzFile file; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) unzFile file; const char *szFileName; int iCaseSensitivity; { unz_s* s; int err; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; return err; } /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, poffset_local_extrafield, psize_local_extrafield) unz_s* s; uInt* piSizeVar; uLong *poffset_local_extrafield; uInt *psize_local_extrafield; { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (fseek(s->file,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile (file) unzFile file; { int err=UNZ_OK; int Store; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; Store = s->cur_file_info.compression_method==0; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->file=s->file; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if (!Store) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; return UNZ_OK; } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (file, buf, len) unzFile file; voidp buf; unsigned len; { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->read_buffer == NULL)) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if (len>pfile_in_zip_read_info->rest_read_uncompressed) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if (pfile_in_zip_read_info->compression_method==0) { uInt uDoCopy,i ; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) unzFile file; voidp buf; unsigned len; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) unzFile file; char *szComment; uLong uSizeBuf; { /* int err=UNZ_OK; */ unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } gx/images/Button_delete_over.png000664 001750 001750 00000010562 12702465756 020145 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚ{tTս?#03yN Ŷ@j( *b+. Z{{ 誵Vikok㵴,𱰭ЀxZy &&yιLd$uk5gg9X/ʲ\+2 @  %IRŴG ʲwœMESmg ڃTUH.+㼅Tx3~,m&ꁭ$u\m(r9 p{hvz&F4LUE*o?88 EY;gm|tAs{6[r9ّP+L^y*><l$P22_SCΝ ‘fk 9To?!7sx iu$Iw Pe+pÀqʶ66ouFP5EQ:CIq]6uMm o#$?(˲p/>`Nftr;(M 85X‚bAE!HH$FD"-B3g&aw3@U{]|a$$)|eY<<'mb-=zWlt;XVDQD"aDVڣr'/!a+1$.Pˁ yM <\Kn;Zjf!( tx<XL-qj\Zv~_YoݩKĀ,Z6s̛WprsrlCRj5OMUUV}5_yOiOZ;UT掔N,>ppրq/䆩gyGDAa!MtAĐsƪ* pg}%L\Gd)z_䱥~h8Pua6f\ a)֒S0cbtF2>ݬ& ?n3dcCWr+ AƆ7 sa (`ѓO<& >#:KjMRT4In~j%wEEL dYz> >8sꜤ{'r{ Nvi^FP)cł-i X6T%ƫ/>0.˲sT@Y5V.X#/[`{pd;lwiTq$Fr]q( (,{ ט8~9KX ?"@`wMm3+h>\pME3ŌץCiXV:Dx3lۺIVȲGJ K1iv Mx뵝?ٺr ʸ_"C^MvV=:v+uC, ;3# 8NB!BDb I]#=URr*ع%cc|jb/ ܸ.`8S fY^'ŶaJʨP(ɓ'Yt)yyyqFTUt*===~/^L~~Q__ߨttWm9=Q݌ ˍ "r$I}zpb&,}쥻qeee;}غuk!W]u+Vj"rʌ\sM 2sєҊE. 0EƸjfRcpީc{qlIW:Yb0}tB-0Z$JJJ|aZٵkWFEW#F̔LA rwS`0Lnmm.+\C fpPSSCKK [,"/B&z!}q<{xͮzZ30d-|l4.ꥇs8&Ȍ~#&MDUUÞ{9(++ҥKX,UA +o]Z@s8` %əKgłT7CwIyy9˖-iHYYfʀ={?HrQSϙ4ۃ=Q|A>-Kqhvq:u]􌼏{u qrppr$`N+@ 0op(`vX,Hގəy㧧P_ڌ N~WGNN~?ׯRVV͛GTT[0՝4}`\-cp~V^̙3K*֮]`@a+s):׍s!˗ PWW@}}}F{]]Va]qI2@pPNCIf"htgg<#oVD*׳{K,A4}j*ULO/"^YD[ܟb >:4^{-TEAXj8iБacpjϦ;xԎ]݄aS`0H8f֭ӘR4޽AZ#fX>cxoE% iZ־e~+ ͧ Q,!=wɢ(vŋgZ 0dl ̙3Dԧ(zmiSzXw,xɨj57oH/=f:+q3cS7H}:Vp8$I1io7ܿi0Lj)(]2,]݊Ù{<4N~b0>&&U<3bg~GCz nhi!='gkMopex]$(IR7iZRK.:L$үä+gl?=\Nt`Ed7q.͝2/[5R_/`bq3jvW=9i8-&VXV~3,,]{/EnIFKߣ07L__m㹨:x4sQEQ(uCͱM7-\?+4{c>Ǜ鍿ADCY$J9W'K4.k]L$ %->_A[PUM;J|EQ`BOѡ8U8x5UC~׷|/=Andy]8 /zA>[mGs $Hv\s}?*Hu~'7ˍ ǁE 4~h;eۖ?G?ڜ:bzͻG|7(SkSmotsiioQIt>~)s{6ݱeL蹖ްF78KUȼ5o^`$I\ E$+к7W~A>wA a*K"TG(PJn-v]vZN;T,:)ӘiWO.o7JƋJ` u`JOhco -B,`e5e.JeR,5U <r!`rQesl` PAAH@M  C5xkHIENDB`core/cart_hw/svp/000700 001750 001750 00000000000 12703321515 015054 5ustar00sergiosergio000000 000000 core/m68k/m68ki_cycles.h000664 001750 001750 00001640073 12702465756 016121 0ustar00sergiosergio000000 000000 static const unsigned char m68ki_cycles[0x10000] = { 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 0*7, 0*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 34*7, 32*7, 36*7, 32*7, 34*7, 28*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 28*7, 32*7, 28*7, 30*7, 24*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 28*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 32*7, 30*7, 34*7, 30*7, 32*7, 26*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 24*7, 26*7, 20*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 22*7, 24*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 20*7, 24*7, 20*7, 22*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 16*7, 20*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 22*7, 26*7, 0*7, 0*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 4*7, 4*7, 20*7, 0*7, 16*7, 4*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 18*7, 20*7, 18*7, 22*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 10*7, 12*7, 10*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 8*7, 12*7, 8*7, 12*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 14*7, 18*7, 14*7, 16*7, 10*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 14*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 8*7, 12*7, 8*7, 10*7, 4*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 10*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 12*7, 16*7, 12*7, 14*7, 8*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 16*7, 18*7, 12*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 30*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 22*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 24*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 26*7, 24*7, 28*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 20*7, 18*7, 22*7, 18*7, 20*7, 16*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 12*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 14*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 16*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 18*7, 16*7, 20*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 6*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 8*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 0*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, 4*7, }; core/tremor/os.h000664 001750 001750 00000003367 12702465756 014763 0ustar00sergiosergio000000 000000 #ifndef _OS_H #define _OS_H /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. ********************************************************************/ #include #include "os_types.h" #ifndef _V_IFDEFJAIL_H_ # define _V_IFDEFJAIL_H_ # ifdef __GNUC__ # define STIN static __inline__ # elif _WIN32 # define STIN static __inline # endif #else # define STIN static #endif #ifndef M_PI # define M_PI (3.1415926536f) #endif #ifdef _WIN32 # include # define rint(x) (floor((x)+0.5f)) # define NO_FLOAT_MATH_LIB # define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) #ifndef _XBOX360 # define LITTLE_ENDIAN 1 # define BYTE_ORDER LITTLE_ENDIAN #endif #endif #ifdef HAVE_ALLOCA_H # include #endif #ifdef USE_MEMORY_H # include #endif #ifndef min # define min(x,y) ((x)>(y)?(y):(x)) #endif #ifndef max # define max(x,y) ((x)<(y)?(y):(x)) #endif #endif /* _OS_H */ gcw0/opk-data/gcw0readme.txt000664 001750 001750 00000014152 12702465756 017042 0ustar00sergiosergio000000 000000 Genesis Plus GX port for the GCW0 Handheld Console GCW0 port by: Shin-NiL David Knight Source code available at: https://bitbucket.org/shin_nil/genesis-plus-gx-gcw0/ Genesis Plus GX is an open-source emulator focused on accuracy and portability, now emulating SG-1000, Master System, Game Gear, Mega Drive / Genesis and Sega / Mega CD hardware. Initially ported and designed to be running on Gamecube / Wii consoles through libogc / devkitPPC, it is also available for many other platforms through various frontends. The source code is based on Genesis Plus 1.3, originally developped by Charles MacDonald (http://cgfm2.emuviews.com). It has been heavily modified, with respect to initial goals and design, in order to improve accuracy of emulation, implementing new features and adding support for extra peripherals, cartridge & systems hardware. The result is that Genesis Plus GX is now more a continuation of the original project than a simple port, providing very accurate emulation and 100% compatibility with Genesis / Mega Drive, Sega / Mega CD, Master System, Game Gear & SG-1000 software (including all unlicensed or pirate known dumps), also emulating backwards compatibility modes when available. Multi-platform sourcecode is available through SVN and GIT so that other Genesis Plus ports can take advantage of it. The sourcecode is released under a specific non-commercial license, see LICENSE.txt for more informations. INSTRUCTIONS For SG-1000, Game Gear (GG), Master System (SMS) and Mega Drive (Genesis, MD) you don't need to do anything. Just locate the rom file you wish to use (zip files are supported) and run it through the gMenu. For Sega CD games you will need the correct bios files. These are not included with this distribution for copyright reasons. Once you have located the correct bios you will need to rename them according to the correct region: "/usr/local/home/.genplus/bios/bios_CD_U.bin" "/usr/local/home/.genplus/bios/bios_CD_E.bin" "/usr/local/home/.genplus/bios/bios_CD_J.bin" If everything is setup correctly you will then need to locate your image files and run them. .bin/.cue and .iso files are supported, .ogg compressed tracks are supported, .mp3 is NOT supported for legal reasons. (ogg is better anyway :P) To access the menu press SELECT+START. Controls can be reconfigured from there. In the menu A selects option, B will go back to the last menu. Default controls are: D-Pad/A-Stick: Directions X: A B: B A: C L: X Y: Y R: Z START: Start SELECT: Mode SELECT + START: Menu SELECT + L: Quicksave to Savestate 1 SELECT + R: Quickload savestate 1 In lightgun games for the Master system and Genesis/MD A-stick controls the cursor and A/B/C work as normal. Player 2 controls are mapped to the D-pad and X/Y/Z buttons. This allows (in theory at least!) two player games. It also allows you to select which control method you prefer. Some games (eg Spacegun) require two controllers. CONFIGURATION OPTIONS (Default setting) Scaling (On) The gcw0 has hardware bilinear scaling which when turned on will enlarge the image to fill the screen. By default this keeps aspect ration so you will still see small bars unless the scaled resolution is exactly 320x240. This is particularly useful for SMS and GG games. Keep aspect ratio (On) This does nothing unless Scaling is turned on. If aspect ratio is turned off the hardware scaler will fill the whole screen and there will be no black bars visible. Scanlines (GG) (On) This emulates the vertical scanlines visible on the LCD screen. It is only used when running Game Gear games. Mask left bar (SMS) (On) The Master System often displays a vertical bar on the left of the screen. Setting this to 'On' will remove it. Frameskip (0) In all games except Mega CD this is of no use as the emulation is near perfect speed (with the exception of Virtual Racing). Setting this value will render fewer frames allowing a little speed increase. This improves the performance of FMV scenes in Mega CD games. Resume on Save/Load (On) When saving from the menu, the menu will automatically exit and the game will continue. If turned off it will return you to the menu. A-stick (On) Some users have issues with their analog controls causing erratic movements. Turning off the A-stick will stop this. Lock-on (Off) If enabled, when loading a rom the selected file will be loaded first. Rename each binary file as follows: Game Genie: "/usr/local/home/.genplus/lock-on/ggenie.bin" Action Replay: "/usr/local/home/.genplus/lock-on/areplay.bin" Sonic & Knuckles: "/usr/local/home/.genplus/lock-on/sk.bin" and /usr/local/home/.genplus/lock-on/sk2chip.bin additional info After changing the lock-on option, you must reload the game rom. FM sound (SMS) (On) Select whether to use enhanced sound on a few Master System titles. A list of compatible titles is at the foot of this readme. Lightgun Speed (1) Higher values will speed up the lightgun cursor for player 1. Lightgun Cursor Change the lightgun cursor. The cursor is only visible in compatible lightgun games. FM (enhanced music) Compatible Master system titles (taken from http://segaretro.org/FM_Sound_Unit) (Note in most cases, only the Japanese variants are compatible) After Burner Alex Kidd BMX Trial Alex Kidd: The Lost Stars Alien Syndrome Aztec Adventure Blade Eagle 3-D Bomber Raid Captain Silver Cyborg Hunter Double Dragon Fantasy Zone II Fantasy Zone: The Maze Galactic Protector Global Defense Golvellius - Valley of Doom Great Golf Hoshi Wo Sagashite... Kenseiden Lord of The Sword Maze Hunter 3-D Megumi Rescue Miracle Warriors - Seal of The Dark Lord Nekkyuu Koushien OutRun Parlour Games Penguin Land Phantasy Star Power Strike R-Type Shinobi Solomon no Kagi - Oujo Rihita no Namida Space Harrier 3-D SpellCaster Super Racing Tensai Bakabon Thunder Blade Wonder Boy in Monster Land Ys: The Vanished Omens Zaxxon 3-D Zillion II: The Tri Formation The following games have FM soundtracks but were not released in Japan: Altered Beast California Games Casino Games Cloud Master Galaxy Force Golfamania OutRun 3-D Poseidon Wars 3-D Rampage Rastan Rescue Mission Scramble Spirits Shanghai Tennis Ace Time Soldiers Ultima IV Vigilante Wonder Boy III: The Dragon's Trap 2015/03/22 gcw0/utils.h000664 001750 001750 00000000352 12702465756 014071 0ustar00sergiosergio000000 000000 #ifndef _UTILS_H_ #define _UTILS_H_ /* Function prototypes */ void create_default_directories(void); char* get_save_directory(void); char* gcw0_get_key_name(int keycode); char *get_file_name(char *full_path); #endif /* _UTILS_H_ */ sdl/unzip.h000664 001750 001750 00000024066 12702465756 014030 0ustar00sergiosergio000000 000000 /* unzip.h -- IO for uncompress .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Copyright (C) 1998 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE CAN CHANGE IN FUTURE VERSION !! I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer "zlib/zlib111.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ #ifdef __cplusplus } #endif #endif /* _unz_H */ gx/images/Button_text_over.png000664 001750 001750 00000005447 12702465756 017675 0ustar00sergiosergio000000 000000 PNG  IHDR0:sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 {IDATxkT9gvfº"l1K R- 7MJ"" 闦MlFMmb(Xlmb ^9(E +{ΥpvvfTd_3|xyw¶V 4Hp)FFF0M1 \>D"ꨯ˲6=w:F mmd2/o>N:E*Bk{# >`bL6EBeee'Ƿ#(mo6޽;vH$0e|,އxK \ <Wu \_Q444b ,Y9Q٤ ŶkmFWWSsyV pYjKtk \*F,e WSC"ib .dժUt{=Am{G}7x6 %6)tR__?󮈉 z5O.zzzꁻ-m׮]dmǝ A6(^}m48QlY8̽_aVk~_i;0' y6 h=z(O&qkuk}}t,KD.SahhC7pxLrʪ<4VkppuQg3Nh4Sil<bYa`YE"dd(ĢLO~$BySHLRT`uFGGQ*.h48A1AߊByR*6u$y^H 4ϻRQA} ODPabUpL&R*Y]G9)m?JPVB[ud2d2$IRTt:k\;O|IAb~S>,By] ޛeYD" Cѱl{e±]RP–`ĢPvD0M3&H˲>X˓n_lP^K];fd2^k;tQ,O L,a3aԘaYű< Pډ>ID"***HRѶdy7A(v'G/4.9_ ndXm{и( ?( P>l6d&LDg)8D>X˓owO _hYA(q׆¢GeyUv0;wjXcMZ3d7G1{lN ؾr͛7s7gƝ'8oڇv '~M:g@ܹs.\Ɀ6l#.XAL`F@l2M6 t[lI̙>=#5V53\1)[piA>Zȉ*~xz477n:R߉{ضuhhh͓O>d(<}:gڐw$‡Éwc9s^ eRX,FCC:<ۄIENDB`core/cd_hw/cdd.h000664 001750 001750 00000006654 12702465756 014652 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD drive processor & CD-DA fader * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _HW_CDD_ #define _HW_CDD_ #include "blip_buf.h" #if defined(USE_LIBVORBIS) #include #elif defined(USE_LIBTREMOR) #include "tremor/ivorbisfile.h" #endif #define cdd scd.cdd_hw /* CDD status */ #define CD_BUSY 0x00 #define CD_PLAY 0x01 #define CD_SEEK 0x02 #define CD_SCAN 0x03 #define CD_PAUSE 0x04 #define CD_OPEN 0x05 #define CD_STOP 0x09 #define NO_DISC 0x0B #define CD_END 0x0C #define CD_MAX_TRACKS 100 /* CD track */ typedef struct { FILE *fd; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) OggVorbis_File vf; #endif int offset; int start; int end; int type; } track_t; /* CD TOC */ typedef struct { int end; int last; track_t tracks[CD_MAX_TRACKS]; FILE *sub; } toc_t; /* CDD hardware */ typedef struct { uint32 cycles; uint32 latency; int loaded; int index; int lba; int scanOffset; int volume; uint8 status; uint16 sectorSize; toc_t toc; int16 audio[2]; } cdd_t; /* Function prototypes */ extern void cdd_init(int samplerate); extern void cdd_reset(void); extern int cdd_context_save(uint8 *state); extern int cdd_context_load(uint8 *state); extern int cdd_load(char *filename, char *header); extern void cdd_unload(void); extern void cdd_read_data(uint8 *dst); extern void cdd_read_audio(unsigned int samples); extern void cdd_update(void); extern void cdd_process(void); #endif gx/images/Main_play_wii.png000664 001750 001750 00000007112 12702465756 017073 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 IDATx{lT?g:tzG-R ">&V )%ql"h@$MlbtEhrXJK(-LKK_s3ss[+~_~9=ϑH$e˖źou:Rss3aߚxL$++?..^x?͝;B8ύI7<)IlذaCOOϟ`FJJ p뭷M,\rSz"55yVZu8]$IlݺujggӧByHLL\Aa|@ee%sOuvv/>kݶmԮ.ϢE"L4闹_t]ĉ| Vܹ?`4Q@̛7/2## 2n8+ uuuTUUxAUU6myyy呐 躎iζmؿxᇟ.))u۷3gNٳYp!6 `0Hee%'Od̚53g2~x"""oСC;v￟u֑|2M04 MӐewy-,YOnG!EbDYYVzsbnqEՅB)Eaa~Ku(K˗}ݗfi? 6lHHH#&&{z:MMM;v|T+W3xBnAd˴ LK\.vÇ)..FQ֮]Kg6iֱa͛)**7  IHOOtFXy衇F5ֳ֠ݔwqD_/ČHmCm݆b͚53'+ 0 t]qHOOgݩK.gh$M6=t\L23k/^LRRUy@>ɗA"KDOᅦ.O1''zbn®V^pw300 `֬YI4F˂ + /+5"%$L@6.Af_ D@2:Bmm-,_Sg&u]gݻ7~8ΙbxCSZ͛ |cw]t44 c ~CuUUyg9p7ϡk94Mf̘ATT4iҤWm[lYl-11њ"ORRݪ[~ $*$ 13$$$L3) DrIL6iӦo߾1]ڵk͵B~~>o6Ǐ'77wyf+mR]]mf=$Yj#մ4l@ ' Y"33E@Y{?%(a ЅDZI"JT'qTC (@ff&񌩬&)) ׋$oߎ,Ȳfܹ<׭k$Б GMgϞ,myMMM̘1ê̙3̜9NE8ah6I"5NdFl$9q8"IC?d P" YYY={v@N'999i&QzYL>#bdYݻw#2?X`ժUCkC#^fe !`H 1"@vn 4MԩS\rT^^Nyy_l+VN'ՔBi cd;s 111s=g\tva`hP*((ӧӧn7d VCHB`3  -H3ݞoZZZسg555VK+7pW_%##,<(5|>jjjPUɒ%Kرc~EQ ptpd1G gǝwi;nʪ  qdhhh@UU޾0eʔ7{PXXO<'|ƒ2%B0n#&Ѕ a" 0t}i۷ o~Xbxu}H(xHȟ9皚vڷtRmmɓqL07cO,ZMLMC4UCTTEAUBH ?`=zדMC {(scxO>MKK ؅HDVV֫_yCBB<PK/l2EARl  a( z( ah>jwN8/HQQ~FN+CdYfW566 FS$e˖p¬4veUoիIOOGQB:9s*z{{Yz'Ͽ] hx=88h9駟lY]]]mB、ȑ#}]O>Iaa!4immJ!--'*/^ٳ>}NrssYv-7ϏWhxvPKN:%NTSSӾpkFN>9|mFttշW_qQft:INN&''Evs OG~Y줪/<ϾQ GFPs]]]P^{3gZPOP4kqu=e] ,x<>"\ss̰WW6|njjjutt/c=Fvv66u{Px *p\ս477u? o[n~`JTT)))\.NJBBr.] asa<7x7F}θ[;::eyZZZ5Emj׻m<7b?9&wLZ8IENDB`gcw0/utils.c000664 001750 001750 00000012547 12702465756 014075 0ustar00sergiosergio000000 000000 #include #include #include "utils.h" #include "osd.h" void create_default_directories(void) { const char *homedir; if ((homedir = getenv("HOME")) == NULL) { homedir = getpwuid(getuid())->pw_dir; } char pathname[MAXPATHLEN]; /* base directory */ sprintf (pathname, "%s%s", homedir, DEFAULT_PATH); DIR *dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default SRAM & Savestate files directories */ sprintf (pathname, "%s%s/saves", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/saves/md", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/saves/ms", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/saves/gg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/saves/sg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/saves/cd", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default Snapshot files directories */ sprintf (pathname, "%s%s/snaps", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/snaps/md", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/snaps/ms", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/snaps/gg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/snaps/sg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/snaps/cd", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default Cheat files directories */ sprintf (pathname, "%s%s/cheats", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/cheats/md", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/cheats/ms", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/cheats/gg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/cheats/sg", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s%s/cheats/cd", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default BIOS ROM files directories */ sprintf (pathname, "%s%s/bios", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default LOCK-ON ROM files directories */ sprintf (pathname, "%s%s/lock-on", homedir, DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); } char* get_save_directory(void) { const char *homedir; const char *system_dir; if ((homedir = getenv("HOME")) == NULL) { homedir = getpwuid(getuid())->pw_dir; } char pathname[MAXPATHLEN]; if(system_hw <= SYSTEM_MARKIII){ system_dir = "/saves/sg"; } else if (system_hw > SYSTEM_MARKIII && system_hw <= SYSTEM_SMS2) { system_dir = "/saves/ms"; } else if (system_hw > SYSTEM_SMS2 && system_hw <= SYSTEM_GGMS) { system_dir = "/saves/gg"; } else if (system_hw == SYSTEM_MD) { system_dir = "/saves/md"; } else if (system_hw == SYSTEM_MCD) { system_dir = "/saves/cd"; } else { system_dir = "/saves/"; } sprintf (pathname, "%s%s%s", homedir, DEFAULT_PATH, system_dir); return pathname; } char* gcw0_get_key_name(int keycode) { if (keycode == SDLK_UP) return "Up"; else if (keycode == SDLK_DOWN) return "Down"; else if (keycode == SDLK_LEFT) return "Left"; else if (keycode == SDLK_RIGHT) return "Right"; else if (keycode == SDLK_LCTRL) return "A"; else if (keycode == SDLK_LALT) return "B"; else if (keycode == SDLK_LSHIFT) return "X"; else if (keycode == SDLK_SPACE) return "Y"; else if (keycode == SDLK_TAB) return "L"; else if (keycode == SDLK_BACKSPACE) return "R"; else if (keycode == SDLK_RETURN) return "Start"; else if (keycode == SDLK_ESCAPE) return "Select"; else return "..."; } char *get_file_name(char *full_path) { char file_name[256]; sprintf(file_name, "%s", basename(full_path)); /* remove file extension */ int i = strlen(file_name) - 1; while ((i > 0) && (file_name[i] != '.')) i--; if (i > 0) file_name[i] = 0; return file_name; } core/ntsc/sms_ntsc_config.h000664 001750 001750 00000001654 12702465756 017154 0ustar00sergiosergio000000 000000 /* Configure library by modifying this file */ #ifndef SMS_NTSC_CONFIG_H #define SMS_NTSC_CONFIG_H /* Format of source & output pixels (RGB555 or RGB565 only) */ #ifdef USE_15BPP_RENDERING #define SMS_NTSC_IN_FORMAT SMS_NTSC_RGB15 #define SMS_NTSC_OUT_DEPTH 15 #else #define SMS_NTSC_IN_FORMAT SMS_NTSC_RGB16 #define SMS_NTSC_OUT_DEPTH 16 #endif /* Original CRAM format (not used) */ /* #define SMS_NTSC_IN_FORMAT SMS_NTSC_BGR12 */ /* The following affect the built-in blitter only; a custom blitter can handle things however it wants. */ /* Type of input pixel values (fixed to 16-bit)*/ #define SMS_NTSC_IN_T unsigned short /* Each raw pixel input value is passed through this. You might want to mask the pixel index if you use the high bits as flags, etc. */ #define SMS_NTSC_ADJ_IN( in ) in /* For each pixel, this is the basic operation: output_color = SMS_NTSC_ADJ_IN( SMS_NTSC_IN_T ) */ #endif gcw0/opk-data/SMS.png000664 001750 001750 00000067553 12702465756 015450 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATx}ٖ8,kDv՜3=3ՙJ(=/)֤1zTZJkvJlÎVwn x<nVh$vnhϠNn7Ƹ^Rƌ'Ő| rpfXEF oI:cx<&|o[wQcM .Zk~lw7hrQB&C ްT 3CfFQ*a>yq9/:gגn2 D~?Nt=`ӧv:~<[f׭=Gƨljvs.fp8~/n;})>ۡrGN@{?FrMՎꎷ>l`}ZwU232cu:27 kV8<O㵋(x<+*6<V!3Ɓqk \E<~1^.oljkckGPG/z$ѯ ~Z6PG@L›āhW'5K'!V4 mzTfy\E{pB־Ib_{4Nkiyckl *f3,eL󻤷^vP]%~~8aDӕLkC H<3%O^-C"n|<њ lA/, _j\7yݖ_Zb66Ƹ^mڳ{z{nmQ4`G>WO C>M8L@nrTmj6V$[uXr"w`^p81.K v;6LX;J Z5Xd;zX͢ZضH8ѢWhIa0 h/yRγ-ɹSdiFKX26 *څy X'ĵhmI=fVuZav<FNڰe rD(hrm PnFkz% 3Behx6:JC+=o%RU thkg~E{ 2u*Bthz7\o ⳛgPYݮ~n 6\z)A0xs<On6t8tPړVcBR 3|N'Ϗ1x{f!sLcMmng Ds3&KNrj7,zDZN՞*jH;sahgG_}\[=NFFk=vxgvhOh?5Y{4vCGh-ho(V\+~GVcŨ|q*t|< 1XmWC#I=ҥi_b4vك;E!IDk~lZ/}6rDާ/3鄏gd &hlU{={[ q|VOGدyai}rtLH*Xg,\`]y6JHtepOJ۴̈́S+ !n­7WeʭP<576R% ЋVe"fPg4}XR&Um6 ^!!ݲI0{ʘm-"en d!|A47V7ű|Śu 3Ȥ iVO//F=0bcռb 2e I X4ɻe2k-zD6Oڒ4aZaPl-Xqh۲jeG_!S\v  /)iI[饳k mu2AEU)fj_,A̭sm1#wuAY^33uޞ=?.ݲ%«SY ȸ-=&ST[6Ŏ1׫>o`S_)imdIvdH+7A@s x([vyҥO y!ؾod#,6(rvwHwOA8GAn$r؃Rw-*|S̑9ChYzHTۛ*,HݰeUx~w0jx|{{䣄 +eO=b]ϙ&tzD+ƽ@׳ōt:CҞ_x- K,/؞RŽ"tflziriidybRd!hSۖ\w#ceo2ݶ0z{k1Ʋ-VS֚ hrQp8|j/o[q"a 2M*{z~de&+rﰍkSPχ =w]G]׫r _|}Ί%foQGzQgϷ0rο*nLȊ|k_ud@w5zۡ/֯ 7p<'m៝ t ' Yiצ> n%nߤ`Z~CYx] ldsu^E]Pjj=Jk'_W/ۏ=gg/:Oh-ƚzJ5`;Q)2σu3H^V 2a$IgVwL{"mqVВ5 +ڿDJTN۷17Lrk 3t1mj6K3I)r`j~PߢoBƍ֎il\vpRGY uFꊿ<?~_5QGT*T%:K#G amp fy3ѕrlXau  bzVN|C's* nN(&حwe\ȉĆ5i8χ~ǏsײӬ"JE~kȬ к(XWQ5l\{l>t},erT|IBكV֐ᵺ>B3ț9]=[o߾~~ֽ?J)yaM!nT9:d婒{߾,xNze6{m٠]).b\uOi.AB/*bS}h _>ư}`Nn}aJk%aZbzZJ_řŚ+XSJm24Ȼ۷o6ۙqЅ*ocyhfܳ9'9n=4Ƅ3o)4t](*F';azO\.gD5kjw؃l$X˹mIԶ~9/W'+ 6Z:?w9Z-1D 4lUf-of`ۄ/B u?怮Suz(۷7;JZ :d8 ^(}Y7qOŀcj\:Ve1lyyiHk+r[9p_𙡆 Ai!**Q/1Q)Dr¯jk߁ê)A@~ɰ2T~aQҼp:lBS1oOAvحߟ~jx<x{{'u*)3i$a #':ÑfDq:"ӑst|itx,ܢph~ng_rp3{hF4_PT,:R!*yA\1Kiku١lшPnmII٤H}J՗v@WfӍ߿c3;َ.9pA['0,xKubtЃ0v1e網լ;>>PWqθ2 ~_XcSe҆BU4C!-lv.O?2p[4 MWճ}3ph04pj0|zn Z)\آ n`he>L?|>58; Nܓgk`53֚qG>t}^sd,!VY.Jq/LlPZMTBgр˼dHgNz{{|Qԃ-%dKi 就]ϰf%[|eH:G-hQMɵa$j紁bR #9L:PE&#k d8$1Jc/Ùmx9!^l2J:Y pw5<ygVB&PnWaښO"+'wOD@P##HeN k{(_ik[Xe"|؏2#NNV%Eu[e+e5-eCP0 6aoCF qY),46xjϐ$P}I3=$mm|PzLBB]ŭ fUe`;1c11|<v;`¬h[J,5DM;fCc{K_=x 42\kud;͐W JXv;GA3&%ѻ|^+~>( bf!&ʟ|lM,Q8BɆFr,(!}>oc9NfSd/Bq[kBgl".mEɤֺyZi_R -8k>$okwȍ}lVZAEoHp !pxHKІ.^5Z:slNeઈh8 ;]Vp C4"ʉ4]k\-[$퓜2d`(Q #w-̗}Ϸ`|3Q0@4*I?]X=Uh_X|(y: _u W2;h<ԷoI$ Z[s71)\@ӝ/HᵙLJXKqh[Y=tژݬ =gB$RK (N61x+4|`!4~2"$hȐ0&~SBcF@Û0~Be~eZOlQ%YfK,RR"WzZ&CPږO]1P`t+z,IЊ*]aĺoMV]!ƗKfU tO5pCf_UHl+O 5ZEO"@7_ۺb_c7L{MCd`DWG%Vv_U !:z8 UF( Ed y" P㤚6DyJSt,ۥe8\.Gh\X#*]f#ʢ V? 3o@׊AE',\̳%YS*tq, eį/O D&{g}yY,J)5VB(4'uƑ%>a:U l(r4a[{*C@:m5&~a 8z F+âچ:R<9V[fz2r[!䬲Mt.BC Ǵqk 6R$)쬍U!B> ߜ:8c=KJId&0z@2ci|k XPXrqX掽q'9fweae+ A:ցBQb =|Ӟ9)ږH?Hf7n 5 lڋHWv ,,IP'ݥPx R{-#fl)@˕-/Jz@-|UKUlB> >851$$}t"mI-}rofu^Y=Ez*ՙㄺơ'J[w\zwX$`d}:}mi5j jCt4&txg(%թG(>eA6чAD)eiZgU QŞbHEBҮv!u"RX^tfr573TUn_K|ٟ $.k-qJRPzE<)FU4vT߷ѻJ !{|Α2/L(|^ѝpT lOBfZs!C3h-0 ҙv֗B^ ?P(dfT ]*aV&kN1- 䌩k z#dx>LI_۷ܗ]cɩ?8̊ :G$3kw'CD9 o!JMX7 )ni9P6go5r- h?+Ŀ6̆Ui:ARMN8Ćg,Ďﲅ$DUZg@=J[Q(tԼ<+SMGa4(.afVӣ`L@Ȅ_jHO~w6-7ܞx;f(i}JR ېveE\ ALjD]y0Psa-~mr,/G W6QjnG!9E$1@bdJ1?Hr3>ؽTMME (s8@Df!c.@rմ!罎Fp,(!e8+unE=BP3mdhn 8jMטz IDAT5.1~x VWMpla[=cտ’2dJNՐ xq|>JEBIs:a⒣q^mE&C >B Z_N^)E4 ^tACSP!(jIOtKjpSA>G;TbB?@4Y$~_.8q* SXRnv;dOnmxƍ0}Gro΄kwf]]*Xڴem_hizN`26] UfkmǶdx}K!!Znt:{Ț"`@a€U'XD1n }~Yvj(Ul>}kn=E@/P5+-jT#E1V)RH|1|[BnjfLG???IB< X' 2g?y^5$F)J1Ch+&檥24תET(cyO,,;f;m ΅X6֓C{t.tX Ay\vnrDRJ&6P P#5CP9G h^Xa^']iS$=ڢץE'TT0I15Ye) XI^c-$,{4(<‹kt%޻H!U!O  U K&n/9X&oA)_x*m}' 5DÅL( !d;KFF.Ǎb{Hjm_'$AX!dҋ}:@Lh-\[imƇe,Ѿ AۄŏiE4$%!VF2ڕcR[xjjTP D Bs~~.0.Zey,ISshsud^dx0-^M~:l" Uc:K jB 4ώ8N~+1QRV! 3 _7SB袯1na֌4qbp%h0J\]s @~D14U~,d8pX-[| B6)@dA*qFhjZ^n"dR吐HI::/)xןV>`3cKV rwW֩BR%ڳ Lc*{}\'Fc#OSQ3WٳmJXRW<-W:B_ P5'DC5(TN6XO 2kQdxhZxÌK6`3n$◩NVQvIc`^!1!-:IK ?MB|<,a,ȴpĮ⢉1+j/!6kTX$/&X)gpd)A:^u>.jqM~8|wg'^6,%)Pn=+&3K|kӐ y&q$I2 ͲQo})a6@3F b0بjG2]W8 e?tHPWcڽGkț6:Lm@QiBfCDξ˼a7mXg5Pa]`'`J=xf䐟 ։Ff> gwb9ˉ4Ѳ$bG_樨IrUuq$Ci?ɱb7)~ Tx _&2&Sw(ɴTph3 vA>U|]GS[-fE2sl5EZ7؄5Fw3K,klR l[ˆv g!z~~~^W{M %^D!3N^.\XډUx^[I4a%Y*ReFiᗭFQ'$->!ŽXWb)}"-B: 2!I)fbP[u39|7d[Y)6v^Ct'C' .4kKj nR=d@Idaa ]lv/L |h ֶlX[*bpi8YG g: G-%Ńq&Ѥ$"D-GlWЛ چoe}X>="͊>CKD@ . x, آ%>-Q*ƤQ𑁡k`3RIz0Ƹ\.w[nI6":_.6=ai.ȣjТ)*Yty*O)Xzmwhɳ3eQTWnśJhHw<:ⲧsaAO[M']qt@5{ sջ0G!g|pC 6&YPg)zQw!ǡѾ@c/xN`c8 ϛ>e6{C,dp5Tׅf3~!cFBϺqDT(jjR@|6XYsų&8nZ_ur|x6Siu@T[Hv= D AD ?yț$B;%POϣS`ATJȍޚ? ؆89]4cd%y&BT/Y`E.Xp5VbރTIr\.c9V;መA[>!/r<\u֒\U>r*w&nZrF -fРah݄I:*mJ;3L!t 4_ᗈ/≒zj֦848kY8 ZFaKo)\suAqa:`G0f_q嵢f_5.jB_/6A%.սbg/|> f;x2 J1ƶ`"VSQ:^ EC|7I|MBZH_N(yҽQVڙ(Tn]{{eEq5,9>Jju%xV-BDiRCCM7 g ̫:.5ASL|B.yHbHL1m]Úe5rv̹/$0I35V$\\57HP "J|_ՃjSgHMRcMBKZ6c|>mU\-Bq?هR[`h3c~AVV_(0Q$BJW)VsLָ#m2 &d,gۇn>'^4`I|ƀ,h*3/Qu픏EfSB@ (?9fg Gcpz(ivhF>k&w >%Tװl HmbJ@n?ˢ gkTTvtGCƢ6f5+03!"èNia% 4n;{.Ҿ-jz=FRElbázqUE!G t\_uL2qUꐖ*4 w Ŕ0P2Qp *O=S@BIh̘ӌҶR< *ۛ'bSx-z-FaX;(%F?v^#>èH6}*@)3IjäcBgGP?(lZ .󍤓ŧ Y!))ԑ7e0K蹨sڒ Ej:fA D`>߃sqUaywou֥(,|BPhZѕÛf <#2]lb ѵkpԴÞUmrC B>^NE7d6#Jj@F%QOBVCew2}pܗg ʾDB2h5! fdRlZ`X\a[3@#$9gthU^`k}fQY4heS`Rg4?W\m͖K,NjZu߰\)\bA3oBz|3r /D@0Y LtDlO$j{*Cjg9)sE;רN,j[dNAExW /lF'$P3V]XN+mckSۛucC9f-">Bhk2Q C5h>Gfw 4C!EL4E匛Ngp E 3E$q!"*RP}pTRPf(%>#BsAn1q0t—^m-n9;i 9#dlͲq 3[_WF1ɝp ǟ-vܐ+ 2|Lݐ >uW9M BWGfzaKh΄>+K[Rjމ̸;c3XE1VM-d(zeK:M͘n;/!,a(pkI+Ιɦ S5Yߧ͌Ѽ&s|wxK3Ǵno(gBPdjA,kJܦ נ*p*96~GcOFBnJ_5w3՘?Uj܄nLt5m[&s2`\YSfPng dY4&ǙimB32;腞QAMZ R^g*&fm2LsBsPhMf$~iMbHcB O$):f0օ5^ Uf j1 1$ڢ [ =mf{+Zgxy`qS׽Afqf q 5<EkȈl, O1VGG-[ޯ'7˰6{Z9tZ;xpx4j.Ф_s{ayd(x#ILpQK 4 0l C,+AS' }/ 5#ImkIЁ0 W{1J{v WrQ}X 4 ; fh*:RPMԱF565!)XZ4!>dZJ C$LlB*[)#\GqXNI"4aJZH < NUȗ烰*fyviroooY DgQ 5xAVdT1*J[wFiOseQ- ʄpPm$HE%Rtp٠sPdliQ.~%;\ٙhzZT3jCt?*$ik"{Ha0iiX )-վa6Om @P6J /dւ( ^E`⠷ l\_J1p 1C (Kю2eS5 ooҺ` +3`7l!\]xNm'35'ik?hzދ] ۼ43RGo3Lin=P{0ehփ`3G2c +q QYC(Ly%Ƈ{Mx䌘"7Zg`E~n/%PVЌŖ5k BRYh5CRf@IGJ:0f[>VĺZit0B}+HE<**T#|2ɜ5Xyd"FAa0,gcd~ ƌBhl@zuY GG/k&*C|ȴ"LM-oRв^=mmm[5d!Y [(MujMܛGUGAsjLQHH_JIm,_;O5D2SPv_ !#2"r^hVS~WQHTptsJB&rw#.#K([ Dμ`~jm6V6J^!22!( Y}wDXH;@]!l8BQ2EC Y6ѼI#b])H& Ɛuu )sXih&NyaGE]jzjWK!? M&QR$3g԰WF{Q$خ=8jVDZu8մ&^W(JP= C:GkB[Q"%YI7JQB+dWe2TVj [ |Q^3_(y4z4͙,hgFjeZ'Df2P+( *qƝiˌǺVVZY:3馽R2ꗁb\.\c5N=pס^A768PzCaI2oژb Ai42Iy%G8֢lhTb0êL0V^x匀0sk0(Ԍuݽ>zT |eys8?d"6//(gr9܂-ϒfPnMQ׷=U*ye>R65OCIH)$Cwoa} IDAT/)/^ Y@CL¯8:u'PbgUsV$Eg^;"uM峜^Ä$ްo:(_CӠ,)l`^(}y6ҩUACt5"rA-2d:m vt=ddQl[!L 2RV8# }vO+݊fuD)QL6tIӱb83`?)%_ڽP?S趤ݡEgR&BMJ4ܤf5s9<nrfA A~BK9NzR tPE0$  j~KK)bÔFoRU <8%&«HSֺo!&'7Y/v{8,L}x\.4kZLj[!f6_F8Etjesf<]sݯcy] p-"3b@W$W݌HMcR󰌦;ƸnNoh̦e~z Eb>SiQ@6ڋ]H0,r Ɗ{SKeٽ,u+”IYVs ΂pFwzz}i`D6-dHM&rPʯZ͚Q4ltx;oԱ-m\cPA#2 QĐqaM U }o~?5F~2cz)G'K (S5=$̓0Y1WlXmKT\$>= ՘p(TtqpKztWW06qxLb#]ʪ~-"mwzx8ǣjxFO0X@TO>#F;frU&tC-}W}/K|>_ϟ?-s6ȏ֫,I60k5(z1آ!Z@.W! W^3 dΏʌ؈6M\ {H* ?8, g13&J]7ÌЬr?^.r>eq܌}L&2 KҥGgC͔yՎ+T#(J=!-E$(ۛjw)hQ$i2*t+lo?ϖ-[b|~q\>??rnNĽd]!?3< ISgL-.MsZdykmoӨ?6iP+&M֚M5mE<{ fn9w X6n77Z֛,dCH+H) H8[o]3dF'n{j "M2ɑ{tNcYƕ5}<w?q|(z>????>>vvfj Yһ aNgȽ hF4bt}-gp2D-򌓌Â> rpeû!=8}zҚy+O~l_f^i-q80]3{ K~yޒ'e 8I APŽGS، aVkn>"رc勆j{:>>>~۷?{k{׿987FzhM2* KgamQ4ѫ4ݰd )`jQdϺ?+dQ)Ob82jḔ9{/hOw>>>rv߿wCGE, c7󱽍(bRYE[aBe3~7-S] !p޷K7 b}ۤW E 5 tit<|lw#@Ynl;-;ݡ8ic}#iQ !d-TS0 D`qRd<__e2 R(~ֶObIlBokYREXxMQlOlCZMaVp%ܑ_4Hl!<ʼnJ{2+.ku߬)pL'溨*m2P4hHvs`3LcŪ1oU~o*zv`$>mKjz3@=a ²\hYG{[xDj2T/Cw[ķ‡KiİɛBwJBH=8!FC@j>Br[Ԣ<~le %hywt0|y7u\RƆj4c~ٙ2W%ϖYYz ˵h^,\d$hNQNjJ(Sc9x<-YFB͆#XA}c?inHplnkD;zxAnl6Iᇲ ehu0~Su| (ݾLIƤQcZš%Ba[k> fi3bC\xkzcU/~MsZm~cY{C44࠘f W>(d+;lPOQm)/}r8O3 aA cUBlUi能:nա՚hM_|:dHfLho`ksh0TY-*dZ(eK !Q5(YAC46a!+MSF)© $@e]MaRBlA<,eC"!&tK(,ݼv/Aqb/)W\A4yFFf~pCbBHߔSh,| =3B?ׄX/8\1d7˼ע Lh8mqE // 4ژym/"w˫0(Őiv)tj,\gzjS=5? GcNz3EHy[P9BzkhkVl _ɺGL&50ͻvdv} Ig FzYO*̉4 cb VԜ % 2%fHb/R"z(//sm| FM(¿ր %3a[;fXַ, cbiߥ_ΔPexp.q֕X8KLn o` B!rq +[ej Hcwpt9E#s̟ mIg}tx)وJ4ZSsQqDɏdpe JqWM »5"AZ4~G{)| r4.vGeU񼁯+![Hn "0buA%`٠ *CμuHf؈YV M 9UG-vF/iUCǾ56k6Lhk*?lΌKҘ5jf+!EQA^%ۯu.Ԗ!BzJM7PAݳáomby5 ^,:G)#t䑎2d#3V!“QH 0 /,MamHmĒ}r䵥ON_ykif:WC |Ab[NP~p/4(ZZ7q0wGxC:s[+ߦE%'ʴ88gMcnf_7SR%*5҄t-Gd ˀ_W[ J0ikľ\2!لs?~s{a?ׄ^<`hÈs7A␩)ĝ{df(~Mץy4 6vk,=nCTe4 + Lɳ7۫nᅬ84B UB g`7b 8D r 7`2|Zd]j}l@YE,,x  fn}ey:gvxO=}4ĹEk /ۚč.ׇ9<-k(0ĿhrQa_ 'cnb2€3ZE,,N-ri(B ԡϮsBkC;WlxF 0Ez{{||`(fѫԄlzl 6جbQ\JX!7 5%ea8kh*2hQ >|kB+[-bQnh1#XwXֱڐ짠jk"2Gvqnl}vݮv\:l}H.SȑaӜ $d&ʲNၨ#nFFa/ Ȉ&]5Pvf *bHR!oU(vWmv"+>[E{ś\.{r|||ءmؑTYq#-w ړiTbFh'a&]Զ2\F&I.[d2Ho[X/3Hnң@\pHqᛶuA.Əq)n[F}:12>??vSEVx}M&R]NfϦ9_E [e?sδu%[jإ+Vv$CJ2̞\rtk#=މr[/"k a(-a-CcZc3c_R zsC*^RLuBpٶR:tP:I- ՘rFKw zBeڪ_j1Џ,Ƴ[c9Pk44*bF|_@w>S[WbnnG ۏ?aMu>"'Mad)]RBCҰta9:  9!nDWjVeOlfD%:j[&BDʞu %\ܩ0Ki۝-1,%V p{H./]M&ERqSeI験C:+AÁll D)_o/Z_P2c4xTGdo&lTleՠzg{kmx؇ GhSc+epB:}~Ќ^]Q""%D3XAC}CD- [m`Ԁ.t:QЉ3_Dڿ3$g "-l/iuTPā*[k*f08rIZȃ2 wDiYK,X-: Zϳ:2<=F.X'ӷ*/ÎJ5a}V*JE%xIDATW+*QޥaZt.ůCq}ѯ*8VA>B$|| B&Z}!l26B6w1n} ^m*$i +2E_H'O7gm&~NfI g` 'Kɬ"lɍv2(7{HDŋ'4_00_UGAd bdkDZtCMEZhchtsZqՖ91Y,B=$_/jl+ _Xi5,i~Zn"/^-eE$]_Skbj S%4rύ3#L5[dH 66HڦKy}zCZpR>!r ԋRMpӶ3+DR$+V[jjG l 6r}9:q LPX!mԞ8:l{93.&E#6m2אI,{{5}m-I=?CfDP= c [lLNBA(4&4@25ȘG!>[w]2XzL&!9TfQ 1jnR$:mmKzCz_u5LjN$To~] PL|ua˺/$AM";֙ʕ4m$d ]H;aq=nh$S\q[nE=I/:l|bik 7r-|u "GUfE^!Dxb"P4T 5mbȒnKL7l*A2%>gs4Hb}.dkM֢@U-2!-IgtB I)!urR^Ai >jKQfR 2#T[}ybJ" ʯ=3urhsmmrDsH "{ѵc7.l2# R:SkB*29lhM멯R֨)Ph5}Ge7 "v UMAyMUhzP`m4ݬִLF5i t. uhI\`ےŷud#տT;;!9RuP{!]"f&zBF^[nڌ!קI9اL4dNG+3K $\1΅K]E%yCD:O]# Em bZWfzeDMQt@hw2ꀴ1⤾'۠Q@wіT]/!#_r6 ۭVtqaM3Sh|+b.BI&O)_6 F&NWfaU3RwCHN6dɒ׊[f;Oԡ[_} w)B(h.P0]za>1w+#J l] Vh[{;Swz2;b}Mf6bl ndutW9@fg9bkdso#iyrԱ>dD[:JMd@TLZ]1tݬe3Cd[g6OFX}SoDBˣZ((MP}AG8ƙom";Bة&S'~]; ⱜC_,,E`r 0cX>AzMG إU-fʳf~La QEuV~6; N-6ġt(:>!X!ƪm'#Y!ކAKvi^X6>M(aq3w rX?)"!h/4̢ږfJjjyF~4`DfD .lCf pإ>-NQnpB(!ӊec{?WS2OV(!!43rpCӅ֫_%5C E "),ať=j&V\hyhuѐP6&P\z B9ʉ(jI A[B/;(/|6Bf!K,BR_F{V"I9!!#YX6cQjƎt.ZMP}uBZt&JkӴԎUj 0BYrdFZf :ƪ(t@XjtZv ݓOgom3hmmлѶle׌)Bt3GYgba̺ 륖7RST@GDb[ZԅJo,ټf Š ʄ/VkPPO D\t z< OnDZlQx =`seI)~Җ6M= M[fŖƴ@U-e@0Z8hiA@k&$HAdSX2j[#x\dR{娶Z!w&C:>4mE2H؋̩bGl3AfQ;$Njcw1mf:J1:j[p8\X:붘#⦺]B354Cr&1vCCe/lՊG(m/b)P 5ߕ8,a#6o8?5fF (V$ sh!e3t恷U( Ņ` @Lfcz%BMhAپ Q$LCtC1O bC/XḘ?BӚ90 }izH;Mwӗoڀz^KO5׶pza w@a.bwPM "OG~UgbtN+,BÂZNQs I*/q83MȀo[[`:^gd5R{j?BG'Lp!SĿ*r$ 9bXBRK5,C8l7ͼjP bKɂXVn]G)&qq\qzi9pց%G!׮d]ꉴK_RB WX2'2'ZBӻ[L YywdG &;۶36trvIENDB`gx/images/Option_ctrl.png000664 001750 001750 00000030027 12702465756 016607 0ustar00sergiosergio000000 000000 PNG  IHDRX\r"sBIT|d pHYs  ~tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$ IDATx}yThyV@D0s13DbLbthDM1N1SĠDAyi葞!͏˽ZX:uWBhE@9p2uTl6dZr0L$k _H0 xyy9!>>>Jҗ0 B%˗L&.BFY$f̘`0Vյ ðbiJJeذa$P?}ׯbOppp4AcJKKVgcc#l6#(M0#BcFjqAi(4EhRշL6' X,?xE=Y__xZ , !VkY =l61 FՅ1Li>)r6662 ðȲ(3̝;g̙3s0ԍJ?\cbbfhkkzGiiib񴠠 266~ԩ5|>ϯ`hOV#vX, vFÐH$BAl?V Mb(&ir88uuu9$TSS3~ b~044ի***8m4FFFFGG`Hz̜S^^ l6ϝ;wK/tdY&EEE>z>H(  +Wvtt8.6 v ]{6ii]JJJVL&ϝI&)̛7z9rD( dTTTillD[o@$E0QXX\\\׷,///6ml:Ah>>>,gT* '( 6v0uAvyyy)z}gBBBcTTdee(//w5 @l6ł[TT%ggo_2; noo~̙9mmmkjjͭ͛7ǧ`IXqqq`^^ިHZ=$Ij`00( P?nA0Z@ Baĉ+L&n2؅aF1@.vweپشi WWܵk춶uEsMK/|+Wr9* 55UBOTWWϐd(;,o2>pA6nEQ@$X,FggJ/3lϿ_UU5}B3fLa vwݻw5¢v~ׯ[nzGG/"hoddaaawuvΜ97Ν{df'$$\3L&EíV+A$Blj}Ns[t&\\]]ŏ~G7333V+X,`2a`KĀ'bbb</ðnͶ //o-//А&LÆ {0&B绻+ɳ>5k6Tl6jر/k}wԄ}>lIO6 4 o2n86mZZf<@ ;~/L&@Q}LA0 ~ox{{a$!!a¥KN(3gŋgO5|gO/ |>,ZhæM>.,,{lllիS{{{}/\p(??_0a„ݻwo5j믿oٲTQQQUkL<[.)ǁb;w@$ŤlKJJL mÆ [M&ߴ}( & \.p\``6qHJJx\.2{lѣo$IeggTv]uuuieeeIooړ۷ogO~l6òe˲,Yg}ܹsKNN߲e˗/?qqV HtEANZvڌe˖)f̘hȑF02L}ʕ ,8p$+} $ AAAډ'z֭WA$ Ӄ}j$ FFF3Lpuu%K4}g[o --W_m...~qׯwtt>//<~/kii QA&`0EQ;X@f0KJJnݚRx<|hiiSL644AQ,}7Effꦦ&S]],AAX,@$ܵL& O,++i__,.J;::'|tTTT``'UTTze2?YfO >yYYYO( 1ci[^J5  MiiipB3I@ `lKd2 1ck4.jE 芏777[;;;cD,ff٦o.--=o'P5 Bswww@׬YV]]AX,?ۻ np@# J'xBo3zhkk uԨQ*++u7BBBn!MMMoաx$!!lٲ:a0n[J%(j jzL&]q$I.(biFT*"???$==])i:Q~"4m(# /vAip8V8rS#Gtؕ:PxΝ;W^EsAW?EQ0 ~=z++*ISϟU___2ŋBM6lX>{zzxgϞ955m6 bpţd2-@zzzj 555(JID  kJm6ς BQ>H$?^e0쥥+F#4Mkj1b9rHn#\ ooo1[,f[[93\L&c``gPUUDVV3g~39@pMMĊYv0 6],{T*QEe2ӝ;wN3I$I `6L M(l4cǎM K0 v;}m&Icu^^^JBF$%%Um۶r9Cww7C*2h>OXⷘ.m۶͢i:>r|||,naƍ;`d`k/v ,J+***p. L&,K>|>JJJg̘!?AA!aؚhF0 mZ\5@B8III ƍc?~ q@Qc?ynɓ U]v͵.4##c_NNfYRIIFXI4Zk-|駇322.8;;}_`0jEZl???մi6%''|^__r``%/.W0EpGs8/njc\.{۶m[b{ٳ <<ŋ"Nzd2Q<<<BI$IR$I \GZmT{{;84MCaaa 6XCV+9r~am۞[x`a6l6> l~ꩧ~o޼y_qqqn#FO: .$9Lɣ(СC/=3qqq'\잴pw ?K~\TTxϞ= |:kr9)]ȩ?USSJc`B zC$,+fN&IZ[[|͋gϞK$5c0@QO{w|^l*,,l(D"Q(G={@֭[\v\|>P &\}7vww຺&$$>{;aE^0-< AfFzr8gہiKXKK qx%%%PT-סnT[[={vN t…b`~n|ժU{ ]v-Z׃t:4iRoTT+3jjjRFh4b{ȑ#?uvvn?Vp 8A GQ4? ̃@$D"z֬Y%eee4MG2AEwww9:jҹs)))ۧ; Ǐ~رsn(Z1 ]АX]] @ R aaa̙3V\N~`4 W^YvΝZ6ڵk&M{?,Zd/@̃讀ڪUFK$`'i`08ߗd2˵f*''睾>݈EQp-͛7gj:!55u+o۶Hyyx3wENNN222f͝;W\\\-55u{'OBC'8d2rWMگ4ݠR^M4ikp#  `0@ss3455A{{;+pYT*D0k֬s~7n,X,82 xgofnܸdnnD,//bΝ;N8Z~:~={>Z6! Fb B,z{{El6[QIIpF3BTH|#:}0 ^: 11ĦMx_4<*@R b񄯿ХK~qW233 UTTLH$Pj5p87oޡ˗8t7׮]e0#cbbF_B+W7n\};%MMM(x=xo0@׃$$$X-|ĉK:l6ZC%<AhQ8ye0z_+gZ[[d2χԃ0Ç??sŷnz`0#Wq IH{yy)EpBڃdhr{ikkF$)PTj(0L`6l6#ch4+5|f…O>fVV*> #}}}`2bw8@:A  |&o!ɪ\@ 'I $ V6t:  ::zb9 3g~FOOOP GO0 L&d2m۶/̠Y!ITd8R<<F#ܼysVر0,/x_IDAT'tIZ6đ n8hZϯZTJJJΝ;WTTTlvst?x ijj ۺukiIIA##;f-8887 ƍKw &Mbl6+ٳ'vBnf'''pwwE8`0fsODDfL&SM42Lncc#`08|/HXf d2px&  445kv;o hjjGPFQ`ӧ7-???ԩSZ[[ܹsHǺ[HOO?8bdeeڿ"l@4vOW 6nDGGN:Ud:ZVVƮ///1bZF 8;;kY,V{\.O(:F\T*#""L"fI hݎ`F \waP("{IwiR*!f9JP(0 J\nwm```CZZZ \RD~W׎HR;6nܸlĉG!77w'|A|c.|P(4p8^??? Vp(YTrd2j/w épvvn:uj3Mu,Kr~~~vbbR _,/)) 7ƶdCZP3 E`` EQ(T"8 aQ8l APeZSeM`0X{ԩSO$ x;DpzF??? Q&&&wvv6M2hUUl6s4X$JA*P(&wm7Af@pp0+])Jcwqɓ~"h -a &,, $...fΜEQTq(HUU O♵V;H9h@ SO=˫E0(m6՚P(Z6t{{{A @JJnܸqߥo(PZZZ#W^ c0<Cb1#BNNN0eʔ+V]jxx;}}}J]V#1|^I'''祧@-Çgr!$$6<<Œ' zzzvxVz~yW3>{Y,۷oI\-Pٌb8fWEnL&h 9e- ABBB&ܹsIkk\)J1ł*uJ о1cO {EL6K}p>RpHdwuuǗZ*r|ʷ~;Q"q^RqD"yѢE&V] &ƎdkڀZrI&U5_XniiY{w***ID"NNN^ v:xܹVn[׮]1(((3333n_EEҵo߾Y 9y־gyFdaAE(f.\pǷ~9f{T^甔w Cw]t)dVnÆ 2bLe˖=c&L7oޗr`5((hٽbHnhhhhhpOMMm AQ]Rl޼yoVVVb„ 'bbnݺСC%6F#RDCCh˖-7nFafvjjꍑ#GgddO:'!! Ay@TP<Ə_$Ν{oN0a?EQƯpFFFHBBB˰aî777O>w\ڿ~iU*: w}wm~~褤Z֟ J (`VTTO4)^HTiNNN/-99y /S~E/Q V4BQĽ(`0 =rrrB GA H \wvv>[SS3fX\t_d2aNNN+|6mڴbFè djiZm8>%Y__(0 ) $ 4o~#K,Y?a„e˖K.--//\m#8qbbvؑB.JKJJ/R~?JLpʕYYYcܴ+Vʦ(۲eO:|S0sjBf{#Fc>u|\x<^3U^^|֭U+WĿWjkkcnADqrJJQQQ"RoذAbŊ<.Zؽ/=,ً2e7nDx? 4899mرcާ~z߯;w?N!֭E$]suuhllݎKPPdٌP尉4Mӈfvz{SRRsǎ{O8l͚5GEEwgjҥW4mt^xQgdd3 |}}ɖj2O~<,,?Bg̙3gmVVxTuww'cbb@駟v>|ny~p(l{[V\\\T}}}k.::fy5u||/|>?d2y$$$X = |bQb_ ijrPJJ-44o%&&n铓#WIENDB`core/cd_hw/cdd.c000664 001750 001750 00000160014 12702465756 014634 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD drive processor & CD-DA fader * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #define SUPPORTED_EXT 20 #else #define SUPPORTED_EXT 10 #endif /* CD blocks scanning speed */ #define CD_SCAN_SPEED 30 /* CD tracks type (CD-DA by default) */ #define TYPE_CDROM 0x01 /* BCD conversion lookup tables */ static const uint8 lut_BCD_8[100] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, }; static const uint16 lut_BCD_16[100] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x0606, 0x0607, 0x0608, 0x0609, 0x0700, 0x0701, 0x0702, 0x0703, 0x0704, 0x0705, 0x0706, 0x0707, 0x0708, 0x0709, 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, 0x0900, 0x0901, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x0907, 0x0908, 0x0909, }; /* pre-build TOC */ static const uint16 toc_snatcher[21] = { 56014, 495, 10120, 20555, 1580, 5417, 12502, 16090, 6553, 9681, 8148, 20228, 8622, 6142, 5858, 1287, 7424, 3535, 31697, 2485, 31380 }; static const uint16 toc_lunar[52] = { 5422, 1057, 7932, 5401, 6380, 6592, 5862, 5937, 5478, 5870, 6673, 6613, 6429, 4996, 4977, 5657, 3720, 5892, 3140, 3263, 6351, 5187, 3249, 1464, 1596, 1750, 1751, 6599, 4578, 5205, 1550, 1827, 2328, 1346, 1569, 1613, 7199, 4928, 1656, 2549, 1875, 3901, 1850, 2399, 2028, 1724, 4889, 14551, 1184, 2132, 685, 3167 }; static const uint32 toc_shadow[15] = { 10226, 70054, 11100, 12532, 12444, 11923, 10059, 10167, 10138, 13792, 11637, 2547, 2521, 3856, 900 }; static const uint32 toc_dungeon[13] = { 2250, 22950, 16350, 24900, 13875, 19950, 13800, 15375, 17400, 17100, 3325, 6825, 25275 }; static const uint32 toc_ffight[26] = { 11994, 9742, 10136, 9685, 9553, 14588, 9430, 8721, 9975, 9764, 9704, 12796, 585, 754, 951, 624, 9047, 1068, 817, 9191, 1024, 14562, 10320, 8627, 3795, 3047 }; static const uint32 toc_ffightj[29] = { 11994, 9752, 10119, 9690, 9567, 14575, 9431, 8731, 9965, 9763, 9716, 12791, 579, 751, 958, 630, 9050, 1052, 825, 9193, 1026, 14553, 9834, 10542, 1699, 1792, 1781, 3783, 3052 }; /* supported WAVE file header (16-bit stereo samples @44.1kHz) */ static const unsigned char waveHeader[32] = { 0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20,0x10,0x00,0x00,0x00,0x01,0x00,0x02,0x00, 0x44,0xac,0x00,0x00,0x10,0xb1,0x02,0x00,0x04,0x00,0x10,0x00,0x64,0x61,0x74,0x61 }; /* supported WAVE file extensions */ static const char extensions[SUPPORTED_EXT][16] = { #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) "%02d.ogg", " %02d.ogg", "-%02d.ogg", "_%02d.ogg", " - %02d.ogg", "%d.ogg", " %d.ogg", "-%d.ogg", "_%d.ogg", " - %d.ogg", #endif "%02d.wav", " %02d.wav", "-%02d.wav", "_%02d.wav", " - %02d.wav", "%d.wav", " %d.wav", "-%d.wav", "_%d.wav", " - %d.wav" }; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES static void ogg_free(int i) { /* clear OGG file descriptor to prevent file from being closed */ cdd.toc.tracks[i].vf.datasource = NULL; /* close VORBIS file structure */ ov_clear(&cdd.toc.tracks[i].vf); /* indicates that the track is a seekable VORBIS file */ cdd.toc.tracks[i].vf.seekable = 1; /* reset file reading position */ fseek(cdd.toc.tracks[i].fd, 0, SEEK_SET); } #endif #endif void cdd_init(int samplerate) { /* CD-DA is running by default at 44100 Hz */ /* Audio stream is resampled to desired rate using Blip Buffer */ blip_set_rates(snd.blips[2][0], 44100, samplerate); blip_set_rates(snd.blips[2][1], 44100, samplerate); } void cdd_reset(void) { /* reset cycle counter */ cdd.cycles = 0; /* reset drive access latency */ cdd.latency = 0; /* reset track index */ cdd.index = 0; /* reset logical block address */ cdd.lba = 0; /* reset status */ cdd.status = cdd.loaded ? CD_STOP : NO_DISC; /* reset CD-DA fader (full volume) */ cdd.volume = 0x400; /* clear CD-DA output */ cdd.audio[0] = cdd.audio[1] = 0; } int cdd_context_save(uint8 *state) { int bufferptr = 0; save_param(&cdd.cycles, sizeof(cdd.cycles)); save_param(&cdd.latency, sizeof(cdd.latency)); save_param(&cdd.index, sizeof(cdd.index)); save_param(&cdd.lba, sizeof(cdd.lba)); save_param(&cdd.scanOffset, sizeof(cdd.scanOffset)); save_param(&cdd.volume, sizeof(cdd.volume)); save_param(&cdd.status, sizeof(cdd.status)); return bufferptr; } int cdd_context_load(uint8 *state) { int lba; int bufferptr = 0; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } #endif #endif load_param(&cdd.cycles, sizeof(cdd.cycles)); load_param(&cdd.latency, sizeof(cdd.latency)); load_param(&cdd.index, sizeof(cdd.index)); load_param(&cdd.lba, sizeof(cdd.lba)); load_param(&cdd.scanOffset, sizeof(cdd.scanOffset)); load_param(&cdd.volume, sizeof(cdd.volume)); load_param(&cdd.status, sizeof(cdd.status)); /* adjust current LBA within track limit */ lba = cdd.lba; if (lba < cdd.toc.tracks[cdd.index].start) { lba = cdd.toc.tracks[cdd.index].start; } /* seek to current subcode position */ if (cdd.toc.sub) { /* 96 bytes per sector */ fseek(cdd.toc.sub, lba * 96, SEEK_SET); } /* seek to current track position */ if (cdd.toc.tracks[cdd.index].type) { /* DATA track */ fseek(cdd.toc.tracks[cdd.index].fd, lba * cdd.sectorSize, SEEK_SET); } #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) else if (cdd.toc.tracks[cdd.index].vf.seekable) { #ifdef DISABLE_MANY_OGG_OPEN_FILES /* VORBIS file need to be opened first */ ov_open(cdd.toc.tracks[cdd.index].fd,&cdd.toc.tracks[cdd.index].vf,0,0); #endif /* VORBIS AUDIO track */ ov_pcm_seek(&cdd.toc.tracks[cdd.index].vf, (lba * 588) - cdd.toc.tracks[cdd.index].offset); } #endif else if (cdd.toc.tracks[cdd.index].fd) { /* PCM AUDIO track */ fseek(cdd.toc.tracks[cdd.index].fd, (lba * 2352) - cdd.toc.tracks[cdd.index].offset, SEEK_SET); } return bufferptr; } int cdd_load(char *filename, char *header) { char fname[256+10]; char line[128]; char *ptr, *lptr; FILE *fd; /* assume CD image file by default */ int isCDfile = 1; /* first unmount any loaded disc */ cdd_unload(); /* open file */ fd = fopen(filename, "rb"); if (!fd) return (-1); /* save a copy of base filename */ strncpy(fname, filename, 256); /* check loaded file extension */ if (memcmp(".cue", &filename[strlen(filename) - 4], 4) && memcmp(".CUE", &filename[strlen(filename) - 4], 4)) { int len; /* read first 16 bytes */ fread(header, 0x10, 1, fd); /* look for valid CD image identifier */ if (!memcmp("SEGADISCSYSTEM", header, 14)) { /* COOKED format (2048 bytes data blocks) */ cdd.sectorSize = 2048; } else { /* read next 16 bytes */ fread(header, 0x10, 1, fd); /* look for valid CD image identifier */ if (!memcmp("SEGADISCSYSTEM", header, 14)) { /* RAW format (2352 bytes data blocks) */ cdd.sectorSize = 2352; } } /* valid CD image file ? */ if (cdd.sectorSize) { /* read CD image header + security code */ fread(header + 0x10, 0x200, 1, fd); /* initialize first track file descriptor */ cdd.toc.tracks[0].fd = fd; /* this is a valid DATA track */ cdd.toc.tracks[0].type = TYPE_CDROM; /* DATA track end LBA (based on DATA file length) */ fseek(fd, 0, SEEK_END); cdd.toc.tracks[0].end = ftell(fd) / cdd.sectorSize; /* DATA track length should be at least 2s (BIOS requirement) */ if (cdd.toc.tracks[0].end < 150) { cdd.toc.tracks[0].end = 150; } /* DATA track start LBA (logical block 0) */ fseek(fd, 0, SEEK_SET); cdd.toc.tracks[0].start = 0; /* initialize TOC */ cdd.toc.end = cdd.toc.tracks[0].end; cdd.toc.last = 1; } else { /* this is not a CD image file */ isCDfile = 0; /* close file */ fclose(fd); } /* automatically try to mount CD associated CUE file */ len = strlen(fname); while ((len && (fname[len] != '.')) || (len > 251)) len--; strcpy(&fname[len], ".cue"); fd = fopen(fname, "rb"); } /* parse CUE file */ if (fd) { int mm, ss, bb, pregap = 0; /* DATA track already loaded ? */ if (cdd.toc.last) { /* skip first track */ while (fgets(line, 128, fd)) { if (strstr(line, "INDEX 01") && !strstr(line, "INDEX 1")) break; } } /* read lines until end of file */ while (fgets(line, 128, fd)) { /* skip any SPACE characters */ lptr = line; while (*lptr == 0x20) lptr++; /* decode FILE commands */ if (!(memcmp(lptr, "FILE", 4))) { /* retrieve current path */ ptr = fname + strlen(fname) - 1; while ((ptr - fname) && (*ptr != '/') && (*ptr != '\\')) ptr--; if (ptr - fname) ptr++; /* skip "FILE" attribute */ lptr += 4; /* skip SPACE characters */ while (*lptr == 0x20) lptr++; /* retrieve full filename */ if (*lptr == '\"') { /* skip first DOUBLE QUOTE character */ lptr++; while ((*lptr != '\"') && (lptr <= (line + 128)) && (ptr < (fname + 255))) *ptr++ = *lptr++; } else { /* no DOUBLE QUOTE used */ while ((*lptr != 0x20) && (lptr <= (line + 128)) && (ptr < (fname + 255))) *ptr++ = *lptr++; } *ptr = 0; /* open current track file descriptor */ cdd.toc.tracks[cdd.toc.last].fd = fopen(fname, "rb"); if (!cdd.toc.tracks[cdd.toc.last].fd) { /* error opening file */ break; } /* reset current file PREGAP length */ pregap = 0; /* reset current track file read offset */ cdd.toc.tracks[cdd.toc.last].offset = 0; /* check supported audio file types */ if (!strstr(lptr,"BINARY") && !strstr(lptr,"MOTOROLA")) { /* read file header */ unsigned char head[32]; fseek(cdd.toc.tracks[cdd.toc.last].fd, 8, SEEK_SET); fread(head, 32, 1, cdd.toc.tracks[cdd.toc.last].fd); fseek(cdd.toc.tracks[cdd.toc.last].fd, 0, SEEK_SET); /* autodetect WAVE file header (44.1KHz 16-bit stereo format only) */ if (!memcmp(head, waveHeader, 32)) { /* adjust current track file read offset with WAVE header length */ cdd.toc.tracks[cdd.toc.last].offset -= 44; } #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) else if (!ov_open(cdd.toc.tracks[cdd.toc.last].fd,&cdd.toc.tracks[cdd.toc.last].vf,0,0)) { /* retrieve stream infos */ vorbis_info *info = ov_info(&cdd.toc.tracks[cdd.toc.last].vf,-1); if (!info || (info->rate != 44100) || (info->channels != 2)) { /* unsupported VORBIS file format (stereo @44.1kHz only) */ ov_clear(&cdd.toc.tracks[cdd.toc.last].vf); cdd.toc.tracks[cdd.toc.last].fd = 0; break; } } #endif else { /* unsupported audio file */ fclose(cdd.toc.tracks[cdd.toc.last].fd); cdd.toc.tracks[cdd.toc.last].fd = 0; break; } } } /* decode TRACK commands */ else if ((sscanf(lptr, "TRACK %02d %*s", &bb)) || (sscanf(lptr, "TRACK %d %*s", &bb))) { /* check track number */ if (bb != (cdd.toc.last + 1)) { /* close any opened file */ if (cdd.toc.tracks[cdd.toc.last].fd) { fclose(cdd.toc.tracks[cdd.toc.last].fd); cdd.toc.tracks[cdd.toc.last].fd = 0; } /* missing tracks */ break; } /* autodetect DATA track (first track only) */ if (!cdd.toc.last) { /* CD-ROM Mode 1 support only */ if (strstr(lptr,"MODE1/2048")) { /* COOKED format (2048 bytes / block) */ cdd.sectorSize = 2048; } else if (strstr(lptr,"MODE1/2352")) { /* RAW format (2352 bytes / block) */ cdd.sectorSize = 2352; /* skip 16-byte header */ fseek(cdd.toc.tracks[0].fd, 0x10, SEEK_SET); } if (cdd.sectorSize) { /* this is a valid DATA track */ cdd.toc.tracks[0].type = TYPE_CDROM; /* read CD image header + security code */ fread(header, 0x210, 1, cdd.toc.tracks[0].fd); fseek(cdd.toc.tracks[0].fd, 0, SEEK_SET); } } else { /* check if same file is used for consecutive tracks */ if (!cdd.toc.tracks[cdd.toc.last].fd) { /* clear previous track end time */ cdd.toc.tracks[cdd.toc.last - 1].end = 0; } } } /* decode PREGAP commands */ else if (sscanf(lptr, "PREGAP %02d:%02d:%02d", &mm, &ss, &bb) == 3) { /* increment current file PREGAP length */ pregap += bb + ss*75 + mm*60*75; } /* decode INDEX commands */ else if ((sscanf(lptr, "INDEX 00 %02d:%02d:%02d", &mm, &ss, &bb) == 3) || (sscanf(lptr, "INDEX 0 %02d:%02d:%02d", &mm, &ss, &bb) == 3)) { /* check if previous track end time needs to be set */ if (cdd.toc.last && !cdd.toc.tracks[cdd.toc.last - 1].end) { /* set previous track end time (current file absolute time + PREGAP length) */ cdd.toc.tracks[cdd.toc.last - 1].end = bb + ss*75 + mm*60*75 + pregap; } } else if ((sscanf(lptr, "INDEX 01 %02d:%02d:%02d", &mm, &ss, &bb) == 3) || (sscanf(lptr, "INDEX 1 %02d:%02d:%02d", &mm, &ss, &bb) == 3)) { /* adjust current track file read offset with current file PREGAP length (only used for AUDIO track) */ cdd.toc.tracks[cdd.toc.last].offset += pregap * 2352; /* check if a single file is used for consecutive tracks */ if (!cdd.toc.tracks[cdd.toc.last].fd) { /* use common file descriptor */ cdd.toc.tracks[cdd.toc.last].fd = cdd.toc.tracks[0].fd; /* current track start time (based on current file absolute time + PREGAP length) */ cdd.toc.tracks[cdd.toc.last].start = bb + ss*75 + mm*60*75 + pregap; /* check if previous track end time needs to be set */ if (cdd.toc.last && !cdd.toc.tracks[cdd.toc.last - 1].end) { /* set previous track end time (based on current track start time, ignoring any "PREGAP"-type pause if no INDEX00) */ cdd.toc.tracks[cdd.toc.last - 1].end = cdd.toc.tracks[cdd.toc.last].start; } } else { /* current file start time (based on previous track end time + PREGAP length) */ cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end + pregap; /* adjust current track file read offset with previous track end time (only used for AUDIO track) */ cdd.toc.tracks[cdd.toc.last].offset += cdd.toc.end * 2352; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.toc.last].vf.datasource) { /* convert read offset to PCM sample offset */ cdd.toc.tracks[cdd.toc.last].offset = cdd.toc.tracks[cdd.toc.last].offset / 4; /* current track end time */ cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + ov_pcm_total(&cdd.toc.tracks[cdd.toc.last].vf,-1)/588; if (cdd.toc.tracks[cdd.toc.last].end <= cdd.toc.tracks[cdd.toc.last].start) { /* invalid length */ ov_clear(&cdd.toc.tracks[cdd.toc.last].vf); cdd.toc.tracks[cdd.toc.last].fd = 0; cdd.toc.tracks[cdd.toc.last].end = 0; cdd.toc.tracks[cdd.toc.last].start = 0; cdd.toc.tracks[cdd.toc.last].offset = 0; break; } #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close VORBIS file structure to save memory */ ogg_free(cdd.toc.last); #endif } else #endif { /* current track end time */ fseek(cdd.toc.tracks[cdd.toc.last].fd, 0, SEEK_END); if (cdd.toc.tracks[cdd.toc.last].type) { /* DATA track length */ cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + ((ftell(cdd.toc.tracks[cdd.toc.last].fd) + cdd.sectorSize - 1) / cdd.sectorSize); } else { /* AUDIO track length */ cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + ((ftell(cdd.toc.tracks[cdd.toc.last].fd) + 2351) / 2352); } fseek(cdd.toc.tracks[cdd.toc.last].fd, 0, SEEK_SET); } /* adjust track start time (based on current file start time + index absolute time) */ cdd.toc.tracks[cdd.toc.last].start += (bb + ss*75 + mm*60*75); /* update TOC end */ cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; } /* increment track number */ cdd.toc.last++; /* max. 99 tracks */ if (cdd.toc.last == 99) break; } } /* check if last track end time needs to be set */ if (cdd.toc.last && !cdd.toc.tracks[cdd.toc.last - 1].end) { /* adjust TOC end with current file PREGAP length */ cdd.toc.end += pregap; /* last track end time */ cdd.toc.tracks[cdd.toc.last - 1].end = cdd.toc.end; } /* close any incomplete track file */ #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.toc.last].vf.datasource) { ov_clear(&cdd.toc.tracks[cdd.toc.last].vf); } else #endif if (cdd.toc.tracks[cdd.toc.last].fd) { fclose(cdd.toc.tracks[cdd.toc.last].fd); } /* close CUE file */ fclose(fd); } else { int i, offset = 1; /* set pointer at the end of filename */ ptr = fname + strlen(fname) - 4; /* autodetect audio track file extensions */ for (i=0; irate != 44100) || (info->channels != 2)) { /* unsupported OGG file */ ov_clear(&cdd.toc.tracks[cdd.toc.last].vf); break; } /* initialize current track file descriptor */ cdd.toc.tracks[cdd.toc.last].fd = fd; /* initialize current track start time (based on previous track end time) */ cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; /* add default 2s PAUSE between tracks */ cdd.toc.tracks[cdd.toc.last].start += 150; /* current track end time */ cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + ((ov_pcm_total(&cdd.toc.tracks[cdd.toc.last].vf,-1) + 587) / 588); if (cdd.toc.tracks[cdd.toc.last].end <= cdd.toc.tracks[cdd.toc.last].start) { /* invalid file length */ ov_clear(&cdd.toc.tracks[cdd.toc.last].vf); cdd.toc.tracks[cdd.toc.last].fd = 0; cdd.toc.tracks[cdd.toc.last].end = 0; cdd.toc.tracks[cdd.toc.last].start = 0; break; } /* initialize file read offset for current track */ cdd.toc.tracks[cdd.toc.last].offset = cdd.toc.tracks[cdd.toc.last].start * 588; /* auto-detect PAUSE within audio files */ ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 100 * 588); #if defined(USE_LIBVORBIS) ov_read(&cdd.toc.tracks[cdd.toc.last].vf, (char *)head, 32, 0, 2, 1, 0); #else ov_read(&cdd.toc.tracks[cdd.toc.last].vf, (char *)head, 32, 0); #endif ov_pcm_seek(&cdd.toc.tracks[cdd.toc.last].vf, 0); if (*(int32 *)head == 0) { /* assume 2s PAUSE is included at the beginning of the file */ cdd.toc.tracks[cdd.toc.last].offset -= 150 * 588; cdd.toc.tracks[cdd.toc.last].end -= 150; } #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close VORBIS file structure to save memory */ ogg_free(cdd.toc.last); #endif /* update TOC end */ cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; /* increment track number */ cdd.toc.last++; } #endif else { /* unsupported audio file format */ fclose(fd); break; } /* max. 99 tracks */ if (cdd.toc.last == 99) break; /* try to open next audio track file */ sprintf(ptr, extensions[i], cdd.toc.last + offset); fd = fopen(fname, "rb"); } } /* CD tracks found ? */ if (cdd.toc.last) { /* Lead-out */ cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; /* CD mounted */ cdd.loaded = 1; /* Valid DATA track found ? */ if (cdd.toc.tracks[0].type) { /* simulate audio tracks if none found */ if (cdd.toc.last == 1) { /* some games require exact TOC infos */ if (strstr(header + 0x180,"T-95035") != NULL) { /* Snatcher */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_snatcher[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 21); } else if (strstr(header + 0x180,"T-127015") != NULL) { /* Lunar - The Silver Star */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_lunar[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 52); } else if (strstr(header + 0x180,"T-113045") != NULL) { /* Shadow of the Beast II */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_shadow[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 15); } else if (strstr(header + 0x180,"T-143025") != NULL) { /* Dungeon Explorer */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_dungeon[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 13); } else if (strstr(header + 0x180,"MK-4410") != NULL) { /* Final Fight CD (USA, Europe) */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_ffight[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 26); } else if (strstr(header + 0x180,"G-6013") != NULL) { /* Final Fight CD (Japan) */ cdd.toc.last = cdd.toc.end = 0; do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + toc_ffightj[cdd.toc.last]; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while (cdd.toc.last < 29); } else { /* default TOC (99 tracks & 2s per audio tracks) */ do { cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end + 2*75; cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + 2*75; cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end; cdd.toc.last++; } while ((cdd.toc.last < 99) && (cdd.toc.end < 56*60*75)); } } } /* Automatically try to open associated subcode data file */ strncpy(&fname[strlen(fname) - 4], ".sub", 4); cdd.toc.sub = fopen(fname, "rb"); /* return 1 if loaded file is CD image file */ return (isCDfile); } /* no CD image file loaded */ return 0; } void cdd_unload(void) { if (cdd.loaded) { int i; /* close CD tracks */ for (i=0; i 0) && (cdd.toc.tracks[i].fd == cdd.toc.tracks[i-1].fd)) { /* skip track */ i++; } else { /* close file */ fclose(cdd.toc.tracks[i].fd); } } } /* close any opened subcode file */ if (cdd.toc.sub) fclose(cdd.toc.sub); /* CD unloaded */ cdd.loaded = 0; } /* reset TOC */ memset(&cdd.toc, 0x00, sizeof(cdd.toc)); /* no CD-ROM track */ cdd.sectorSize = 0; } void cdd_read_data(uint8 *dst) { /* only allow reading (first) CD-ROM track sectors */ if (cdd.toc.tracks[cdd.index].type && (cdd.lba >= 0)) { /* seek current track sector */ if (cdd.sectorSize == 2048) { /* Mode 1 COOKED data (ISO) */ fseek(cdd.toc.tracks[0].fd, cdd.lba * 2048, SEEK_SET); } else { /* Mode 1 RAW data (skip 16-byte header) */ fseek(cdd.toc.tracks[0].fd, cdd.lba * 2352 + 16, SEEK_SET); } /* read sector data (Mode 1 = 2048 bytes) */ fread(dst, 2048, 1, cdd.toc.tracks[0].fd); } } void cdd_read_audio(unsigned int samples) { /* previous audio outputs */ int16 l = cdd.audio[0]; int16 r = cdd.audio[1]; /* get number of internal clocks (samples) needed */ samples = blip_clocks_needed(snd.blips[2][0], samples); /* audio track playing ? */ if (!scd.regs[0x36>>1].byte.h && cdd.toc.tracks[cdd.index].fd) { int i, mul, delta; /* current CD-DA fader volume */ int curVol = cdd.volume; /* CD-DA fader volume setup (0-1024) */ int endVol = scd.regs[0x34>>1].w >> 4; /* read samples from current block */ #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.index].vf.datasource) { int len, done = 0; int16 *ptr = (int16 *) (cdc.ram); samples = samples * 4; while (done < samples) { #ifdef USE_LIBVORBIS len = ov_read(&cdd.toc.tracks[cdd.index].vf, (char *)(cdc.ram + done), samples - done, 0, 2, 1, 0); #else len = ov_read(&cdd.toc.tracks[cdd.index].vf, (char *)(cdc.ram + done), samples - done, 0); #endif if (len <= 0) { done = samples; break; } done += len; } samples = done / 4; /* process 16-bit (host-endian) stereo samples */ for (i=0; i endVol) { /* fade-out */ curVol--; } else if (!curVol) { /* audio will remain muted until next setup */ break; } } } else #endif { #ifdef LSB_FIRST int16 *ptr = (int16 *) (cdc.ram); #else uint8 *ptr = cdc.ram; #endif fread(cdc.ram, 1, samples * 4, cdd.toc.tracks[cdd.index].fd); /* process 16-bit (little-endian) stereo samples */ for (i=0; i endVol) { /* fade-out */ curVol--; } else if (!curVol) { /* audio will remain muted until next setup */ break; } } } /* save current CD-DA fader volume */ cdd.volume = curVol; /* save last audio output for next frame */ cdd.audio[0] = l; cdd.audio[1] = r; } else { /* no audio output */ if (l) blip_add_delta_fast(snd.blips[2][0], 0, -l); if (r) blip_add_delta_fast(snd.blips[2][1], 0, -r); /* save audio output for next frame */ cdd.audio[0] = 0; cdd.audio[1] = 0; } /* end of Blip Buffer timeframe */ blip_end_frame(snd.blips[2][0], samples); blip_end_frame(snd.blips[2][1], samples); } static void cdd_read_subcode(void) { uint8 subc[96]; int i,j,index; /* update subcode buffer pointer address */ scd.regs[0x68>>1].byte.l = (scd.regs[0x68>>1].byte.l + 98) & 0x7e; /* 16-bit register index */ index = (scd.regs[0x68>>1].byte.l + 0x100) >> 1; /* read interleaved subcode data from .sub file (12 x 8-bit of P subchannel first, then Q subchannel, etc) */ fread(subc, 1, 96, cdd.toc.sub); /* convert back to raw subcode format (96 bytes with 8 x P-W subchannel bits per byte) */ for (i=0; i<96; i+=2) { int code = 0; for (j=0; j<8; j++) { int bits = (subc[(j*12)+(i/8)] >> (6 - (i & 6))) & 3; code |= ((bits & 1) << (7 - j)); code |= ((bits >> 1) << (15 - j)); } /* subcode buffer is accessed as 16-bit words */ scd.regs[index].w = code; /* subcode buffer is limited to 64 x 16-bit words */ index = (index + 1) & 0xbf; } /* level 6 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x40) { /* trigger level 6 interrupt */ scd.pending |= (1 << 6); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } void cdd_update(void) { #ifdef LOG_CDD error("LBA = %d (track n%d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); #endif /* seeking disc */ if (cdd.status == CD_SEEK) { /* drive latency */ if (cdd.latency > 0) { cdd.latency--; return; } /* drive is ready */ cdd.status = CD_PAUSE; } /* reading disc */ else if (cdd.status == CD_PLAY) { /* drive latency */ if (cdd.latency > 0) { cdd.latency--; return; } /* end of disc detection */ if (cdd.index >= cdd.toc.last) { cdd.status = CD_END; return; } /* subcode data processing */ if (cdd.toc.sub) { cdd_read_subcode(); } /* track type */ if (cdd.toc.tracks[cdd.index].type) { /* CD-ROM (Mode 1) sector header */ uint8 header[4]; uint32 msf = cdd.lba + 150; header[0] = lut_BCD_8[(msf / 75) / 60]; header[1] = lut_BCD_8[(msf / 75) % 60]; header[2] = lut_BCD_8[(msf % 75)]; header[3] = 0x01; /* decode CD-ROM track sector */ cdc_decoder_update(*(uint32 *)(header)); } else { /* check against audio track start index */ if (cdd.lba >= cdd.toc.tracks[cdd.index].start) { /* audio track playing */ scd.regs[0x36>>1].byte.h = 0x00; } /* audio blocks are still sent to CDC as well as CD DAC/Fader */ cdc_decoder_update(0); } /* read next sector */ cdd.lba++; /* check end of current track */ if (cdd.lba >= cdd.toc.tracks[cdd.index].end) { #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } #endif #endif /* play next track */ cdd.index++; /* PAUSE between tracks */ scd.regs[0x36>>1].byte.h = 0x01; /* seek to next audio track start */ #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.index].vf.seekable) { #ifdef DISABLE_MANY_OGG_OPEN_FILES /* VORBIS file need to be opened first */ ov_open(cdd.toc.tracks[cdd.index].fd,&cdd.toc.tracks[cdd.index].vf,0,0); #endif ov_pcm_seek(&cdd.toc.tracks[cdd.index].vf, (cdd.toc.tracks[cdd.index].start * 588) - cdd.toc.tracks[cdd.index].offset); } else #endif if (cdd.toc.tracks[cdd.index].fd) { fseek(cdd.toc.tracks[cdd.index].fd, (cdd.toc.tracks[cdd.index].start * 2352) - cdd.toc.tracks[cdd.index].offset, SEEK_SET); } } } /* scanning disc */ else if (cdd.status == CD_SCAN) { /* fast-forward or fast-rewind */ cdd.lba += cdd.scanOffset; /* check current track limits */ if (cdd.lba >= cdd.toc.tracks[cdd.index].end) { #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } #endif #endif /* next track */ cdd.index++; /* check disc limits */ if (cdd.index < cdd.toc.last) { /* skip directly to next track start position */ cdd.lba = cdd.toc.tracks[cdd.index].start; } else { /* end of disc */ cdd.lba = cdd.toc.end; cdd.status = CD_END; /* no AUDIO track playing */ scd.regs[0x36>>1].byte.h = 0x01; return; } } else if (cdd.lba < cdd.toc.tracks[cdd.index].start) { #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } #endif #endif /* check disc limits */ if (cdd.index > 0) { /* previous track */ cdd.index--; /* skip directly to previous track end position */ cdd.lba = cdd.toc.tracks[cdd.index].end; } else { /* start of first track */ cdd.lba = 0; } } /* AUDIO track playing ? */ scd.regs[0x36>>1].byte.h = cdd.toc.tracks[cdd.index].type; /* seek to current subcode position */ if (cdd.toc.sub) { fseek(cdd.toc.sub, cdd.lba * 96, SEEK_SET); } /* seek to current track position */ if (cdd.toc.tracks[cdd.index].type) { /* DATA track */ fseek(cdd.toc.tracks[0].fd, cdd.lba * cdd.sectorSize, SEEK_SET); } #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) else if (cdd.toc.tracks[cdd.index].vf.seekable) { #ifdef DISABLE_MANY_OGG_OPEN_FILES /* check if a new track is being played */ if (!cdd.toc.tracks[cdd.index].vf.datasource) { /* VORBIS file need to be opened first */ ov_open(cdd.toc.tracks[cdd.index].fd,&cdd.toc.tracks[cdd.index].vf,0,0); } #endif /* VORBIS AUDIO track */ ov_pcm_seek(&cdd.toc.tracks[cdd.index].vf, (cdd.lba * 588) - cdd.toc.tracks[cdd.index].offset); } #endif else if (cdd.toc.tracks[cdd.index].fd) { /* PCM AUDIO track */ fseek(cdd.toc.tracks[cdd.index].fd, (cdd.lba * 2352) - cdd.toc.tracks[cdd.index].offset, SEEK_SET); } } } void cdd_process(void) { /* Process CDD command */ switch (scd.regs[0x42>>1].byte.h & 0x0f) { case 0x00: /* Drive Status */ { /* RS1-RS8 normally unchanged */ scd.regs[0x38>>1].byte.h = cdd.status; /* unless RS1 indicated invalid track infos */ if (scd.regs[0x38>>1].byte.l == 0x0f) { /* and SEEK has ended */ if (cdd.status != CD_SEEK) { /* then return valid track infos, e.g current track number in RS2-RS3 (fixes Lunar - The Silver Star) */ scd.regs[0x38>>1].byte.l = 0x02; scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; } } break; } case 0x01: /* Stop Drive */ { /* update status */ cdd.status = cdd.loaded ? CD_STOP : NO_DISC; /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* RS1-RS8 ignored, expects 0x0 (drive busy ?) in RS0 once */ scd.regs[0x38>>1].w = CD_BUSY << 8; scd.regs[0x3a>>1].w = 0x0000; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; scd.regs[0x40>>1].w = ~CD_BUSY & 0x0f; return; } case 0x02: /* Read TOC */ { /* Infos automatically retrieved by CDD processor from Q-Channel */ /* commands 0x00-0x02 (current block) and 0x03-0x05 (Lead-In) */ switch (scd.regs[0x44>>1].byte.l) { case 0x00: /* Current Absolute Time (MM:SS:FF) */ { int lba = cdd.lba + 150; scd.regs[0x38>>1].w = cdd.status << 8; scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; scd.regs[0x40>>1].byte.h = cdd.toc.tracks[cdd.index].type << 2; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ break; } case 0x01: /* Current Track Relative Time (MM:SS:FF) */ { int lba = cdd.lba - cdd.toc.tracks[cdd.index].start; scd.regs[0x38>>1].w = (cdd.status << 8) | 0x01; scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; scd.regs[0x40>>1].byte.h = cdd.toc.tracks[cdd.index].type << 2; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ break; } case 0x02: /* Current Track Number */ { scd.regs[0x38>>1].w = (cdd.status << 8) | 0x02; scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; /* Disk Control Code (?) in RS6 */ scd.regs[0x40>>1].byte.h = 0x00; break; } case 0x03: /* Total length (MM:SS:FF) */ { int lba = cdd.toc.end + 150; scd.regs[0x38>>1].w = (cdd.status << 8) | 0x03; scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; scd.regs[0x40>>1].byte.h = 0x00; break; } case 0x04: /* First & Last Track Numbers */ { scd.regs[0x38>>1].w = (cdd.status << 8) | 0x04; scd.regs[0x3a>>1].w = 0x0001; scd.regs[0x3c>>1].w = lut_BCD_16[cdd.toc.last]; scd.regs[0x3e>>1].w = 0x0000; /* Drive Version (?) in RS6-RS7 */ scd.regs[0x40>>1].byte.h = 0x00; /* Lead-In flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ break; } case 0x05: /* Track Start Time (MM:SS:FF) */ { int track = scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l; int lba = cdd.toc.tracks[track-1].start + 150; scd.regs[0x38>>1].w = (cdd.status << 8) | 0x05; scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; scd.regs[0x3e>>1].byte.h |= (cdd.toc.tracks[track-1].type << 3); /* RS6 bit 3 is set for CD-ROM track */ scd.regs[0x40>>1].byte.h = track % 10; /* Track Number (low digit) */ break; } default: { #ifdef LOG_ERROR error("Unknown CDD Command %02X (%X)\n", scd.regs[0x44>>1].byte.l, s68k.pc); #endif return; } } break; } case 0x03: /* Play */ { /* reset track index */ int index = 0; /* new LBA position */ int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; /* CD drive latency */ if (!cdd.latency) { /* Fixes a few games hanging during intro because they expect data to be read with some delay */ /* Radical Rex needs at least one interrupt delay */ /* Wolf Team games (Anet Futatabi, Cobra Command, Road Avenger & Time Gal) need at least 7 interrupts delay */ /* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 7 is OK) */ cdd.latency = 7; } /* CD drive seek time */ /* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */ /* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */ /* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */ /* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */ if (lba > cdd.lba) { cdd.latency += (((lba - cdd.lba) * 120) / 270000); } else { cdd.latency += (((cdd.lba - lba) * 120) / 270000); } /* update current LBA */ cdd.lba = lba; /* get track index */ while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* check if track index has changed */ if (index != cdd.index) { /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } /* open current track VORBIS file */ if (cdd.toc.tracks[index].vf.seekable) { ov_open(cdd.toc.tracks[index].fd,&cdd.toc.tracks[index].vf,0,0); } } #endif #endif /* update current track index */ cdd.index = index; /* stay within track limits when seeking files */ if (lba < cdd.toc.tracks[index].start) { lba = cdd.toc.tracks[index].start; } /* seek to current subcode position */ if (cdd.toc.sub) { fseek(cdd.toc.sub, lba * 96, SEEK_SET); } /* seek to current track position */ if (cdd.toc.tracks[index].type) { /* DATA track */ fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET); } #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) else if (cdd.toc.tracks[index].vf.seekable) { /* VORBIS AUDIO track */ ov_pcm_seek(&cdd.toc.tracks[index].vf, (lba * 588) - cdd.toc.tracks[index].offset); } #endif else if (cdd.toc.tracks[index].fd) { /* PCM AUDIO track */ fseek(cdd.toc.tracks[index].fd, (lba * 2352) - cdd.toc.tracks[index].offset, SEEK_SET); } /* no audio track playing (yet) */ scd.regs[0x36>>1].byte.h = 0x01; /* update status */ cdd.status = CD_PLAY; /* return track index in RS2-RS3 */ scd.regs[0x38>>1].w = (CD_PLAY << 8) | 0x02; scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[index + 1] : 0x0A0A; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; scd.regs[0x40>>1].byte.h = 0x00; break; } case 0x04: /* Seek */ { /* reset track index */ int index = 0; /* new LBA position */ int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; /* CD drive seek time */ /* We are using similar linear model as above, although still not exactly accurate, */ /* it works fine for Switch/Panic! intro (Switch needs at least 30 interrupts while */ /* seeking from 00:05:63 to 24:03:19, Panic! when seeking from 00:05:60 to 24:06:07) */ if (lba > cdd.lba) { cdd.latency = ((lba - cdd.lba) * 120) / 270000; } else { cdd.latency = ((cdd.lba - lba) * 120) / 270000; } /* update current LBA */ cdd.lba = lba; /* get current track index */ while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) #ifdef DISABLE_MANY_OGG_OPEN_FILES /* check if track index has changed */ if (index != cdd.index) { /* close previous track VORBIS file structure to save memory */ if (cdd.toc.tracks[cdd.index].vf.datasource) { ogg_free(cdd.index); } /* open current track VORBIS file */ if (cdd.toc.tracks[index].vf.seekable) { ov_open(cdd.toc.tracks[index].fd,&cdd.toc.tracks[index].vf,0,0); } } #endif #endif /* update current track index */ cdd.index = index; /* stay within track limits */ if (lba < cdd.toc.tracks[index].start) { lba = cdd.toc.tracks[index].start; } /* seek to current block */ if (cdd.toc.tracks[index].type) { /* DATA track */ fseek(cdd.toc.tracks[0].fd, lba * cdd.sectorSize, SEEK_SET); } #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) else if (cdd.toc.tracks[index].vf.seekable) { /* VORBIS AUDIO track */ ov_pcm_seek(&cdd.toc.tracks[index].vf, (lba * 588) - cdd.toc.tracks[index].offset); } #endif else if (cdd.toc.tracks[index].fd) { /* PCM AUDIO track */ fseek(cdd.toc.tracks[index].fd, (lba * 2352) - cdd.toc.tracks[index].offset, SEEK_SET); } /* seek to current subcode position */ if (cdd.toc.sub) { fseek(cdd.toc.sub, lba * 96, SEEK_SET); } /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* update status */ cdd.status = CD_SEEK; /* unknown RS1-RS8 values (returning 0xF in RS1 invalidates track infos in RS2-RS8 and fixes Final Fight CD intro when seek time is emulated) */ scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f; scd.regs[0x3a>>1].w = 0x0000; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; scd.regs[0x40>>1].w = ~(CD_SEEK + 0xf) & 0x0f; return; } case 0x06: /* Pause */ { /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* update status (RS1-RS8 unchanged) */ cdd.status = scd.regs[0x38>>1].byte.h = CD_PAUSE; break; } case 0x07: /* Resume */ { /* update status (RS1-RS8 unchanged) */ cdd.status = scd.regs[0x38>>1].byte.h = CD_PLAY; break; } case 0x08: /* Forward Scan */ { /* reset scanning direction / speed */ cdd.scanOffset = CD_SCAN_SPEED; /* update status (RS1-RS8 unchanged) */ cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; break; } case 0x09: /* Rewind Scan */ { /* reset scanning direction / speed */ cdd.scanOffset = -CD_SCAN_SPEED; /* update status (RS1-RS8 unchanged) */ cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; break; } case 0x0a: /* N-Track Jump Control ? (usually sent before CD_SEEK or CD_PLAY commands) */ { /* TC3 corresponds to seek direction (00=forward, FF=reverse) */ /* TC4-TC7 are related to seek length (4x4 bits i.e parameter values are between -65535 and +65535) */ /* Maybe related to number of auto-sequenced track jumps/moves for CD DSP (cf. CXD2500BQ datasheet) */ /* also see US Patent nr. 5222054 for a detailled description of seeking operation using Track Jump */ /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* update status (RS1-RS8 unchanged) */ cdd.status = scd.regs[0x38>>1].byte.h = CD_PAUSE; break; } case 0x0c: /* Close Tray */ { /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* update status */ cdd.status = cdd.loaded ? CD_STOP : NO_DISC; /* RS1-RS8 ignored, expects 0x0 (drive busy ?) in RS0 once */ scd.regs[0x38>>1].w = CD_BUSY << 8; scd.regs[0x3a>>1].w = 0x0000; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; scd.regs[0x40>>1].w = ~CD_BUSY & 0x0f; #ifdef CD_TRAY_CALLBACK CD_TRAY_CALLBACK #endif return; } case 0x0d: /* Open Tray */ { /* no audio track playing */ scd.regs[0x36>>1].byte.h = 0x01; /* update status (RS1-RS8 ignored) */ cdd.status = CD_OPEN; scd.regs[0x38>>1].w = CD_OPEN << 8; scd.regs[0x3a>>1].w = 0x0000; scd.regs[0x3c>>1].w = 0x0000; scd.regs[0x3e>>1].w = 0x0000; scd.regs[0x40>>1].w = ~CD_OPEN & 0x0f; #ifdef CD_TRAY_CALLBACK CD_TRAY_CALLBACK #endif return; } default: /* Unknown command */ #ifdef LOG_CDD error("Unknown CDD Command !!!\n"); #endif scd.regs[0x38>>1].byte.h = cdd.status; break; } /* only compute checksum when necessary */ scd.regs[0x40>>1].byte.l = ~(scd.regs[0x38>>1].byte.h + scd.regs[0x38>>1].byte.l + scd.regs[0x3a>>1].byte.h + scd.regs[0x3a>>1].byte.l + scd.regs[0x3c>>1].byte.h + scd.regs[0x3c>>1].byte.l + scd.regs[0x3e>>1].byte.h + scd.regs[0x3e>>1].byte.l + scd.regs[0x40>>1].byte.h) & 0x0f; } core/ntsc/sms_ntsc_impl.h000664 001750 001750 00000032227 12702465756 016650 0ustar00sergiosergio000000 000000 /* sms_ntsc 0.2.3. http://www.slack.net/~ant/ */ /* Common implementation of NTSC filters */ #include #include /* Copyright (C) 2006 Shay Green. This module is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define DISABLE_CORRECTION 0 #undef PI #define PI 3.14159265358979323846f #ifndef LUMA_CUTOFF #define LUMA_CUTOFF 0.20 #endif #ifndef gamma_size #define gamma_size 1 #endif #ifndef rgb_bits #define rgb_bits 8 #endif #ifndef artifacts_max #define artifacts_max (artifacts_mid * 1.5f) #endif #ifndef fringing_max #define fringing_max (fringing_mid * 2) #endif #ifndef STD_HUE_CONDITION #define STD_HUE_CONDITION( setup ) 1 #endif #define ext_decoder_hue (std_decoder_hue + 15) #define rgb_unit (1 << rgb_bits) #define rgb_offset (rgb_unit * 2 + 0.5f) enum { burst_size = sms_ntsc_entry_size / burst_count }; enum { kernel_half = 16 }; enum { kernel_size = kernel_half * 2 + 1 }; typedef struct init_t { float to_rgb [burst_count * 6]; float to_float [gamma_size]; float contrast; float brightness; float artifacts; float fringing; float kernel [rescale_out * kernel_size * 2]; } init_t; #define ROTATE_IQ( i, q, sin_b, cos_b ) {\ float t;\ t = i * cos_b - q * sin_b;\ q = i * sin_b + q * cos_b;\ i = t;\ } static void init_filters( init_t* impl, sms_ntsc_setup_t const* setup ) { #if rescale_out > 1 float kernels [kernel_size * 2]; #else float* const kernels = impl->kernel; #endif /* generate luma (y) filter using sinc kernel */ { /* sinc with rolloff (dsf) */ float const rolloff = 1 + (float) setup->sharpness * (float) 0.032; float const maxh = 32; float const pow_a_n = (float) pow( rolloff, maxh ); float sum; int i; /* quadratic mapping to reduce negative (blurring) range */ float to_angle = (float) setup->resolution + 1; to_angle = PI / maxh * (float) LUMA_CUTOFF * (to_angle * to_angle + 1); kernels [kernel_size * 3 / 2] = maxh; /* default center value */ for ( i = 0; i < kernel_half * 2 + 1; i++ ) { int x = i - kernel_half; float angle = x * to_angle; /* instability occurs at center point with rolloff very close to 1.0 */ if ( x || pow_a_n > (float) 1.056 || pow_a_n < (float) 0.981 ) { float rolloff_cos_a = rolloff * (float) cos( angle ); float num = 1 - rolloff_cos_a - pow_a_n * (float) cos( maxh * angle ) + pow_a_n * rolloff * (float) cos( (maxh - 1) * angle ); float den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff; float dsf = num / den; kernels [kernel_size * 3 / 2 - kernel_half + i] = dsf - (float) 0.5; } } /* apply blackman window and find sum */ sum = 0; for ( i = 0; i < kernel_half * 2 + 1; i++ ) { float x = PI * 2 / (kernel_half * 2) * i; float blackman = 0.42f - 0.5f * (float) cos( x ) + 0.08f * (float) cos( x * 2 ); sum += (kernels [kernel_size * 3 / 2 - kernel_half + i] *= blackman); } /* normalize kernel */ sum = 1.0f / sum; for ( i = 0; i < kernel_half * 2 + 1; i++ ) { int x = kernel_size * 3 / 2 - kernel_half + i; kernels [x] *= sum; assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } /* generate chroma (iq) filter using gaussian kernel */ { float const cutoff_factor = -0.03125f; float cutoff = (float) setup->bleed; int i; if ( cutoff < 0 ) { /* keep extreme value accessible only near upper end of scale (1.0) */ cutoff *= cutoff; cutoff *= cutoff; cutoff *= cutoff; cutoff *= -30.0f / 0.65f; } cutoff = cutoff_factor - 0.65f * cutoff_factor * cutoff; for ( i = -kernel_half; i <= kernel_half; i++ ) kernels [kernel_size / 2 + i] = (float) exp( i * i * cutoff ); /* normalize even and odd phases separately */ for ( i = 0; i < 2; i++ ) { float sum = 0; int x; for ( x = i; x < kernel_size; x += 2 ) sum += kernels [x]; sum = 1.0f / sum; for ( x = i; x < kernel_size; x += 2 ) { kernels [x] *= sum; assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } } /* printf( "luma:\n" ); for ( i = kernel_size; i < kernel_size * 2; i++ ) printf( "%f\n", kernels [i] ); printf( "chroma:\n" ); for ( i = 0; i < kernel_size; i++ ) printf( "%f\n", kernels [i] ); */ /* generate linear rescale kernels */ #if rescale_out > 1 { float weight = 1.0f; float* out = impl->kernel; int n = rescale_out; do { float remain = 0; int i; weight -= 1.0f / rescale_in; for ( i = 0; i < kernel_size * 2; i++ ) { float cur = kernels [i]; float m = cur * weight; *out++ = m + remain; remain = cur - m; } } while ( --n ); } #endif } static float const default_decoder [6] = { 0.956f, 0.621f, -0.272f, -0.647f, -1.105f, 1.702f }; static void init( init_t* impl, sms_ntsc_setup_t const* setup ) { impl->brightness = (float) setup->brightness * (0.5f * rgb_unit) + rgb_offset; impl->contrast = (float) setup->contrast * (0.5f * rgb_unit) + rgb_unit; #ifdef default_palette_contrast if ( !setup->palette ) impl->contrast *= default_palette_contrast; #endif impl->artifacts = (float) setup->artifacts; if ( impl->artifacts > 0 ) impl->artifacts *= artifacts_max - artifacts_mid; impl->artifacts = impl->artifacts * artifacts_mid + artifacts_mid; impl->fringing = (float) setup->fringing; if ( impl->fringing > 0 ) impl->fringing *= fringing_max - fringing_mid; impl->fringing = impl->fringing * fringing_mid + fringing_mid; init_filters( impl, setup ); /* generate gamma table */ if ( gamma_size > 1 ) { float const to_float = 1.0f / (gamma_size - (gamma_size > 1)); float const gamma = 1.1333f - (float) setup->gamma * 0.5f; /* match common PC's 2.2 gamma to TV's 2.65 gamma */ int i; for ( i = 0; i < gamma_size; i++ ) impl->to_float [i] = (float) pow( i * to_float, gamma ) * impl->contrast + impl->brightness; } /* setup decoder matricies */ { float hue = (float) setup->hue * PI + PI / 180 * ext_decoder_hue; float sat = (float) setup->saturation + 1; float const* decoder = setup->decoder_matrix; if ( !decoder ) { decoder = default_decoder; if ( STD_HUE_CONDITION( setup ) ) hue += PI / 180 * (std_decoder_hue - ext_decoder_hue); } { float s = (float) sin( hue ) * sat; float c = (float) cos( hue ) * sat; float* out = impl->to_rgb; int n; n = burst_count; do { float const* in = decoder; int n = 3; do { float i = *in++; float q = *in++; *out++ = i * c - q * s; *out++ = i * s + q * c; } while ( --n ); if ( burst_count <= 1 ) break; ROTATE_IQ( s, c, 0.866025f, -0.5f ); /* +120 degrees */ } while ( --n ); } } } /* kernel generation */ #define RGB_TO_YIQ( r, g, b, y, i ) (\ (y = (r) * 0.299f + (g) * 0.587f + (b) * 0.114f),\ (i = (r) * 0.596f - (g) * 0.275f - (b) * 0.321f),\ ((r) * 0.212f - (g) * 0.523f + (b) * 0.311f)\ ) #define YIQ_TO_RGB( y, i, q, to_rgb, type, r, g ) (\ r = (type) (y + to_rgb [0] * i + to_rgb [1] * q),\ g = (type) (y + to_rgb [2] * i + to_rgb [3] * q),\ (type) (y + to_rgb [4] * i + to_rgb [5] * q)\ ) #define PACK_RGB( r, g, b ) ((r) << 21 | (g) << 11 | (b) << 1) enum { rgb_kernel_size = burst_size / alignment_count }; enum { rgb_bias = rgb_unit * 2 * sms_ntsc_rgb_builder }; typedef struct pixel_info_t { int offset; float negate; float kernel [4]; } pixel_info_t; #if rescale_in > 1 #define PIXEL_OFFSET_( ntsc, scaled ) \ (kernel_size / 2 + ntsc + (scaled != 0) + (rescale_out - scaled) % rescale_out + \ (kernel_size * 2 * scaled)) #define PIXEL_OFFSET( ntsc, scaled ) \ PIXEL_OFFSET_( ((ntsc) - (scaled) / rescale_out * rescale_in),\ (((scaled) + rescale_out * 10) % rescale_out) ),\ (1.0f - (((ntsc) + 100) & 2)) #else #define PIXEL_OFFSET( ntsc, scaled ) \ (kernel_size / 2 + (ntsc) - (scaled)),\ (1.0f - (((ntsc) + 100) & 2)) #endif extern pixel_info_t const sms_ntsc_pixels [alignment_count]; /* Generate pixel at all burst phases and column alignments */ static void gen_kernel( init_t* impl, float y, float i, float q, sms_ntsc_rgb_t* out ) { /* generate for each scanline burst phase */ float const* to_rgb = impl->to_rgb; int burst_remain = burst_count; y -= rgb_offset; do { /* Encode yiq into *two* composite signals (to allow control over artifacting). Convolve these with kernels which: filter respective components, apply sharpening, and rescale horizontally. Convert resulting yiq to rgb and pack into integer. Based on algorithm by NewRisingSun. */ pixel_info_t const* pixel = sms_ntsc_pixels; int alignment_remain = alignment_count; do { /* negate is -1 when composite starts at odd multiple of 2 */ float const yy = y * impl->fringing * pixel->negate; float const ic0 = (i + yy) * pixel->kernel [0]; float const qc1 = (q + yy) * pixel->kernel [1]; float const ic2 = (i - yy) * pixel->kernel [2]; float const qc3 = (q - yy) * pixel->kernel [3]; float const factor = impl->artifacts * pixel->negate; float const ii = i * factor; float const yc0 = (y + ii) * pixel->kernel [0]; float const yc2 = (y - ii) * pixel->kernel [2]; float const qq = q * factor; float const yc1 = (y + qq) * pixel->kernel [1]; float const yc3 = (y - qq) * pixel->kernel [3]; float const* k = &impl->kernel [pixel->offset]; int n; ++pixel; for ( n = rgb_kernel_size; n; --n ) { float i = k[0]*ic0 + k[2]*ic2; float q = k[1]*qc1 + k[3]*qc3; float y = k[kernel_size+0]*yc0 + k[kernel_size+1]*yc1 + k[kernel_size+2]*yc2 + k[kernel_size+3]*yc3 + rgb_offset; if ( rescale_out <= 1 ) k--; else if ( k < &impl->kernel [kernel_size * 2 * (rescale_out - 1)] ) k += kernel_size * 2 - 1; else k -= kernel_size * 2 * (rescale_out - 1) + 2; { int r, g, b = YIQ_TO_RGB( y, i, q, to_rgb, int, r, g ); *out++ = PACK_RGB( r, g, b ) - rgb_bias; } } } while ( alignment_count > 1 && --alignment_remain ); if ( burst_count <= 1 ) break; to_rgb += 6; ROTATE_IQ( i, q, -0.866025f, -0.5f ); /* -120 degrees */ } while ( --burst_remain ); } static void correct_errors( sms_ntsc_rgb_t color, sms_ntsc_rgb_t* out ); #if DISABLE_CORRECTION #define CORRECT_ERROR( a ) { out [i] += rgb_bias; } #define DISTRIBUTE_ERROR( a, b, c ) { out [i] += rgb_bias; } #else #define CORRECT_ERROR( a ) { out [a] += error; } #define DISTRIBUTE_ERROR( a, b, c ) {\ sms_ntsc_rgb_t fourth = (error + 2 * sms_ntsc_rgb_builder) >> 2;\ fourth &= (rgb_bias >> 1) - sms_ntsc_rgb_builder;\ fourth -= rgb_bias >> 2;\ out [a] += fourth;\ out [b] += fourth;\ out [c] += fourth;\ out [i] += error - (fourth * 3);\ } #endif #define RGB_PALETTE_OUT( rgb, out_ )\ {\ unsigned char* out = (out_);\ sms_ntsc_rgb_t clamped = (rgb);\ SMS_NTSC_CLAMP_( clamped, (8 - rgb_bits) );\ out [0] = (unsigned char) (clamped >> 21);\ out [1] = (unsigned char) (clamped >> 11);\ out [2] = (unsigned char) (clamped >> 1);\ } /* blitter related */ #ifndef restrict #if defined (__GNUC__) #define restrict __restrict__ #elif defined (_MSC_VER) && _MSC_VER > 1300 #define restrict __restrict #else /* no support for restricted pointers */ #define restrict #endif #endif #include #if SMS_NTSC_OUT_DEPTH <= 16 #if USHRT_MAX == 0xFFFF typedef unsigned short sms_ntsc_out_t; #else #error "Need 16-bit int type" #endif #else #if UINT_MAX == 0xFFFFFFFF typedef unsigned int sms_ntsc_out_t; #elif ULONG_MAX == 0xFFFFFFFF typedef unsigned long sms_ntsc_out_t; #else #error "Need 32-bit int type" #endif #endif libretro/msvc/msvc-2010.bat000664 001750 001750 00000007745 12702465756 016547 0ustar00sergiosergio000000 000000 @echo off @echo Setting environment for using Microsoft Visual Studio 2010 x86 tools. @call :GetVSCommonToolsDir @if "%VS100COMNTOOLS%"=="" goto error_no_VS100COMNTOOLSDIR @call "%VS100COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit @if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR @if "%FrameworkDir32%"=="" goto error_no_FrameworkDIR32 @if "%FrameworkVersion32%"=="" goto error_no_FrameworkVer32 @if "%Framework35Version%"=="" goto error_no_Framework35Version @set FrameworkDir=%FrameworkDir32% @set FrameworkVersion=%FrameworkVersion32% @if not "%WindowsSdkDir%" == "" ( @set "PATH=%WindowsSdkDir%bin\NETFX 4.0 Tools;%WindowsSdkDir%bin;%PATH%" @set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%" @set "LIB=%WindowsSdkDir%lib;%LIB%" ) @rem @rem Root of Visual Studio IDE installed files. @rem @set DevEnvDir=%VSINSTALLDIR%Common7\IDE\ @rem PATH @rem ---- @if exist "%VSINSTALLDIR%Team Tools\Performance Tools" ( @set "PATH=%VSINSTALLDIR%Team Tools\Performance Tools;%PATH%" ) @if exist "%ProgramFiles%\HTML Help Workshop" set PATH=%ProgramFiles%\HTML Help Workshop;%PATH% @if exist "%ProgramFiles(x86)%\HTML Help Workshop" set PATH=%ProgramFiles(x86)%\HTML Help Workshop;%PATH% @if exist "%VCINSTALLDIR%VCPackages" set PATH=%VCINSTALLDIR%VCPackages;%PATH% @set PATH=%FrameworkDir%%Framework35Version%;%PATH% @set PATH=%FrameworkDir%%FrameworkVersion%;%PATH% @set PATH=%VSINSTALLDIR%Common7\Tools;%PATH% @if exist "%VCINSTALLDIR%BIN" set PATH=%VCINSTALLDIR%BIN;%PATH% @set PATH=%DevEnvDir%;%PATH% @if exist "%VSINSTALLDIR%VSTSDB\Deploy" ( @set "PATH=%VSINSTALLDIR%VSTSDB\Deploy;%PATH%" ) @if not "%FSHARPINSTALLDIR%" == "" ( @set "PATH=%FSHARPINSTALLDIR%;%PATH%" ) @rem INCLUDE @rem ------- @if exist "%VCINSTALLDIR%ATLMFC\INCLUDE" set INCLUDE=%VCINSTALLDIR%ATLMFC\INCLUDE;%INCLUDE% @if exist "%VCINSTALLDIR%INCLUDE" set INCLUDE=%VCINSTALLDIR%INCLUDE;%INCLUDE% @rem LIB @rem --- @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIB=%VCINSTALLDIR%ATLMFC\LIB;%LIB% @if exist "%VCINSTALLDIR%LIB" set LIB=%VCINSTALLDIR%LIB;%LIB% @rem LIBPATH @rem ------- @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIBPATH=%VCINSTALLDIR%ATLMFC\LIB;%LIBPATH% @if exist "%VCINSTALLDIR%LIB" set LIBPATH=%VCINSTALLDIR%LIB;%LIBPATH% @set LIBPATH=%FrameworkDir%%Framework35Version%;%LIBPATH% @set LIBPATH=%FrameworkDir%%FrameworkVersion%;%LIBPATH% @goto end @REM ----------------------------------------------------------------------- :GetVSCommonToolsDir @set VS100COMNTOOLS= @call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKCU > nul 2>&1 @exit /B 0 :GetVSCommonToolsDirHelper32 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO ( @if "%%i"=="10.0" ( @SET "VS100COMNTOOLS=%%k" ) ) @if "%VS100COMNTOOLS%"=="" exit /B 1 @SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\" @exit /B 0 :GetVSCommonToolsDirHelper64 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO ( @if "%%i"=="10.0" ( @SET "VS100COMNTOOLS=%%k" ) ) @if "%VS100COMNTOOLS%"=="" exit /B 1 @SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\" @exit /B 0 @REM ----------------------------------------------------------------------- :error_no_VS100COMNTOOLSDIR @echo ERROR: Cannot determine the location of the VS Common Tools folder. @goto end :error_no_VSINSTALLDIR @echo ERROR: Cannot determine the location of the VS installation. @goto end :error_no_FrameworkDIR32 @echo ERROR: Cannot determine the location of the .NET Framework 32bit installation. @goto end :error_no_FrameworkVer32 @echo ERROR: Cannot determine the version of the .NET Framework 32bit installation. @goto end :error_no_Framework35Version @echo ERROR: Cannot determine the .NET Framework 3.5 version. @goto end :end msbuild msvc-2010.sln /p:Configuration=Release /target:clean msbuild msvc-2010.sln /p:Configuration=Release exit gx/images/Option_sound.png000664 001750 001750 00000010321 12702465756 016766 0ustar00sergiosergio000000 000000 PNG  IHDR,PbdsBIT|d pHYs  ~tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$%IDATx{PS׾ǿ{g';/!D .ZZ[:sO[cj~_AAHAE ADbȃ<XQhY3Yk! _vmMMef[[[![#|۶m`Ywnn"2.Ç'/DjZ},Yn޽cf3 500F޽!åKF̜9.,,[BHpWnݺ5d…ڤ$C /@KMv4l%N>ښ5kVhl AmmvP*R(BI}}i`2KRl6#,, 8!~ݺusss?`߸qc\uu5 EzB!F#L\gxvs)RiZ !`Y < ,BBBvϘ1C7,jiiH$p7b1PQQ nسge٤!@&Fi@ EQP(0x]xx8VOOO?nZ;}f@ÁGMFJgϞp:ʢ( 8h(ia<T> <??66p)M Ν;liii/n^f:υ?*Q g}n^@۷'(j NJJLk4MOM4!4h}KKKA1 P(iRDDNg'A@鍲h4L&ÃnP  ai{TEQ4~\}q}<Z<#w9R$;_²,\EE=l}׬V+zyo"@јv/[,ڵkNgm/:zOIIٕR@>y VZvܹ8T%hQ9tЪܹ\B?_`7{sM6 tBR!99ySbbbM00{'''>|ya`9<gL8L@@f3!y'K}y,Y2ƍ|=@ lFRRnjR9U&9r9PO|jkkT*;-vxGGGƍw922r3N[gYK\]`[oN*jB ]83g|YPP P(۷~OyrOd2L&ngZ ?tod`Djj?<h>|x1qq#F܈ݎ'&$$x<غ:8rD"Hs },XšCBOa~$""j2k֬Z0qv0!,!z;ۗM2{fokj;v,U,Fu ou[V7 ou[V7 ou[V7 ou[c2蒒W6oޜC&9Ξ={;^2%%%#6mʵkU*cڬ{_~ZEEEߑ#G+##ٳg{!x޼yG/^KHHL^Voپ}8)44tWNNN~;1QݹsG.G>3a„k4v`N81u [ZZ{W ;z%MMM0ظq&i￟zǏj4*\.[UUꎎVUEEE}VVVܧOSNq [z؋/NL:n2M$44bxpƌGGG_3… LmVVVҠAi^ :nmۖ^x1 99yܹs&N۷_p9N7qp\*@PXX8FJ|嗟>`AǏ*b"E @  (D"!<ϻ"##;TQQ2 Zqy:O6\zvvNKK033z3;; 6L(ܼySM4/{FAy$ 9sS*ٳg77y^{dž)BFFP4J$%Xp84=)IN3BHԩSl69r8Nr`pRLoOk:D"x( tґJ_aٳgxA;*lV0lȑE6mڲ={`09ӧO.,,6@DFFhfR&/[[[5BR">] Ŋ+l6(JU<}7$;q?Jܣ/rsed2;vL^`7?Ç/_7'N,OoKF^zrIIs#իcƌ9-HT ^/x<4bѸIL&|x5dWnIENDB`gx/images/Main_takeshot.png000664 001750 001750 00000006730 12702465756 017105 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 ,IDATx{lTվ?{ZZ-);UO R ʕ+QZ%^Q#sH`xjjiG{^}3y]s7Y{- ֭+VUuᘩ(/?\ fBurrr.;fq&\ z՗.]z?// ldddv` 6BE.^H{{;;vn#33m˖-[_fkqwMBA`ƍs0 4iiiij?@4:::9pO>du^^UVI&ΞԩS9s&cƌ;3? UUihhwe`` 4eʔe۶mbI!TfOOwҤIq1d罹zEeq:L>~Ի8ݿ- @UUEAUUٳgϾ{RcݲeKƙ3gZ{챸 &PTTf  o>?ѣ&;;Azeڴi8{@h(((ڵ cRQQU ˏ\.fϞm x ~WRSSgĈna1ݻw/PVVFIIgB44MT*2$vZBϿ4ZzjәȴiӬ(..f֬Y92&fD `]m۶Ys3dEpYYÆ K "xp9s搐DSO=ŸqD?(L0eXf v4m`9ϔyf̙3Xl PZZv;\.<bɌ3*#\UUUcÆ {?~p'0X8 O<_oh߾}5tt]>7 4k"Έc(hFqq1nM6#Zn ^hKrɇ&N8G"QCCK,Au.3U;%IH?*e*,#v\OP,XsQ&Nxz"FRRmƵ:<CƌnݺP(d{RSS1 Ʈ N0re䐌2RX"  aRo3 ##f˖-@aa!;v젵<Xݻwx6))+VP__Nj*YYYΰp8lPURPB HA%qIS>O-) |2!5dNtC' ( $ˁn,?vx(--{Bx< -[KYYx<ΝkxфF]N0QS}}}3N>Mii5ecMG蚎GV&eL ^`Ԉ#5[Gn44TMŸ@$$I"++ʛ"TEp8䐖绮]EEرDQĄ:`THs\x<6IFȲxeݥd)4UU%xbhhHD8F-NYIII!LU.ZyQWWرJJJzoC$7.+3WU#F`H}%˲e,I6 0P$%IJCܟ@xM,2 IvYQuUW1tr[٥zqݻ:<~3fX8wmu͟->>2@wwe+.A@cwB$]AeK$&&wwwSRR(]/MKKgܹBMb!hVV5?ۨQ\.,S[[qiI 󿒔D($( ?3PI5Y#2LVV |rr2ܹz|7U,Zg 3v5ůԩS\>{|||nȑ#,^09s&=/A), e.%acHHM'ԋʕ N(BUUXx 'p8ؼy37oJ"Mii ӭL~A ڝ;walȲ{'O$11dٳpΝ֭[KcYQ5EWPQd*UF$i%Ƒ|]]]|WtfH"]W|1Vaf600 wæjkkedNG}DџH~0ES ݦ!AGG l7>뺆}#sJ&(RYYIqq11n7j?lc,˄B?$1566"˲q̙z[ZZq8|'Ο?W^ygy&fڔՂ ($ UUinnV݀*$ b3Gg!Bkss}ogϞs9r\RSSy7!3:eP(Dgg'kdggtz`ךYU`BMAN8AGGKa 999{/=z4G$Y|9=EIZ8!6ZGĉZ+W 뻅TT퍢(gz衪0__5kc޼ya٬ UUcafhB?NUU]]]\˗/?3믿QSSPСCrt:=z40sY:;;i~JӴ᏿w9cQ{{F7K!~_谎Q`eff%$$\~]fqߤL [IENDB`core/tremor/codec_internal.h000664 001750 001750 00000006014 12702465756 017303 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: libvorbis codec headers ********************************************************************/ #ifndef _V_CODECI_H_ #define _V_CODECI_H_ #include "codebook.h" typedef void vorbis_look_mapping; typedef void vorbis_look_floor; typedef void vorbis_look_residue; typedef void vorbis_look_transform; /* mode ************************************************************/ typedef struct { int blockflag; int windowtype; int transformtype; int mapping; } vorbis_info_mode; typedef void vorbis_info_floor; typedef void vorbis_info_residue; typedef void vorbis_info_mapping; typedef struct private_state { /* local lookup storage */ const void *window[2]; /* backend lookups are tied to the mode, not the backend or naked mapping */ int modebits; vorbis_look_mapping **mode; ogg_int64_t sample_count; } private_state; /* codec_setup_info contains all the setup information specific to the specific compression/decompression mode in progress (eg, psychoacoustic settings, channel setup, options, codebook etc). *********************************************************************/ typedef struct codec_setup_info { /* Vorbis supports only short and long blocks, but allows the encoder to choose the sizes */ long blocksizes[2]; /* modes are the primary means of supporting on-the-fly different blocksizes, different channel mappings (LR or M/A), different residue backends, etc. Each mode consists of a blocksize flag and a mapping (along with the mapping setup */ int modes; int maps; int times; int floors; int residues; int books; vorbis_info_mode *mode_param[64]; int map_type[64]; vorbis_info_mapping *map_param[64]; int time_type[64]; int floor_type[64]; vorbis_info_floor *floor_param[64]; int residue_type[64]; vorbis_info_residue *residue_param[64]; static_codebook *book_param[256]; codebook *fullbooks; int passlimit[32]; /* iteration limit per couple/quant pass */ int coupling_passes; } codec_setup_info; #endif gx/images/Button_delete.png000664 001750 001750 00000010521 12702465756 017105 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚ{tU?UN'g$tRj :.tYWqgٝ3xf\YfX<谀.PaH4tI]ttw"={Ϲq~߽*AUU?ž,Y-@p 6a t$/f,yQtxElmkJσ*ŖUDFv2JKKf/I/o(r13ࡆǟ'awM>{d1gavƢk'}>Bl G.W2Ԫn`\, jز=Qr&^[6c9z|dr.aJ: IwL,;74uT[pL3%Rx=S2N8Pe iGioșq wjUEQ)Ie oKn {Q<5"cybw{( }ӪbX4>MtKWUU1z9 Rt|֭GɲKLșc*P||'sd6𽴀-ز=XbA Ɖxaɦ)=|RQN"rl[<>l._? kh7_Yħ_Շd0PH#tn1*q[Pp_b[ (~ǟBL 3J$:g>{1 C< \.|>|>htI\#(L(ٸY/|r>dPUq# pl6kc/cb`ؽ{76lHHMM -h4",,YҶ63фҊ˙tdΗ,{3 3'GZkvsygh3|w})$B8uF۷ۼy3XL[Kdy7kV1 pLmm;)8r/.BE !UJee%l޼9m `קoll#g}M9kV 'p{ɬ]kDCz< EQV+SNgʔ)L].,X! no1n̙,p eEy=>֬`(1-Kq477#E `Æ i=>%J]]]sNA'FPMW]i@saÚ oh\[a _'N}, a6;wnJ'naȒ(+:FŨJĿ 'RS5^+CX+%ؗQGʪCOA[=$c@`XՆ@"SoEv`ȣN((H4TT^ZMncFٌ.Al6c61 XKt|N&r=UO*"]a//T}Qy%w*Qr8)iع~& ujsLTaR%I~ۢ1ƉBE0sp8B Ze$m<*h%pE4} ,V-P$ߨہ.~l ɑOw6`  \&9lupǏ?ǑS ζ|_~ N2gK {Is`-]_~5ፘB!-G:2`Μb8rJPę#Ñ_^ka%2ňF+=m4K7̫{~pL]Kv`1ӽN:6o"t{Y,QPu7kc|K,ٶi?MnlvZIL_\Ŀ}Gd>"&G.r&`sM]Y@%%Lc}' ceSQyR,&uJIzn/'͙{`Ӆ%EԗAk@5PJE}Fkڀ`|7lħaIENDB`gx/images/Load_gg.png000664 001750 001750 00000014464 12702465756 015656 0ustar00sergiosergio000000 000000 PNG  IHDRTdlsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/28/11IDATx{p}?gwCW뇌lYK64v0 4%M(CiȄI0M̤LҴ%}%6 P#\# 5&N%Kޯ{;Gm]!ofg={^w~gWiYʑs+F޹޶mBc!i Pk7g]} 4 xٖ@x+*u%f/a6(CI&JRo@"5 -fHS@`1hAS*~e@#x&`%P L0VDSL7bku%λ U>)D*J`#`Lٔ) @=PX"`<+yDƈ Ѐpzѽ Ѱ9\׆v!`r@H{O!J/6x HtͳZ B8" …oC)f }zLJ {*eH'9D` =NJyJ6R:H#ж#\x5Rq"Wi@ڌ" ۲x}[ `HD>@o10jCľB4؈h)ĨL7`p"k6{_VI!4G'NG$z)!čiD+)+z=@' \D-5) l kZ0 qq<.C:/HUE\Mw"}Z蓈[p]C.AZK-9Zys޵[A^"E:՜_gWaMrOYPkmGO"HuDo-}s}`OkC]uBkmݭx-t]w?@TQ/k);y8J hx!bnl#` 1Pb|Sr= x>PZD֙HXr0H)De]0@/!E(]XF5L" $9HGkDq%Y1Rn-hSJ"UDz8H)b8"\  @4 Q@[k<ÁRʂ8q.rN@sjž5Zs\tv !.HpQ@ÊL<[]GP.UJ9i0UwֳI1" F%tYʕ9IkB17v 4[dtGr- un.q6P,7ͥkꫯ^~/_~}LZ;aV#^f0Λy\R:VZ8[vZ4JkR)/N{zxx|q[onz֭[/| gժU\s5Cݻw0<V;Aџw^|i>@9SZ2wktXL:Yv իWVkNJ$Qf`?^DV!q)!k?Od0TGct3l޼RDr9^}D"֚&&&d2y^jƍ+.0 IRXt:M*b޽N|MUUUVb!X% GxDr>1Df0LkRT|gcuu5ܹ6'O ww!'3::Rikkkt822B}}=k֬a֭[#G8;vH8R]]ygf˖-*ɰiӦTSS 0 6@"z$Fz4_@CH:*J%jjj8z(fZWS__ֲ}%\-N}}=/W7ȑ#d2n&'|2 [n^x߯RLLL87o[e˖ѣG<۷WaX{=ܓ,W^y%]s\AWWĞ={Gz'N(LYₑrJ@'?>>>t:;;W]~l6KKK /2===\qgU @:&Hjժr;#;55űcǦ^y}رC}qq}ꚚN1k(,j(HBJ8*L&&''u"P]]]J%|rK/>hڵk_>566yxGI&U=ÇRDNO+{ӦvZ 0c|HfxFJڏ\uثm۶-߹sg"Ljt>WWVڵk{+xz>?~<_(O: uݰeD :#{-@ÚB2ʝ8qbqF@ >|ѣCz(.bQyNS< uV1Q@1ҒZYѡKJ6"=\&JRJutt$y䑠P( ttt````X,/Zk}0 gܹ8y56cG V"\z^J¥q'v{zzv=)QbKg3eQ&Dr#UjR?aĄȜ r`l`KυKO+R8%",DL4@4jbYrf/^lZOTqIu'L"6{_t 1NW2u@uCŞ~7 C$E)0Y0mgV_$ ??WgJz I@lҊXl|8jЈ4Vf`⒩ = 49k$W 1Ÿ:S гfw'@2vE _)Ur+?Z>3k;Z1>ZI@KDk(5dճ\7O J9aqX❯T$ pCp6!K2G)I\f/˹o켕8S^g(G&9΄Vc^Xi6 Ad8})AiS\7g3]i2";Vls94l5Mu|op]7g*ٷ )7' [L2bX}NϏK$%U)gZfyhiLڋR7S&+ Ŕ8l6@;p6cuaY{6_"` {,¯\;^nmu-sV|- yŴ+$C-6&>RdnDo˭kyoſ-wg9-+3'NvՈXd1 l@N!gt⹢@@ V!D`Z ջ6YY0x'HaS9smB:V"1,ϼOM*En-n| Sh՛6nY P?Dd jHZ -wZRΡ(#hu-זxݔ)_mZ"_8uǑL+B h?d5±vj$nYgҭ]HkQgQn\Mt"C@>`zqK ^8mtcuL8:DbN_+k<|ěx wB:4rQRK,6]$u#:hZg4_Z(@ Ċld.d+jErO iʓ~lh!_a' W!!GFc!i!Bܐ6m4Cn2\=oiZH@#A.xeH\Xf"%O7"Y%ȡ#SwK_C@@!ɗ K&̫A/A$l6Yk^FR"D)+* vs"de] |Ʉ!ꠋ|ɀ|;?@8 "G 2 XBs?pSH3rRǐo} IRƔ mG>6|Xm}avuE)]HM~]b عwǐUS΀{/.D D2P6p@^:aW؁s?|YxpewfDB4N"ɹJ!p)wƊ8{δEH>y%6 ]W|#v,7{ Fħ`}I ;^6=tD]$?4ۦwgn&ǯ7N_ݾKi~0AwgщdymkBk x6{sDb3i#UH9hI'\@&D 7xầŰ D:.k~ /:]L> | i+76\8BX kDMv *]#UC!N%[ˑNkjA87!j߀bϵQ{mǐIjjڿ n<0vދx@6L ­י!N4S{9Xۂ1cz,R"S}|#"D"ܸ 3ލpu_4|<m42 g?{qY3?"^2YH/Gz;AgO"d~TA#_sghS?ر ݍtⳈXcO1P4u?MJkͶmnqE;=/vSݦNkK 2؀py~yM#5dיsKgk̑5L"R9ve]@ZsD쿊0 භnaPQffV"SIC b´hi +č_}4 IENDB`core/m68k/000700 001750 001750 00000000000 12703321515 013402 5ustar00sergiosergio000000 000000 gx/images/Load_cd.png000664 001750 001750 00000012111 12702465756 015632 0ustar00sergiosergio000000 000000 PNG  IHDR@\}>sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time06/28/125lIDATx{p\u?ݕ+i%ےX ;V]4j7$-C:thg:ݐi)N&3G>R Ri `!`0Ɩ"zX^v{?]]=,P𙹳{ww9{UV1 Hkk+G܇2`6PUq@z^`H#|$QPz%p:j"Bk4)@'.p8 O7 , `#p-R }1J!p x_!Bljׁ B_d2ڻJZ.'EP FQAĆ!/g"+෭DWɩ p1~"ЬK3"/_BgF \A|Ƥi,662Ȉ'CMƓ[ݐI"~ b?&+TMw-b! G{:0 HL݈*&E׀~Qn \xc9ko'Ϥ<{A?iA,{!ƘE o$@(SGN7HF@.Cxy" LkU ( v?cSk:s5[]JgRU]BM|iԃ8 3EA*~d.F&&A} D#{߰= VblnS jEb餰TfndٚBt8ـh#?|E}^@AD{wv*6YaTN 2܀0*\?bӡQG0&M}ȠEC V|s3nkbjD dp%pC܋a"}O!> rO  iCbdC>W#*FL4 -NH]3Ѽ&[bQXHsUs5Ejjj³g/Y$K‡o۶%bYH\.G*f͚e l2q$ , 6؇۷/UDx1 dF`-r\.vuujjj[Ɩ/_"SYY=o޼u]tuu122BUUضM*jjjbׯg׮]twws-lel{ i\uQ[[˛o߿Çg=:::2?w1̙3nEE|ӸC>C _-؍*:Q~t{{{|Ցj9x Y{|@oo/UUUY`O$JqiooO:t\MB!,ˢ ?;zM`'~sHM}RLeLy#h&s)2 5558pݵkEK,qqqr>}rٳg{wD"J$am˶maP8Ad3ɠ O"Z$]lׇ":b#Hsg&|An(ȑ#S2l6}Y;NP=}4f `]xYfFH˲römWf9qD_L?~|ضmGvؑvN8)ҟXr6Њ*X5|I^|ޅQbhoo=p{{;ϟwF2LTP(yݩa= %AA& df"+9cPTria?!Ɍ;0} lHݢ+,2OsshKܩ<:Q~r4nD#j,%̙"!dF9MI~vv@w#i]Dg/1K}}B/4]`iL30t f`3L%fK43Mif.0 4]`irM>k.ȱ")2܍T~+A7k?F2Qu!uՀd~"{3g!2u>\,H-He$wAZ.HZ|؎o5Β$}Cշ~I_VUm>t<~))}@PZ|$Y&d>Dڋ?W=TGhV`Z5!QEj(`.G6a3Ihz\ Q##fR=!M㿧{&K_he,f*XL%uM3ăފ5M5%D?8Y_G 7 oq* #w'bbS@ ډ>Yqƃ㊗(^gx^߁4x36wۼQJ.d/"/\ҥ곌}'z:*! q z'!3E5b^ '|B׬G4g7ej`r08Z* >IENDB`gx/images/Frame_s2.png000664 001750 001750 00000007462 12702465756 015760 0ustar00sergiosergio000000 000000 PNG  IHDR<}RsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATx{tUՁ߹@@c0\#25bDF*9yrsN/|-Im_o]$m.W^Xq5[4n܍ xI vI= t㚙_?rQJJRz5e$M$UUUnذ釋bI2צY/| sc퍛hݺ z|0tە=A[\`'$ޒK󒓓F)//btل c4{;tٳnIeBEh{g q{.>~׮ۨ;[ 5ztNz*sMwm^BO6l|ĉ5WlܵO==q|NM2KkwN $9>={>8tWAA![I%+IUU]{lߨMn뮩/K*t\ MZls];6ٿ~>2̉%zh1cƏڻwWx ;~[]XUU5\uwCJ+sۙwm_yyGTPPw _Pԫ$ e*|R3nEp٪SfxIe.68:OуlWaaQM.;~2!7@RL%'''w !CR|2m kLsC斾-\2/ <4<Сi}5O`NPv-+/lD),$/9: 4<W,+ =hx$p4<WЋ>kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` kX4<֠ 5hxA` k%Gjkk@DG UWw ֥kjǏw1KnW7}ʪ9rucudi"4SMMGǍ=χ^t _Uiii/)."33c jhW*;}Z\uUYY#rfA\\m; \7^q 1!޿%gGMzfʔI*++wSȠk /ַw 9ڰqSLyaԪN|mC߹EEE}5wÇ*-+`\Z]h 6I#')fohx飩@<ƺsg :I%T$\R&L l۾㋟L\lJJJh5]wFs.E.c$ zM92b.>/}﫵5']SkwT*$()w]u]R%K\m\3Yvc&ݪD͙=kBeZ]zki}ϷKj[fu}}ьԢ꫇Y_^^(_-2]Bq]W8$ k63sD?e.Fkk'o߁ʗ^ ]fEN,mkem뺎뚻.I/)NRK?λ+UYY} % NTAAwۨ8% [&t'dR鵸jx-)ARo[*d}kvG=U2Wdu*dB88*dBYR ]GI-XI7[yuia:r|>GǍִi_W^aٹ mR4–)veezN:=sy% 4XR /gZM[bjUTt~(\\11c35yD-]Η6*2Zʖ4RW;7,"OXȄ^3?e}[ˇ 6tkMξI%-of S®B&Q)vM [zN 'ꅟ.4?CCIENDB`libretro/msvc/msvc-2003-xbox1/stdint.h000664 001750 001750 00000017100 12702465756 020560 0ustar00sergiosergio000000 000000 // ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2008 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef __RARCH_STDINT_H #define __RARCH_STDINT_H #if _MSC_VER && (_MSC_VER < 1600) //pre-MSVC 2010 needs an implementation of stdint.h #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #else //sanity for everything else #include #endif #endif gx/images/Ctrl_xe_1ap.png000664 001750 001750 00000011360 12702465756 016453 0ustar00sergiosergio000000 000000 PNG  IHDRHT!qsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=DIDATx[\U]F#j[cG|*q) !)bCLzHT›♊ TQB ;IQb%El'6qd9lY2\yhh&8Uէ9{{4K ^ N|>NEke@8<^qV9Y@nMFm3T; ~ $nES? |; @͸t`$J&`3:1lEWuQ$h;F?gj(4^Ԣ&UbRsu܍w,V`'pgJe 3jQGHV>Ɛ 7cIchb\KԼ)KP7o"Q5*g7WP$mPh߈q"~O#B6i&?~5|OYM6p  )`0@ xcxAZ~:ƞQlҼ]0IժH0Uzي[ JӤ]d @#M n2$=-dam,Z1iOΌ](.6 ;t"&1T٘`v,t=f#]2ck!J| >'o!j p"wdo>nMQVs|H;hg(AQd#;sR`ng$rHvQ t0pZV0 n6!} 2$nm4QQ_U߯tBRaE܉N#o{= Nq.1h~I(p "W"Z09LoSq٥s e5iBydo8J|V#!őT. tG"y-I6(xi$I=ZCNY|s`8$Z{3hq^%d܄e Ddz1y3!nO+c=lFhD!1'Lb)B+xl!O:|ېg=xr$o!*S.{k@R2MqM\{ʹ'p!Y irDD8}=E}ٗ1o#x?Z17@Ղ&-z ԭV꿑}_ rb%%vH۰]H<[u,5^ÔKUGǁE (Vv^NG4(Z>'㝕g9Kt0= Ff(eяh6cTaMJ n ?€hѯٞr ;LF_$#}(h5~ Z&v*5Jڤ uS{(aܻR<xx_ލb|y\Zt9ZTFb!$#Hbpic<9Gj4/ U˵'KγHbr%qvJ~.kFۅ.(4و$@xuJ(N_Tѻ=lkivAPDI%sHZlL1``DqG ^h xߒR{>q&g`թMH$[up Eө2g) 2$*3BUZ/p$i3&ވUVP$\ v[hxh0JM ZHn [|LAqk\{Jmu^K;{9(k!1|-;rJtUt9J4VYJ`mr#ȃ )QIGc2G؛us!zSl)30@.. W"vIt:q.vF(fύ1koK#upE%ߋhly DWc\MIE{j[ gb-f f#>ZmbQ D< ,䮥Ԗ_E*r$ dE^rףH:&(bPHtuk1ʥxoI/ ;.i+~t> :b(})s dخvi"y1I$OQϷG"tەMh$}7 >p?"4Mq9v97!s!+VSKIJCh%:lpd$aR UZ"c粖ުsd}_Dz]0 rIjxw(1k6m(c*s?cCL}t o<@tILziDDp+yȋo6k)%Y{^ MH1TE+({P6sF=H,GzXre1z4hBT1٠S}'\etϠhp8ж-6$~֠ ە{'E(z)s0AQ)V Jz2ПA.C)B 0 g?ivPVܶ^h%h@8b?!==%&zw$힓=|Vgut3G_GP<@MU.yBv@!6=c(KuՅFWjε1Xט:RAY#1"8JɝvIm+iycr[P964<]zE[\T@x EG):`U~ׁ*(r.~GlD xyvdofU7(W΢4HPtp{~>h5F-G另xw ǿbP2F^w r>RHɧ= g, R1$E>|h4LE`܌Vk@ oJ> ORtny_X43@*m8rY쭎iLc3>Xarg/P6.G7n0 m)TpE/g969.n9dZL~QJT 8zIӽ>RʪY8@4W U6zet쭞Fgmޅ 3%'l c_R)-seZ@fĪ*t@{h>abѶQ>_vPZ2_\<.I \M:u~V<]p=;IF/;ElAeH@QxʀgcuQ"'ctbrf_`EzeT6vPէPaP&jrD_Eʫ|d"Rjgc^l%(3k|vfN1)[D.4"K*`Zlp·~*߀A oE-l!JrPU?wGZ-ԇCK%@}h >PZ-ԇCK%@}h >PZͻ&]Umx:/"]nO\{q=vs< lj?N4\t~4o m俫j4~ots[U֪D_sRUU;ѿ [|"6m1x<~?RUtEv]W_g.IǑ~,3l=B9?/Z ڍOΞsFzҳxn?vפ`WUU{ڏ9T^-d_l:顪v ΐ\tj?R IH X܇N⑪6t1;Dv{[E}Jؾ`v}HR=]ߠ˅Rdٕ'_U(BW"A[Sm'>{.~N/P6f?ru؋| Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ---------------------------------------------------------------------------------------- Gamecube & Wii ports are linked with LIBASND library and includes code distributed under the following license: Copyright (c) 2008 Hermes All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------------------- core/ntsc/changes.txt000664 001750 001750 00000005720 12702465756 015774 0ustar00sergiosergio000000 000000 sms_ntsc Change Log ------------------- sms_ntsc 0.2.3 -------------- - Moved configuration options to sms_ntsc_config.h, making it easier to manage - Greatly clarified and improved demo to read any uncompressed BMP image and write filtered image when done - Improved gamma to be properly applied to each RGB channel, and changed default to compensate for difference between PC monitor and TV gamma - Improved contrast to be properly applied to each RGB channel rather than just luma - Improved floating point calculations in library to be more stable and not need double precision, which was causing problems with the sharpness control on Windows when the DirectX libraries changed the FPU to single precision mode - Added extern "C" to header, allowing use in C++ without having to rename the source file - Made internal changes to factor out code common from all my NTSC filter libraries, greatly simplifying things for me sms_ntsc 0.2.2 -------------- - Changed sms_ntsc_blit() again, this time to always take a pixel count for input pitch (since the type is known) and a byte count for the output pitch (since it can output at multiple depths now). I think I've got the right interface this time. :) - Improved default blitter to have selectable input and output pixel formats - Added parameters for resolution, color bleed, and artifacts - Added presets for composite video, S-video, RGB, and monochrome - Added SMS_NTSC_OUT_WIDTH() and SMS_NTSC_IN_WIDTH() for calculating input/output widths - Improved demo with more controls and interpolation and darkening of scanlines rather than duplicating them - Improved documentation - Interface changes: sms_ntsc_blit() takes output pitch in bytes again. Sorry for the multiple changes; I think I got it right this time. :) - Removed: SMS_NTSC_CALC_WIDTH (use SMS_NTSC_OUT_WIDTH) sms_ntsc 0.2.1 -------------- - Added parameters for color fringing and edge artifacts sms_ntsc 0.2.0 -------------- - Changed sms_ntsc_blit() to take pixel counts instead of byte counts for in_pitch and out_pitch, making it simpler to use. This requires that current code be updated. - Significantly improved NTSC signal processing to give clearer image and better sharpness control - Reduced scrolling shimmer and color artifacts to be closer to what console generates - Added gamma curve parameter to allow better matching of darker colors on a TV - Added ability to generate matching RGB palette for use in a normal blitter sms_ntsc 0.1.1 -------------- - Changed sms_ntsc_blit() to accept 12-bit BGR pixels instead of palette indicies and a separate palette. - Improved sms_ntsc_blit() to accept any input width, allowing all the different screen widths to be handled without complication. Use SMS_NTSC_CALC_WIDTH() to find the output width for a given input width. - Added toggling of left 8 column display to demo sms_ntsc 0.1.0 -------------- - First version core/tremor/COPYING000664 001750 001750 00000002672 12702465756 015222 0ustar00sergiosergio000000 000000 Copyright (c) 2002, Xiph.org Foundation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. core/cart_hw/sram.h000664 001750 001750 00000005201 12702465756 015410 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Backup RAM support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _SRAM_H_ #define _SRAM_H_ typedef struct { uint8 detected; uint8 on; uint8 custom; uint32 start; uint32 end; uint32 crc; uint8 *sram; } T_SRAM; /* Function prototypes */ extern void sram_init(); extern unsigned int sram_read_byte(unsigned int address); extern unsigned int sram_read_word(unsigned int address); extern void sram_write_byte(unsigned int address, unsigned int data); extern void sram_write_word(unsigned int address, unsigned int data); /* global variables */ extern T_SRAM sram; #endif core/cd_hw/000700 001750 001750 00000000000 12703321515 013701 5ustar00sergiosergio000000 000000 core/cart_hw/sram.c000664 001750 001750 00000016644 12702465756 015420 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Backup RAM support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" T_SRAM sram; /**************************************************************************** * A quick guide to external RAM on the Genesis * * The external RAM definition is held at offset 0x1b0 of the ROM header. * * 1B0h: dc.b 'RA', %1x1yz000, %abc00000 * 1B4h: dc.l RAM start address * 1B8h: dc.l RAM end address * x 1 for BACKUP (not volatile), 0 for volatile RAM * yz 10 if even address only * 11 if odd address only * 00 if both even and odd address * 01 others (serial EEPROM, RAM with 4-bit data bus, etc) * abc 001 if SRAM * 010 if EEPROM (serial or parallel) * other values unused * * Assuming max. 64k backup RAM throughout ****************************************************************************/ void sram_init() { memset(&sram, 0, sizeof (T_SRAM)); /* backup RAM data is stored above cartridge ROM area, at $800000-$80FFFF (max. 64K) */ if (cart.romsize > 0x800000) return; sram.sram = cart.rom + 0x800000; /* initialize Backup RAM */ memset(sram.sram, 0xFF, 0x10000); sram.crc = crc32(0, sram.sram, 0x10000); /* retrieve informations from header */ if ((READ_BYTE(cart.rom,0x1b0) == 0x52) && (READ_BYTE(cart.rom,0x1b1) == 0x41)) { /* backup RAM detected */ sram.detected = 1; /* enable backup RAM */ sram.on = 1; /* retrieve backup RAM start & end addresses */ sram.start = READ_WORD_LONG(cart.rom, 0x1b4); sram.end = READ_WORD_LONG(cart.rom, 0x1b8); /* autodetect games with wrong header infos */ if (strstr(rominfo.product,"T-26013") != NULL) { /* Psy-O-Blade (wrong header) */ sram.start = 0x200001; sram.end = 0x203fff; } /* fixe games indicating internal RAM as volatile external RAM (Feng Kuang Tao Hua Yuan) */ else if (sram.start == 0xff0000) { /* backup RAM should be disabled */ sram.on = 0; } /* fixe other bad header informations */ else if ((sram.start > sram.end) || ((sram.end - sram.start) >= 0x10000)) { sram.end = sram.start + 0xffff; } } else { /* autodetect games with missing header infos */ if (strstr(rominfo.product,"T-50086") != NULL) { /* PGA Tour Golf */ sram.on = 1; sram.start = 0x200001; sram.end = 0x203fff; } else if (strstr(rominfo.product,"ACLD007") != NULL) { /* Winter Challenge */ sram.on = 1; sram.start = 0x200001; sram.end = 0x200fff; } else if (strstr(rominfo.product,"T-50286") != NULL) { /* Buck Rogers - Countdown to Doomsday */ sram.on = 1; sram.start = 0x200001; sram.end = 0x203fff; } else if (((rominfo.realchecksum == 0xaeaa) || (rominfo.realchecksum == 0x8dba)) && (rominfo.checksum == 0x8104)) { /* Xin Qigai Wangzi (use uncommon area) */ sram.on = 1; sram.start = 0x400001; sram.end = 0x40ffff; } else if ((strstr(rominfo.ROMType,"SF") != NULL) && (strstr(rominfo.product,"001") != NULL)) { /* SF-001 */ sram.on = 1; if (rominfo.checksum == 0x3e08) { /* last revision (use bankswitching) */ sram.start = 0x3c0001; sram.end = 0x3cffff; } else { /* older revisions (use uncommon area) */ sram.start = 0x400001; sram.end = 0x40ffff; } } else if ((strstr(rominfo.ROMType,"SF") != NULL) && (strstr(rominfo.product,"004") != NULL)) { /* SF-004 (use bankswitching) */ sram.on = 1; sram.start = 0x200001; sram.end = 0x203fff; } else if (strstr(rominfo.international,"SONIC & KNUCKLES") != NULL) { /* Sonic 3 & Knuckles combined ROM */ if (cart.romsize == 0x400000) { /* Sonic & Knuckle does not have backup RAM but can access FRAM from Sonic 3 cartridge */ sram.on = 1; sram.start = 0x200001; sram.end = 0x203fff; } } /* auto-detect games which need disabled backup RAM */ else if (strstr(rominfo.product,"T-113016") != NULL) { /* Pugsy (does not have backup RAM but tries writing outside ROM area as copy protection) */ sram.on = 0; } else if (strstr(rominfo.international,"SONIC THE HEDGEHOG 2") != NULL) { /* Sonic the Hedgehog 2 (does not have backup RAM) */ /* this prevents backup RAM from being mapped in place of mirrored ROM when using S&K LOCK-ON feature */ sram.on = 0; } /* by default, enable backup RAM for ROM smaller than 2MB */ else if (cart.romsize <= 0x200000) { /* 64KB static RAM mapped to $200000-$20ffff */ sram.start = 0x200000; sram.end = 0x20ffff; sram.on = 1; } } } unsigned int sram_read_byte(unsigned int address) { return sram.sram[address & 0xffff]; } unsigned int sram_read_word(unsigned int address) { address &= 0xfffe; return (sram.sram[address + 1] | (sram.sram[address] << 8)); } void sram_write_byte(unsigned int address, unsigned int data) { sram.sram[address & 0xffff] = data; } void sram_write_word(unsigned int address, unsigned int data) { address &= 0xfffe; sram.sram[address] = data >> 8; sram.sram[address + 1] = data & 0xff; } core/cart_hw/svp/svpdoc.txt000664 001750 001750 00000060223 12702465756 017151 0ustar00sergiosergio000000 000000 ------------------------------------------------------------------------------- notaz's SVP doc $Id: svpdoc.txt 349 2008-02-04 23:13:59Z notaz $ Copyright 2008, Grazvydas Ignotas (notaz) ------------------------------------------------------------------------------- If you use this, please credit me in your work or it's documentation. Tasco Deluxe should also be credited for his pioneering work on the subject. Thanks. Use monospace font and disable word wrap when reading this document. ------------------------------------------------------------------------------- Table of Contents ------------------------------------------------------------------------------- 0. Introduction 1. Overview 2. The SSP160x DSP 2.1. General registers 2.2. External registers 2.3. Pointer registers 2.4. The instruction set 3. Memory map 4. Other notes ------------------------------------------------------------------------------- 0. Introduction ------------------------------------------------------------------------------- This document is an attempt to provide technical information needed to emulate Sega's SVP chip. It is based on reverse engineering Virtua Racing game and on various internet sources. None of information provided here was verified on the real hardware, so some things are likely to be inaccurate. The following information sources were used while writing this document and emulator implementation: [1] SVP Reference Guide (annotated) and SVP Register Guide (annotated) by Tasco Deluxe < tasco.deluxe @ gmail.com > http://www.sharemation.com/TascoDLX/SVP%20Reference%20Guide%202007.02.11.txt http://www.sharemation.com/TascoDLX/SVP%20Register%20Guide%202007.02.11.txt [2] SSP1610 disassembler written by Pierpaolo Prazzoli, MAME source code. http://mamedev.org/ [3] SSP1601 DSP datasheet http://notaz.gp2x.de/docs/SSP1601.pdf [4] DSP page (with code samples) in Samsung Semiconductor website from 1997 retrieved from Internet Archive: The Wayback Machine http://web.archive.org/web/19970607052826/www.sec.samsung.com/Products/dsp/dspcore.htm [5] Sega's SVP Chip: The Road not Taken? Ken Horowitz, Sega-16 http://sega-16.com/feature_page.php?id=37&title=Sega's%20SVP%20Chip:%20The%20Road%20not%20Taken? ------------------------------------------------------------------------------- 1. Overview ------------------------------------------------------------------------------- The only game released with SVP chip was Virtua Racing. There are at least 4 versions of the game: USA, Jap and 2 different Eur revisions. Three of them share identical SSP160x code, one of the Eur revisions has some differences. From the software developer's point of view, the game cartridge contains at least: * Samsung SSP160x 16-bit DSP core, which includes [3]: * Two independent high-speed RAM banks, accessed in single clock cycle, 256 words each. * 16 x 16 bit multiply unit. * 32-bit ALU, status register. * Hardware stack of 6 levels. * 128KB of DRAM. * 2KB of IRAM (instruction RAM). * Memory controller with address mapping capability. * 2MB of game ROM. [5] claims there is also "2 Channels PWM" in the cartridge, but it's either not used or not there at all. Various sources claim that SSP160x is SSP1601 which is likely to be true, because the code doesn't seem to use any SSP1605+ features. ------------------------------------------------------------------------------- 2. The SSP160x DSP ------------------------------------------------------------------------------- SSP160x is 16-bit DSP, capable of performing multiplication + addition in single clock cycle [3]. It has 8 general, 8 external and 8 pointer registers. There is a status register which has operation control bits and condition flags. Condition flags are set/cleared during ALU (arithmetic, logic) operations. It also has 6-level hardware stack and 2 internal RAM banks RAM0 and RAM1, 256 words each. The device is only capable of addressing 16-bit words, so all addresses refer to words (16bit value in ROM, accessed by 68k through address 0x84 would be accessed by SSP160x using address 0x42). [3] mentions interrupt pins, but interrupts don't seem to be used by SVP code (actually there are functions which look like interrupt handler routines, but they don't seem to do anything important). 2.1. General registers ---------------------- There are 8 general registers: -, X, Y, A, ST, STACK, PC and P ([2] [4]). Size is given in bits. 2.1.1. "-" Constant register with all bits set (0xffff). Also used for programming external registers (blind reads/writes, see 2.2). size: 16 2.1.2. "X" Generic register. Also acts as a multiplier 1 for P register. size: 16 2.1.3. "Y" Generic register. Also acts as a multiplier 2 for P register. size: 16 2.1.4. "A" Accumulator. Stores the result of all ALU (but not multiply) operations, status register is updated according to this. When directly accessed, only upper word is read/written. Low word can be accessed by using AL (see 2.2.8). size: 32 2.1.5. "ST" STatus register. Bits 0-9 are CONTROL, other are FLAG [2]. Only some of them are actually used by SVP. Bits: fedc ba98 7654 3210 210 - RPL "Loop size". If non-zero, makes (rX+) and (rX-) respectively modulo-increment and modulo-decrement (see 2.3). The value shows which power of 2 to use, i.e. 4 means modulo by 16. 43 - RB Unknown. Not used by SVP code. 5 - ST5 Affects behavior of external registers. See 2.2. 6 - ST6 Affects behavior of external registers. See 2.2. According to [3] (5,6) bits correspond to hardware pins. 7 - IE Interrupt enable? Not used by SVP code. 8 - OP Saturated value? Not used by SVP code. 9 - MACS MAC shift? Not used by SVP code. a - GPI_0 Interrupt 0 enable/status? Not used by SVP code. b - GPI_1 Interrupt 1 enable/status? Not used by SVP code. c - L L flag. Similar to carry? Not used by SVP code. d - Z Zero flag. Set after ALU operations, when all 32 accumulator bits become zero. e - OV Overflow flag. Not used by SVP code. f - N Negative flag. Set after ALU operations, when bit31 in accumulator is 1. size: 16 2.1.6. "STACK" Hardware stack of 6 levels [3]. Values are "pushed" by directly writing to it, or by "call" instruction. "Pop" is performed by directly reading the register or by "ret" instruction. size: 16 2.1.7. "PC" Program Counter. Can be written directly to perform a jump. It is not clear if it is possible to read it (SVP code never does). size: 16 2.1.8. "P" multiply Product - multiplication result register. Always contains 32-bit multiplication result of X, Y and 2 (P = X * Y * 2). X and Y are sign-extended before performing the multiplication. size: 32 2.2. External registers ----------------------- The external registers, as the name says, are external to SSP160x, they are hooked to memory controller in SVP, so by accessing them we actually program the memory controller. They act as programmable memory access registers or external status registers [1]. Some of them can act as both, depending on how ST5 ans ST6 bits are set in status register. After a register is programmed, accessing it causes reads/writes from/to external memory (see section 3 for the memory map). The access may also cause some additional effects, like incremental of address, associated with accessed register. In this document and my emu, instead of using names EXT0-EXT7 from [4] I used different names for these registers. Those names are from Tasco Deluxe's [1] doc. All these registers can be blind-accessed (as said in [1]) by performing (ld -, PMx) or (ld PMx, -). This programs them to access memory (except PMC, where the effect is different). All registers are 16-bit. 2.2.1. "PM0" If ST5 or ST6 is set, acts as Programmable Memory access register (see 2.2.7). Else it acts as status of XST (2.2.4). It is also mapped to a15004 on 68k side: ???????? ??????10 0: set, when SSP160x has written something to XST (cleared when 015004 is read by 68k) 1: set, when 68k has written something to a15000 or a15002 (cleared on PM0 read by SSP160x) Note that this is likely to be incorrect, but such behavior is OK for emulation to work. 2.2.2. "PM1" Programmable Memory access register. Only accessed with ST bits set by SVP code. 2.2.3. "PM2" Same as PM1. 2.2.4. "XST" If ST5 or ST6 is set, acts as Programmable Memory access register (only used by memory test code). Else it acts as eXternal STatus register, which is also mapped to a15000 and a15002 on 68k side. Affects PM0 when written to. 2.2.5. "PM4" Programmable Memory access register. Not affected by ST5 and ST6 bits, always stays in PMAR mode. 2.2.6. "EXT5" Not used by SVP, so not covered by this document. 2.2.7. "PMC" Programmable Memory access Control. It is set using 2 16bit writes, first address, then mode word. After setting PMAC, PMx should be blind accessed using (ld -, PMx) or (ld PMx, -) to program it for reading or writing external memory respectively. Every PMx register can be programmed to access it's own memory location with it's own mode. Registers are programmed separately for reading and writing. Reading PMC register also shifts it's state (from "waiting for address" to "waiting for mode" and back). Reads always return address word related to last PMx register accessed, or last address word written to PMC (whichever event happened last before PMC read). The address word contains bits 0-15 of the memory word-address. The mode word format is as follows: dsnnnv?? ???aaaaa a: bits 16-20 of memory word-address. n: auto-increment value. If set, after every access of PMx, word-address value related to it will be incremented by (words): 1 - 1 5 - 16 2 - 2 6 - 32 3 - 4 7 - 128 4 - 8 d: make auto-increment negative - decrement by count listed above. s: special-increment mode. If current address is even (when accessing programmed PMx), increment it by 1. Else, increment by 32. It is not clear what happens if d and n bits are also set (never done by SVP). v: over-write mode when writing, unknown when reading (not used). Over-write mode splits the word being written into 4 half-bytes and only writes those half-bytes, which are not zero. When auto-increment is performed, it affects all 21 address bits. 2.2.8. "AL" This register acts more like a general register. If this register is blind-accessed, it is "dummy programmed", i.e. nothing happens and PMC is reset to "waiting for address" state. In all other cases, it is Accumulator Low, 16 least significant bits of accumulator. Normally reading acc (ld X, A) you get 16 most significant bits, so this allows you access the low word of 32bit accumulator. 2.3. Pointer registers ---------------------- There are 8 8-bit pointer registers rX, which are internal to SSP160x and are used to access internal RAM banks RAM0 and RAM1, or program memory indirectly. r0-r3 (ri) point to RAM0, r4-r7 (rj) point to RAM1. Each bank has 256 words of RAM, so 8bit registers can fully address them. The registers can be accessed directly, or 2 indirection levels can be used [ (rX), ((rX)) ]. They work similar to * and ** operators in C, only they use different types of memory and ((rX)) also performs post-increment. First indirection level (rX) accesses a word in RAMx, second accesses program memory at address read from (rX), and increments value in (rX). Only r0,r1,r2,r4,r5,r6 can be directly modified (ldi r0, 5), or by using modifiers. 3 modifiers can be applied when using first indirection level (optional): + : post-increment (ld a, (r0+) ). Increment register value after operation. Can be made modulo-increment by setting RPL bits in status register (see 2.1.5). - : post-decrement. Also can be made modulo-decrement by using RPL bits in ST. +!: post-increment, unaffected by RPL (probably). These are only used on 1st indirection level, so things like ( ld a, ((r0+)) ) and (ld X, r6-) are probably invalid. r3 and r7 are special and can not be changed (at least Samsung samples [4] and SVP code never do). They are fixed to the start of their RAM banks. (They are probably changeable for ssp1605+, Samsung's old DSP page claims that). 1 of these 4 modifiers must be used on these registers (short form direct addressing? [2]): |00: RAMx[0] The very first word in the RAM bank. |01: RAMx[1] Second word |10: RAMx[2] ... |11: RAMx[3] 2.4. The instruction set ------------------------ The Samsung SSP16 series assembler uses right-to-left notation ([2] [4]): ld X, Y means value from Y should be copied to X. Size of every instruction is word, some have extension words for immediate values. When writing an interpreter, 7 most significant bits are usually enough to determine which opcode it is. encoding bits are marked as: rrrr - general or external register, in order specified in 2.1 and 2.2 (0 is '-', 1 'X', ..., 8 is 'PM0', ..., 0xf is 'AL') dddd - same as above, as destination operand ssss - same as above, as source operand jpp - pointer register index, 0-7 j - specifies RAM bank, i.e. RAM0 or RAM1 i* - immediate value bits a* - offset in internal RAM bank mm - modifier for pointer register, depending on register: r0-r2,r4-r6 r3,r7 examples 0: (none) |00 ld a, (r0) cmp a, (r7|00) 1: +! |01 ld (r0+!), a ld (r7|01), a 2: - |10 add a, (r0-) 3: + |11 cccc - encodes condition, only 3 used by SVP, see check_cond() below ooo - operation to perform Operation is written in C-style pseudo-code, where: program_memory[X] - access program memory at address X RAMj[X] - access internal RAM bank j=0,1 (RAM0 or RAM1), word offset X RIJ[X] - pointer register rX, X=0-7 pr_modif_read(m,X) - read pointer register rX, applying modifier m: if register is r3 or r7, return value m else switch on value m: 0: return rX; 1: tmp = rX; rX++; return tmp; // rX+! 2: tmp = rX; modulo_decrement(rX); return tmp; // rX- 3: tmp = rX; modulo_increment(rX); return tmp; // rX+ the modulo value used (if used at all) depends on ST RPL bits (see 2.1.5) check_cond(c,f) - checks if a flag matches f bit: switch (c) { case 0: return true; case 5: return (Z == f) ? true : false; // check Z flag case 7: return (N == f) ? true : false; // check N flag } // other conditions are possible, but they are not used update_flags() - update ST flags according to last ALU operation. sign_extend(X) - sign extend 16bit value X to 32bits. next_op_address() - address of instruction after current instruction. 2.4.1. ALU instructions All of these instructions update flags, which are set according to full 32bit accumulator. The SVP code only checks N and Z flags, so it is not known when exactly OV and L flags are set. Operations are performed on full A, so (andi A, 0) would clear all 32 bits of A. They share the same addressing modes. The exact arithmetic operation is determined by 3 most significant (ooo) bits: 001 - sub - subtract (OP -=) 011 - cmp - compare (OP -, flags are updated according to result) 100 - add - add (OP +=) 101 - and - binary AND (OP &=) 110 - or - binary OR (OP |=) 111 - eor - exclusive OR (OP ^=) syntax encoding operation OP A, s ooo0 0000 0000 rrrr A OP r << 16; OP A, (ri) ooo0 001j 0000 mmpp A OP RAMj[pr_modif_read(m,jpp)] << 16; OP A, adr ooo0 011j aaaa aaaa A OP RAMj[a] << 16; OPi A, imm ooo0 1000 0000 0000 A OP i << 16; iiii iiii iiii iiii op A, ((ri)) ooo0 101j 0000 mmpp tmp = pr_modif_read(m,jpp); A OP program_memory[RAMj[tmp]] << 16; RAMj[tmp]++; op A, ri ooo1 001j 0000 00pp A OP RIJ[jpp] << 16; OPi simm ooo1 1000 iiii iiii A OP i << 16; There is also "perform operation on accumulator" instruction: syntax encoding operation mod cond, op 1001 000f cccc 0ooo if (check_cond(c,f)) switch(o) { case 2: A >>= 1; break; // arithmetic shift case 3: A <<= 1; break; case 6: A = -A; break; // negate A case 7: A = abs(A); break; // absolute val. } // other operations are possible, but // they are not used by SVP. 2.4.2. Load (move) instructions These instructions never affect flags (even ld A). If destination is A, and source is 16bit, only upper word is transfered (same thing happens on opposite). If dest. is A, and source is P, whole 32bit value is transfered. It is not clear if P can be destination operand (probably not, no code ever does this). Writing to STACK pushes a value there, reading pops. It is not known what happens on overflow/underflow (never happens in SVP code). ld -, - is used as a nop. syntax encoding operation ld d, s 0000 0000 dddd ssss d = s; ld d, (ri) 0000 001j dddd mmpp d = RAMj[pr_modif_read(m,jpp)]; ld (ri), s 0000 010j ssss mmpp RAMj[pr_modif_read(m,jpp)] = s; ldi d, imm 0000 1000 dddd 0000 d = i; iiii iiii iiii iiii ld d, ((ri)) 0000 101j dddd mmpp tmp = pr_modif_read(m,jpp); d = program_memory[RAMj[tmp]]; RAMj[tmp]++; ldi (ri), imm 0000 110l 0000 mmpp RAMj[pr_modif_read(m,jpp)] = i; iiii iiii iiii iiii ld adr, a 0000 111j aaaa aaaa RAMj[a] = A; ld d, ri 0001 001j dddd 00pp d = RIJ[jpp]; ld ri, s 0001 010j ssss 00pp RIJ[jpp] = s; ldi ri, simm 0001 1jpp iiii iiii RIJ[jpp] = i; ld d, (a) 0100 1010 dddd 0000 d = program_memory[A[31:16]]; // read a word from program memory. Offset // is the upper word in A. 2.4.3. Program control instructions Only 3 instructions: call, ret (alias of ld PC, STACK) and branch. Indirect jumps can be performed by simply writing to PC. syntax encoding operation call cond, addr 0100 100f cccc 0000 if (check_cond(c,f)) { aaaa aaaa aaaa aaaa STACK = next_op_address(); PC = a; } bra cond, addr 0100 110f cccc 0000 if (check_cond(c,f)) PC = a; aaaa aaaa aaaa aaaa ret 0000 0000 0110 0101 PC = STACK; // same as ld PC, STACK 2.4.4. Multiply-accumulate instructions Not sure if (ri) and (rj) really get loaded into X and Y, but multiplication result surely is loaded into P. There is probably optional 3rd operand (1, 0; encoded by bit16, default 1), but it's not used by SVP code. syntax encoding operation mld (rj), (ri) 1011 0111 nnjj mmii A = 0; update_flags(); X = RAM0[pr_modif_read(m,0ii)]; Y = RAM1[pr_modif_read(m,1jj)]; P = sign_extend(X) * sign_extend(Y) * 2 mpya (rj), (ri) 1001 0111 nnjj mmii A += P; update_flags(); X = RAM0[pr_modif_read(m,0ii)]; Y = RAM1[pr_modif_read(m,1jj)]; P = sign_extend(X) * sign_extend(Y) * 2 mpys (rj), (ri) 0011 0111 nnjj mmii A -= P; update_flags(); X = RAM0[pr_modif_read(m,0ii)]; Y = RAM1[pr_modif_read(m,1jj)]; P = sign_extend(X) * sign_extend(Y) * 2 ------------------------------------------------------------------------------- 3. Memory map ------------------------------------------------------------------------------- The SSp160x can access it's own program memory, and external memory through EXT registers (see 2.2). Program memory is read-execute-only, the size of this space is 64K words (this is how much 16bit PC can address): byte address word address name 0- 7ff 0- 3ff IRAM 800-1ffff 400-ffff ROM There were reports that SVP has internal ROM, but fortunately they were wrong. The location 800-1ffff is mapped from the same location in the 2MB game ROM. The IRAM is read-only (as SSP160x doesn't have any means of writing to it's program memory), but it can be changed through external memory space, as it's also mapped there. The external memory space seems to match the one visible by 68k, with some differences: 68k space SVP space word address name 0-1fffff 0-1fffff 0- fffff game ROM 300000-31ffff 300000-31ffff 180000-18ffff DRAM ? 390000-3907ff 1c8000-1c83ff IRAM 390000-39ffff ? ? "cell arrange" 1 3a0000-3affff ? ? "cell arrange" 2 a15000-a15009 n/a n/a Status/control registers The external memory can be read/written by SSP160x (except game ROM, which can only be read). "cell arrange" 1 and 2 are similar to the one used in SegaCD, they map 300000-30ffff location to 390000-39ffff and 3a0000-3affff, where linear image written to 300000 can be read as VDP patterns at 390000. Virtua Racing doesn't seem to use this feature, it is only used by memory test code. Here is the list of status/control registers (16bit size): a15000 - w/r command/result register. Visible as XST for SSP160x (2.2.4). a15002 - mirror of the above. a15004 - status of command/result register (see 2.2.1). a15006 - possibly halts the SVP. Before doing DMA from DRAM, 68k code writes 0xa, and after it's finished, writes 0. This is probably done to prevent SVP accessing DRAM and avoid bus clashes. a15008 - possibly causes an interrupt. There is (unused?) code which writes 0, 1, and again 0 in sequence. ------------------------------------------------------------------------------- 4. Other notes ------------------------------------------------------------------------------- The game has arcade-style memory self-check mode, which can be accessed by pressing _all_ buttons (including directions) on 3-button controller. There was probably some loopback plug for this. SVP seems to have DMA latency issue similar to one in Sega CD, as the code always sets DMA source address value larger by 2, then intended for copy. This is even true for DMAs from ROM, as it's probably hooked through SVP's memory controller. The entry point for the code seems to be at address 0x800 (word 0x400) in ROM, but it is not clear where the address is fetched from when the system powers up. The memory test code also sets up "ld PC, .." opcodes at 0x7f4, 0x7f8 and 0x7fc, which jump to some routines, possibly interrupt handlers. This means that mentioned addresses might be built-in interrupt vectors. The SVP code doesn't seem to be timing sensitive, so it can be emulated without knowing timing of the instructions or even how fast the chip is clocked. Overclocking doesn't have any effect, underclocking causes slowdowns. Running 10-12M instructions/sec (or possibly less) is sufficient. gx/images/Button_sm_blue.png000664 001750 001750 00000005511 12702465756 017274 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/25/10ru IDATxݚ{lTם?w'ƉǞcؠ݄tBRidlP)aRuwjMդlBJIt7I5#Ih81v?ǽc<㱁4J~׾G9};sp]+0}ݷo͝r8MMMh WSM,^؝1cF4t}gPfWzhsΝģ" RQQy]5hV9~8;VX/w}˱,P0ؾ}Ww/YdZAAK.o&??hIJIss3=nOGj[lIeeb-[F]]_gT8ǎX,f7ڵtMM͖3gzO8QC/wަ'F<6"?Y. qPJٹs'oaÆ{yƠfaVUUm`ݺu\^E/覠$DAi5#ON M/<V Ls2NUN:SĨ;PJh[P_Q{掠v1L|5cdgRl hj Ĵ:Ul9 SJV8Z(A_[ݓm(yrssטIuu^U?8a+A*LaJU.Bhl["@)C]_KympBWy^oI)YriI0GjrJ#JY^B  122j |>ߟX`HHS73g43{h&l!6ZZPv&icDʔ+**hooޫJ0Z,SAWѳZ'\,Km!m%S7p?J)R +DJy~U$&!Fʬ4.P$Il3udڝL;pZ8n mvrS͝,C<'wC\rƶllD sL"QY 20gϞ-p]2 q*a$fr_yX)H9HHmF]Iq풖(AvʃsPJ&PYY9Z_ f쫵$Җjq5me ,[`Yvj5D^ѴN R$"TH07e|{{;EEE=^|8`Pǹ֌>|St J UIeXivr({̑J4GPV<v6VQG2$A^^~O0|{^֙ijt24w}~kpQJ!aYa旅*LGX#;Qu1#PJ"ԩSvww?blڴB[[^`Μ9@iax<5=.:o$EqQ=1glҊGq1#Gw%??4y'zmmmPvc=8%) 0̸ɤ-dy`SXz#R"JeKzdI۸y_،;x<Ι3gľ!{ᇩWN0 }udN=ZK{NiD2f:q!Y|aD/30w0ȲGu^|E,X: 2]&>z;O_ТuT]uDz!a>~+öm8{exxϼ'gΜFٳggθpbzgWS:r8i_?TrC8 o%ƌ}r?m;mi"d߾}8q1caPHAݺuO>p8ݻ-}bM%iwWO[I:VeBX9ۗ.$XX>qCKW|/cNmiiz 6mD-hv/n.@/zI"4MLɓ455z¿D"Capo7b,bڵYϗKC'uq@-"H¡CfS>Wq2R_QYYIee%f" RRRBAA'( {q9qg͚RꞮK\+ mmH$yxxx@N"OYY_xYN|>|W9Pc'f26پIENDB`gx/images/Main_options.png000664 001750 001750 00000016522 12702465756 016756 0ustar00sergiosergio000000 000000 PNG  IHDR<X>sBIT|d pHYs B4tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$IDATx|yteI֤MCtI[l"`("  n:2q223љeZ J[ K&mɻ|@2e<|\'\r?}?wK< %/V aY|'n>я7Cnݺuٔ)Sz7o^c& @ ёW_;uԸd\.8NZ___F4-"Bs$ǠAB\<" ( }o.>iٲeo嵶I)H$A@B Bplj6Z\.?h`0qd2~?$ bbb JT*?)))ZNNT8HR4 \ P(@䅾֟O F0d]./ 1J I,V+x1U` <a$ $q@ H$Ve̙෿mt…UUUH$MVB~,2]wu fbD~ .Q%|zD|UUhTz٠ Iz|D IшB__, xMӠiAH t"11Æ ABZ"!D";++C=rS;wGuuuyP* OLL CAP\&62nшEQZO > xYE\.8NIB!pGi4,+25_ ^/!H" *nh4ՔeqNNsl֭w:t'NL\.6bEV'111\EE?Eph)ʠZ>5K H.>{111{fϞpҤIx/<|C>/d2x<<# B*bȑ^~7E0)62bMx˲P(1b%K~zG O8QsWw5rE\.2!!<@UIIEQIzzgx^*773mڴFòjǎeoҷo>sW$$$4߰ݻwnݺ"![N{oԩyG{{G ÌӵZ-﻽1,p\lBBZ?D" @Çe9s4MN<c6Z&L e&b4YP>}ZrP((قe2$I0.} ~?PLƱ,kyQ.ۏl6* ~$I fSGGG}) 84{7Iv~KKKqww7IQTf[[x ^jnnֈb^VSSSM3gCee꒒E`0x믿@[[ԦTO&&&B$btB" --￿T~y3z^ݲev?~>~Tb 4mOOO槟~ӧ|>_$Fx@bnwGħ o{.@TF B&aǎ ͛gԔؼy~JVTz$I0 bN 8aܹxW //VҖ<"VW_}ugCC% ! #R*B,_")hZhւ6F*:ubl6@ '`ۑ\H$F455.6l؀ BRfaĉxwDH t.kEtt4bbb>O֦r\d4lF@P$%<"G v;F^z zZFww7֬Y\x(J߿ܹs )1 #d=>W`?p8;v7x/yyyUf9;.DP@zT*jx HpeNEZZVZx/Mۋ$jl޼[lA||<8㐙_\UUaΝ; hz}@ hx-Coۻ,Z;O|>13njMWMdӱflذ>,^ox )) Vd ~D?Lzˣ㻮ǴCG]e0JLD0VEIIG˗/@U/Z|`"]zupJ$( X,fPT ngaԀ bT*98c%SEg8|0 e#Y($&&[Je\.G(|RdH&tuuA#..P$IB&AP@(EDzl8WiΘbdffBp }ǥn"Ba/,|nbс'O>vryݡCfLzzz  l O@cc#;s=1b @&9''gn4Mofho^1bbqc?VEX zzzC:;;L&G>5MhL=w Dd6&&aч~xJR>䓘8qb$JiPA@" ''jҤIL<@@޽{gZW===.h4HLL,/xjzkhh(u:m64 Fya/<裫Fyr M&h4ʥR)NzdСļdɒ-eee;b}|[o8D"dff\hscǎmzIOzzz`H/rBLӉcǎj)))%rKkodRF={6%??GFFMl,_ @ rϟ?PHZmxܹxwZVK//@QQQH$PTHII+dɒ/'`Yͨömۨ%Ks=4Y_wѣ8EO;zb{{{a__t:JKKmЌP,_\e( hڈyE`PVp']z}ӧ+@T&3i[0n̘11c`|[[[eYYY-cǎ}yES3EQh4Ұ~),G___ .k&rCP\p 0 j5Je{gF+z|7fΜyp簏$ɌCfd2Qkk+"gY D4ȡ$zqo+,B`b ~Ȑ!F Vh9#**iX,4q H$NC$A( CQ  ;::Z_xU, ?Uǎp:B@aPRRKbA^-A\k$(ݸq`Ϟ=p:{^xbbbZ^EtttD"{ ӧ#GV3(=W2//UP8h4yKn#X,X,A6mLb#%ەDZk YG"@.-wtZVpׁYC @zr"!D*µ-{ww7nJT>_ਰozjp8dp# /sM8Ye!J1j(̛7ƍч~(ڴiF#|> d2Ӯ/Mٴ4L4 !;;'OƄ  ˏX,zg7.gͨM5jhKy~ n; _y>y@2?y7L<˲m<)0CCNиx6n q[ۂou|[-Vm:n q[ۂou'ZoK>ZM̽[x>\2adJNNG}g UQQ]$1Gv…{ k֬?999XYY[aĚ5k&67745k{l#hTn߾}':t йy酅ݥs>}Ǐkj5sw4}gϞohnn.NJJ}>o/'NXzU紩eZ9eDhZ`0|s ;s;ˆ m޼e՚?|~(*Y`+^WrܹUUUuttD-X7e\&O=;?ɓEZp8HyyyD-v644|=dȐI3fx={__vi 6l{NNȤkX~c/,,|pҤI[ trIee'ŕIIIL&a`0D'O_Wϟ6lض񕕕+P;w\?h<@yE4@˲V R(oӧN͞=D2^Pcƌ7nz7%͛7J@ $IN8M6fە@MII=SO\4MN'Օs{b"III?|p#&Iz?5k+-RrJࢢ G vQDii?SRR Xժ8[TTK[rB˲)))3fi̙SRRv]n۳)6l!Cdgg?J* 1bTTTl萧r3fؿhѢWu:7w 8tIENDB`core/cd_hw/cd_cart.h000664 001750 001750 00000005255 12702465756 015513 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD compatible ROM/RAM cartridge support * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ /* CD compatible ROM/RAM cartridge */ typedef struct { uint8 area[0x840000]; /* cartridge ROM/RAM area (max. 8MB ROM / 64KB backup memory + Pro Action Replay 128KB ROM / 64KB RAM) */ uint8 boot; /* cartridge boot mode (0x00: boot from CD with ROM/RAM cartridge enabled, 0x40: boot from ROM cartridge with CD enabled) */ uint8 id; /* RAM cartridge ID (related to RAM size, 0 if disabled) */ uint8 prot; /* RAM cartridge write protection */ uint32 mask; /* RAM cartridge size mask */ } cd_cart_t; /* Function prototypes */ extern void cd_cart_init(void); libretro/msvc/msvc-2010/msvc-2010.vcxproj000664 001750 001750 00000021451 12702465756 021012 0ustar00sergiosergio000000 000000  Debug Win32 Release Win32 {29DF2EE7-2930-4BD3-8AC5-81A2534ACC99} Win32Proj msvc2010 msvc-2010 DynamicLibrary true Unicode DynamicLibrary false true Unicode $(SolutionDir)msvc-2010\$(Configuration)\ $(SolutionDir)msvc-2010\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MSVC2010_EXPORTS;_CRT_SECURE_NO_WARNINGS;INLINE=static _inline;__inline__=_inline;__extension__=;LSB_FIRST;__LIBRETRO__;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=LITTLE_ENDIAN $(SolutionDir)/../../core;$(SolutionDir)/../../utils/zlib;$(SolutionDir)/../../core/cart_hw/svp;$(SolutionDir)/../../libretro;$(SolutionDir)/../../core/m68k;$(SolutionDir)/../../core/z80;$(SolutionDir)/../../core/input_hw;$(SolutionDir)/../../core/cart_hw;$(SolutionDir)/../../core/sound;$(SolutionDir)/../../core/ntsc;$(SolutionDir)/../../core/cd_hw;%(AdditionalIncludeDirectories) Windows true libretro.def Level3 MaxSpeed true true WIN32;NDEBUG;_WINDOWS;_USRDLL;MSVC2010_EXPORTS;_CRT_SECURE_NO_WARNINGS;INLINE=static _inline;__inline__=_inline;__extension__=;LSB_FIRST;__LIBRETRO__;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=LITTLE_ENDIAN $(SolutionDir)/../../core;$(SolutionDir)/../../utils/zlib;$(SolutionDir)/../../core/cart_hw/svp;$(SolutionDir)/../../libretro;$(SolutionDir)/../../core/m68k;$(SolutionDir)/../../core/z80;$(SolutionDir)/../../core/input_hw;$(SolutionDir)/../../core/cart_hw;$(SolutionDir)/../../core/sound;$(SolutionDir)/../../core/ntsc;$(SolutionDir)/../../core/cd_hw;%(AdditionalIncludeDirectories) Windows true true true libretro.def gx/gui/font.h000664 001750 001750 00000004705 12702465756 014247 0ustar00sergiosergio000000 000000 /***************************************************************************** * font.c * * IPL font engine (using GX rendering) * * Copyright Eke-Eke (2009-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FONT_H #define _FONT_H extern int FONT_Init(void); extern void FONT_Shutdown(void); extern int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color); extern int FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color); extern int FONT_alignRight(char *string, int size, int x, int y, GXColor color); #endif libretro/msvc/msvc-2010-360/000700 001750 001750 00000000000 12703321515 016315 5ustar00sergiosergio000000 000000 core/ntsc/md_ntsc_config.h000664 001750 001750 00000001635 12702465756 016751 0ustar00sergiosergio000000 000000 /* Configure library by modifying this file */ #ifndef MD_NTSC_CONFIG_H #define MD_NTSC_CONFIG_H /* Format of source & output pixels (RGB555 or RGB565 only)*/ #ifdef USE_15BPP_RENDERING #define MD_NTSC_IN_FORMAT MD_NTSC_RGB15 #define MD_NTSC_OUT_DEPTH 15 #else #define MD_NTSC_IN_FORMAT MD_NTSC_RGB16 #define MD_NTSC_OUT_DEPTH 16 #endif /* Original CRAM format (not used) */ /* #define MD_NTSC_IN_FORMAT MD_NTSC_BGR9 */ /* The following affect the built-in blitter only; a custom blitter can handle things however it wants. */ /* Type of input pixel values (fixed to 16-bit) */ #define MD_NTSC_IN_T unsigned short /* Each raw pixel input value is passed through this. You might want to mask the pixel index if you use the high bits as flags, etc. */ #define MD_NTSC_ADJ_IN( in ) in /* For each pixel, this is the basic operation: output_color = MD_NTSC_ADJ_IN( MD_NTSC_IN_T ) */ #endif core/cd_hw/cd_cart.c000664 001750 001750 00000020430 12702465756 015476 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD compatible ROM/RAM cartridge support * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /*--------------------------------------------------------------------------*/ /* backup RAM cartridge (max. 512KB) */ /*--------------------------------------------------------------------------*/ static unsigned int cart_ram_read_byte(unsigned int address) { /* LSB only */ if (address & 1) { return scd.cartridge.area[(address >> 1) & scd.cartridge.mask]; } return 0xff; } static unsigned int cart_ram_read_word(unsigned int address) { return (scd.cartridge.area[(address >> 1) & scd.cartridge.mask] | 0xff00); } static void cart_ram_write_byte(unsigned int address, unsigned int data) { /* LSB only */ if (address & 1) { scd.cartridge.area[(address >> 1) & scd.cartridge.mask] = data; } } static void cart_ram_write_word(unsigned int address, unsigned int data) { scd.cartridge.area[(address >> 1) & scd.cartridge.mask] = data & 0xff; } /*--------------------------------------------------------------------------*/ /* backup RAM cartridge ID */ /*--------------------------------------------------------------------------*/ static unsigned int cart_id_read_byte(unsigned int address) { /* LSB only */ if (address & 1) { return scd.cartridge.id; } return 0xff; } static unsigned int cart_id_read_word(unsigned int address) { return (scd.cartridge.id | 0xff00); } /*--------------------------------------------------------------------------*/ /* backup RAM cartridge write protection */ /*--------------------------------------------------------------------------*/ static unsigned int cart_prot_read_byte(unsigned int address) { /* LSB only */ if (address & 1) { return scd.cartridge.prot; } return 0xff; } static unsigned int cart_prot_read_word(unsigned int address) { return (scd.cartridge.prot | 0xff00); } static void cart_prot_write_byte(unsigned int address, unsigned int data) { /* LSB only */ if (address & 1) { int i; if (data & 1) { /* cartridge is write enabled */ for (i=0x60; i<0x70; i++) { m68k.memory_map[i].write8 = cart_ram_write_byte; m68k.memory_map[i].write16 = cart_ram_write_word; zbank_memory_map[i].write = cart_ram_write_byte; } } else { /* cartridge is write protected */ for (i=0x60; i<0x70; i++) { m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].write = zbank_unused_w; } } scd.cartridge.prot = data; } } static void cart_prot_write_word(unsigned int address, unsigned int data) { int i; if (data & 1) { /* cartridge is write enabled */ for (i=0x60; i<0x70; i++) { m68k.memory_map[i].write8 = cart_ram_write_byte; m68k.memory_map[i].write16 = cart_ram_write_word; zbank_memory_map[i].write = cart_ram_write_byte; } } else { /* cartridge is write protected */ for (i=0x60; i<0x70; i++) { m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].write = zbank_unused_w; } } scd.cartridge.prot = data & 0xff; } /*--------------------------------------------------------------------------*/ /* ROM/RAM cartridge initialization */ /*--------------------------------------------------------------------------*/ void cd_cart_init(void) { int i; /* System boot mode */ if (scd.cartridge.boot) { /* disable backup RAM cartridge when booting from cartridge (Mode 1) */ scd.cartridge.id = 0; } else { /* enable 512K backup RAM cartridge when booting from CD (Mode 2) */ scd.cartridge.id = 6; } /* RAM cartridge enabled ? */ if (scd.cartridge.id) { /* disable cartridge backup memory */ memset(&sram, 0, sizeof (T_SRAM)); /* clear backup RAM */ memset(scd.cartridge.area, 0x00, sizeof(scd.cartridge.area)); /* backup RAM size mask */ scd.cartridge.mask = (1 << (scd.cartridge.id + 13)) - 1; /* enable RAM cartridge write access */ scd.cartridge.prot = 1; /* RAM cartridge ID register (read-only) */ for (i=0x40; i<0x60; i++) { m68k.memory_map[i].base = NULL; m68k.memory_map[i].read8 = cart_id_read_byte; m68k.memory_map[i].read16 = cart_id_read_word; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = cart_id_read_byte; zbank_memory_map[i].write = zbank_unused_w; } /* RAM cartridge memory */ for (i=0x60; i<0x70; i++) { m68k.memory_map[i].base = NULL; m68k.memory_map[i].read8 = cart_ram_read_byte; m68k.memory_map[i].read16 = cart_ram_read_word; m68k.memory_map[i].write8 = cart_ram_write_byte; m68k.memory_map[i].write16 = cart_ram_write_word; zbank_memory_map[i].read = cart_ram_read_byte; zbank_memory_map[i].write = cart_ram_write_byte; } /* RAM cartridge write protection register */ for (i=0x70; i<0x80; i++) { m68k.memory_map[i].base = NULL; m68k.memory_map[i].read8 = cart_prot_read_byte; m68k.memory_map[i].read16 = cart_prot_read_word; m68k.memory_map[i].write8 = cart_prot_write_byte; m68k.memory_map[i].write16 = cart_prot_write_word; zbank_memory_map[i].read = cart_prot_read_byte; zbank_memory_map[i].write = cart_prot_write_byte; } } else { /* initialize ROM cartridge */ md_cart_init(); /* when booting from CD, cartridge is mapped to $400000-$7FFFFF */ if (!scd.cartridge.boot) { for (i=0; i<0x40; i++) { m68k.memory_map[i+0x40].base = m68k.memory_map[i].base; m68k.memory_map[i+0x40].read8 = m68k.memory_map[i].read8; m68k.memory_map[i+0x40].read16 = m68k.memory_map[i].read16; m68k.memory_map[i+0x40].write8 = m68k.memory_map[i].write8; m68k.memory_map[i+0x40].write16 = m68k.memory_map[i].write16; zbank_memory_map[i+0x40].read = zbank_memory_map[i].read; zbank_memory_map[i+0x40].write = zbank_memory_map[i].write; } } } } sdl/fileio.h000664 001750 001750 00000004513 12702465756 014125 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive. * Returns loaded ROM size (zero if an error occured) * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * modified by Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILEIO_H_ #define _FILEIO_H_ /* Function prototypes */ extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); #endif /* _FILEIO_H_ */ gx/gui/font.c000664 001750 001750 00000025651 12702465756 014245 0ustar00sergiosergio000000 000000 /***************************************************************************** * font.c * * IPL font engine (using GX rendering) * * Copyright Eke-Eke (2009-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #define _SHIFTR(v, s, w) \ ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1))) typedef struct _yay0header { unsigned int id ATTRIBUTE_PACKED; unsigned int dec_size ATTRIBUTE_PACKED; unsigned int links_offset ATTRIBUTE_PACKED; unsigned int chunks_offset ATTRIBUTE_PACKED; } yay0header; static u8 *fontImage; static u8 *fontTexture; static void *ipl_fontarea; static sys_fontheader *fontHeader; static u8 font_size[256]; #ifndef HW_RVL /* disable Qoob Modchip before IPL access (emukiddid) */ static void ipl_set_config(unsigned char c) { volatile unsigned long* exi = (volatile unsigned long*)0xCC006800; unsigned long val,addr; addr=0xc0000000; val = c << 24; exi[0] = ((((exi[0]) & 0x405) | 256) | 48); //select IPL //write addr of IPL exi[0 * 5 + 4] = addr; exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; while (exi[0 * 5 + 3] & 1); //write the ipl we want to send exi[0 * 5 + 4] = val; exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; while (exi[0 * 5 + 3] & 1); exi[0] &= 0x405; //deselect IPL } #endif static void decode_szp(void *src,void *dest) { u32 i,k,link; u8 *dest8,*tmp; u32 loff,coff,roff; u32 size,cnt,cmask,bcnt; yay0header *header; dest8 = (u8*)dest; header = (yay0header*)src; size = header->dec_size; loff = header->links_offset; coff = header->chunks_offset; roff = sizeof(yay0header); cmask = 0; cnt = 0; bcnt = 0; do { if(!bcnt) { cmask = *(u32*)(src+roff); roff += 4; bcnt = 32; } if(cmask&0x80000000) { dest8[cnt++] = *(u8*)(src+coff); coff++; } else { link = *(u16*)(src+loff); loff += 2; tmp = dest8+(cnt-(link&0x0fff)-1); k = link>>12; if(k==0) { k = (*(u8*)(src+coff))+18; coff++; } else k += 2; for(i=0;isheet_format==0x0000) { cnt = (sys_fontdata->sheet_fullsize/2)-1; while(cnt>=0) { idx = _SHIFTR(src[cnt],6,2); val1 = data[idx]; idx = _SHIFTR(src[cnt],4,2); val2 = data[idx]; dest[(cnt<<1)+0] =((val1&0xf0)|(val2&0x0f)); idx = _SHIFTR(src[cnt],2,2); val1 = data[idx]; idx = _SHIFTR(src[cnt],0,2); val2 = data[idx]; dest[(cnt<<1)+1] =((val1&0xf0)|(val2&0x0f)); cnt--; } } DCStoreRange(dest,sys_fontdata->sheet_fullsize); } static void GetFontTexel(s32 c,void *image,s32 pos,s32 stride) { u32 sheets,rem; u32 xoff,yoff; u32 xpos,ypos; u8 *img_start; u8 *ptr1,*ptr2; sys_fontheader *sys_fontdata = fontHeader; if(cfirst_char || c>sys_fontdata->last_char) c = sys_fontdata->inval_char; else c -= sys_fontdata->first_char; sheets = sys_fontdata->sheet_column*sys_fontdata->sheet_row; rem = c%sheets; sheets = c/sheets; xoff = (rem%sys_fontdata->sheet_column)*sys_fontdata->cell_width; yoff = (rem/sys_fontdata->sheet_column)*sys_fontdata->cell_height; img_start = fontImage+(sys_fontdata->sheet_size*sheets); ypos = 0; while(yposcell_height) { xpos = 0; while(xposcell_width) { ptr1 = img_start+(((sys_fontdata->sheet_width/8)<<5)*((ypos+yoff)/8)); ptr1 = ptr1+(((xpos+xoff)/8)<<5); ptr1 = ptr1+(((ypos+yoff)%8)<<2); ptr1 = ptr1+(((xpos+xoff)%8)/2); ptr2 = image+((ypos/8)*(((stride<<1)/8)<<5)); ptr2 = ptr2+(((xpos+pos)/8)<<5); ptr2 = ptr2+(((xpos+pos)%8)/2); ptr2 = ptr2+((ypos%8)<<2); *ptr2 = *ptr1; xpos += 2; } ypos++; } } static void DrawChar(unsigned char c, int xpos, int ypos, int size, GXColor color) { /* reintialize texture object */ GXTexObj texobj; GX_InitTexObj(&texobj, fontTexture, fontHeader->cell_width, fontHeader->cell_height, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texobj, GX_TEXMAP0); /* reinitialize font texture data */ memset(fontTexture,0,fontHeader->cell_width * fontHeader->cell_height / 2); GetFontTexel(c,fontTexture,0,fontHeader->cell_width/2); DCStoreRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2); GX_InvalidateTexAll(); /* adjust texture width */ s32 width = (fontHeader->cell_width * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); /* adjust texture height */ size = (size * vmode->efbHeight) / 480; /* GX rendering */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(xpos, ypos - size); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(0.0, 0.0); GX_Position2s16(xpos + width, ypos - size); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(xpos + width, ypos); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(xpos, ypos); GX_Color4u8(color.r, color.g, color.b, 0xff); GX_TexCoord2f32(0.0, 1.0); GX_End(); GX_DrawDone(); } /**************************************************************************** * IPL font support * ****************************************************************************/ extern void __SYS_ReadROM(void *buf,u32 len,u32 offset); int FONT_Init(void) { #ifndef HW_RVL /* --- Game Cube --- disable Qoob before accessing IPL */ ipl_set_config(6); #endif /* read IPL font (ASCII) from Mask ROM */ ipl_fontarea = memalign(32,131360); if (!ipl_fontarea) return 0; memset(ipl_fontarea,0,131360); __SYS_ReadROM(ipl_fontarea+119072,12288,0x1FCF00); /* YAY0 decompression */ decode_szp(ipl_fontarea+119072,ipl_fontarea); /* retrieve IPL font data */ fontHeader = (sys_fontheader*)ipl_fontarea; fontImage = (u8*)((((u32)ipl_fontarea+fontHeader->sheet_image)+31)&~31); /* expand to I4 format */ expand_font((u8*)ipl_fontarea+fontHeader->sheet_image,fontImage); /* character width table */ int i,c; for (i=0; i<256; ++i) { if ((i < fontHeader->first_char) || (i > fontHeader->last_char)) c = fontHeader->inval_char; else c = i - fontHeader->first_char; font_size[i] = ((u8*)fontHeader)[fontHeader->width_table + c]; } /* initialize texture data */ fontTexture = memalign(32, fontHeader->cell_width * fontHeader->cell_height / 2); if (!fontTexture) { free(ipl_fontarea); return 0; } return 1; } void FONT_Shutdown(void) { if (fontHeader) free(ipl_fontarea); if (fontTexture) free(fontTexture); } int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color) { int w, ox; x -= (vmode->fbWidth / 2); y -= (vmode->efbHeight / 2); ox = x; while (*string) { if (*string == '\n') { x = ox; y += size; } else { w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); if ((x + w) > (ox + max_width)) return strlen(string); DrawChar(*string, x, y, size,color); x += w; } string++; } return 0; } int FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color) { int x; int i = 0; int w = 0; while (string[i] && (string[i] != '\n')) { w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); } if ((x1 + w) > x2) w = x2 - x1; x = x1 + (x2 - x1 - w - vmode->fbWidth) / 2; x2 -= (vmode->fbWidth / 2); y -= (vmode->efbHeight / 2); while (*string && (*string != '\n')) { w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); if ((x + w) > x2) return strlen(string); DrawChar(*string, x, y, size,color); x += w; string++; } if (*string == '\n') { string++; return FONT_writeCenter(string, size, x1, x2 + (vmode->fbWidth / 2), y + size + (vmode->efbHeight / 2), color); } return 0; } int FONT_alignRight(char *string, int size, int x, int y, GXColor color) { int ox; int i = 0; int w = 0; while (string[i] && (string[i] != '\n')) { w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); } x -= (vmode->fbWidth / 2); y -= (vmode->efbHeight / 2); ox = x; x -= w; while (*string && (*string != '\n')) { w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); if ((x + w) > ox) return strlen(string); DrawChar(*string, x, y, size,color); x += w; string++; } if (*string == '\n') { string++; return FONT_alignRight(string, size, ox + (vmode->fbWidth / 2), y + size + (vmode->efbHeight / 2), color); } return 0; } gx/sounds/button_over.pcm000664 001750 001750 00000000240 12702465756 016714 0ustar00sergiosergio000000 000000     sdl/fileio.c000664 001750 001750 00000010764 12702465756 014125 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive into ROM buffer. * Returns loaded ROM size (zero if an error occured) * * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * modified by Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include static int check_zip(char *filename); int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size = 0; if(check_zip(filename)) { unz_file_info info; int ret = 0; char fname[256]; /* Attempt to open the archive */ unzFile *fd = unzOpen(filename); if (!fd) return 0; /* Go to first file in archive */ ret = unzGoToFirstFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Get file informations and update filename */ ret = unzGetCurrentFileInfo(fd, &info, fname, 256, NULL, 0, NULL, 0); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Compressed filename extension */ if (extension) { strncpy(extension, &fname[strlen(fname) - 3], 3); extension[3] = 0; } /* Open the file for reading */ ret = unzOpenCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Retrieve uncompressed file size */ size = info.uncompressed_size; if(size > maxsize) { size = maxsize; } /* Read (decompress) the file */ ret = unzReadCurrentFile(fd, buffer, size); if(ret != size) { unzCloseCurrentFile(fd); unzClose(fd); return 0; } /* Close the current file */ ret = unzCloseCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Close the archive */ ret = unzClose(fd); if(ret != UNZ_OK) return 0; } else { /* Open file */ gzFile gd = gzopen(filename, "rb"); if (!gd) return 0; /* Read file data */ size = gzread(gd, buffer, maxsize); /* filename extension */ if (extension) { strncpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } /* Close file */ gzclose(gd); } /* Return loaded ROM size */ return size; } /* Verifies if a file is a ZIP archive or not. Returns: 1= ZIP archive, 0= not a ZIP archive */ static int check_zip(char *filename) { uint8 buf[2]; FILE *fd = fopen(filename, "rb"); if(!fd) return (0); fread(buf, 2, 1, fd); fclose(fd); if(memcmp(buf, "PK", 2) == 0) return (1); return (0); } gx/utils/000700 001750 001750 00000000000 12703321515 013443 5ustar00sergiosergio000000 000000 gx/sounds/000700 001750 001750 00000000000 12703321515 013616 5ustar00sergiosergio000000 000000 gx/images/Cart_md.png000664 001750 001750 00000056311 12702465756 015670 0ustar00sergiosergio000000 000000 PNG  IHDRdsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/24/11I" IDATxy,]Lw:w,[$[lY<x82 8yᑕXGx mllK%k5\MWw>3ww}sY`骾ksvo~7 co[B5W !Q1VeA&_kc)νze-́l\nmʳ̜XceS3g΃@ܕEAlv繱:眈o2599cT_eg]ފqfrug)C (aË"B#5jdJTDZbd!J e #ƘMnsOD!-ҟz{ˀ^(Z'=)Sr|l@y&| (%p[ "ߺh+|lŢnڱK~OҽuG<#39~G~TeL!Q5)vtq&`@L5bII:Ɓ6p >_ 0QNe\k< xEE92 M>ڲe"ݣtg(; I.=t( 481dQQY;>=T_?DUei]gzO\(L4\ʠVc!FOnj5?v7oI&KFz"X^ʦI6mcӦmlI' xD "di +K,,b nנLg1Khubb&1f'ދo2k4 8>LT VQJ vOo=6M, fOjyȁ7ۓ{X!y\@A%7"}?:'>%iMmcjr3F1JM5P&mJO0NA(Jn=!F$ƓZզtTxc$zoLn3!:{inw:m~vGD0ZW1cL}mW)s΢,w÷1X'rgc`n"9J-Y[zs/ŋWe`Dr#oH/|?~9+ELr2gpEQnD`b$aT)}岃RDnNѥ1dO$%Ed1ڰGNu2'H#O3Lz.l )!zDZX.` _R@ vQ# F/%(E@% h$/68&7⻟NS*+4g58CI]NC"z|Op5 3(}AU|ZB, !e #IB;tʂT"!x_i%Eț :E/~u ~%xІגx-nk⩣?;eDyfhpbj:90-a)X,Q떩=c bQƀ&I.3,$B?o*ζk>l(HpL BAeɉ㉼}. y@ҵ,wU<)+K,--˒v{<!'CY#?x ^ģ{.&x#3|`A!*2cP|h$c.2yfB:cveA c Љk2 #?#o#"ҷL_/^_l8EqNQS%$G4& DC[%H%IunVL[K0ΰydaaw 1$FU%vJb!s=.3d'-8Y5ox˫їH牉@>':FR}n3\,B7,u`B;G,"4 6j bu.=Mf ',{H)/Z)!J[ŒY ,Je=5v]d8rgiXe !3f`z5"ZT 4Rֳv :zZh6bU⁈!"N,6ˉ.éb0}2$rRi@Q}S{8=C`\("`+$sBt@-8$WH$ rVU4^1Fs,9,"Iڝ(DQ`ZVk<+*v*e mt?hʞUR:B%ٚzˏ2j,[X%"^iA&i4 V5jcBDtQD~0ROc^k]+ĪGHFJI@Xci4&=)Nv^jYE`Qgz4!BFO-F1&TnjI:ًUqW+NygIP@Tt;H# XQ\@<5j o>9L69.FQD R;[DL)z :CQr25|HA1m"jxC5K%t\bj/qnn 7|D8 8N~ϖ-iJ'b%ڂ 2g* kk+zg+`WSaQ Db Fr{nUhK+LM޲yrj?LȚ8@$cdד&vxpP(ψ"`]s ;/TKE\;_WW\9i‡}w?/(Ʀ~c[N#ΤF.!Lse7D)I睷p| ZW~s?s'?"67dkk-dk<]A{z#Th5 m4v{  !}ڋPQR;6/Z1f\((j"䯊Aa$@bA(m$8EYu0FlF5#DN=~bӻ7n  /'vݻ2w8<O,`Mdq1PZ 2fy5j< bpRM 2^NeITLJޞN 52+KiYd>Ɖt3E:1HPb(Sħsijx@ۃh%SY6r:YĠ5k\{a'sWnīF{75j9mw|X 81Fl0ERlUlSJ 5NHW ۓH`U(K4rSٙeWnx t~:׽r,BT={ػgͦh5',CZB7lL?P*F O#bXLR!n׏w_vj$nͦ~s_ȧ~w.?KK4'99GdĶ-i jXRY ~BRgDHA'AGܑ!g# 1B(i62۷tU2:29H>>KvƋ.)cGb i%]]s9gH(=g4vը\VSUH9BZd"4[,35Ird JݵW _yKn_/g|ۑc喛抗qpx e gVC@Q1DZ{qcm>CXi)Z`q۔Zci4h?gyR1 jm1[E{o]^9􅗑M)(+mcB{(EQ,Z#(qb.(Z4Dqk򶷿൯Uz~f|?/;?Tcqb(I_jD4n8ڂUy5eunQeN3cOd!nrT/.y[Mm׿)!x,IƌSjPCcsBj]T+x㌐F+/{a[|coz;Naq~{33ܵ 㲔ПU5FŬkpЎ;j(Q#b B4fعsw{:Щf'k_}Ï˟?i ?t=k_ Z1*E%]80>I4Bkb8K5;T*XۿER14&Hږdb.M?//j=z৿ï-_bqnfo=J,玘EzJZy^l&%8f7BTRQnO91jӜDoO{lKx{DQyuxkQLB)WלP$5(FÒeXn7 }Bٳ}ox}e׫R{m) !9D ɫQ !UP5j BP)ҀE)+c)ysfukWxۦ&Y\БݳW\2&/((?bUk8 #}/C7M'kCZ!֭{ =UW_gvdbET'RTliq>ǕͭF/D5jPZ +JψeKM2TSrǏMS_fɻ5֯_ywFӱ|owLN0;}E񒫯5kmqbT3"%T$VUZM|2s=wgt0c< Lz ڌ,g)JMy1"׈ڍT,EϪt5 $Ñ@+ZD(}Dk\q_}g!9:Ƙ~o閛ez^t=r<0E'29 ax{;5Y^kزD,#RFDWr"lgըl .k3 AјS!pV#YfpF`g~ σn9W4){vWfʅn䜽;yŗlĨlH2Xjjj?JT, ΔQ FQPmрX 9BACG;1w_H+GSX%w}gK__kرcbK]#Ҍ*r p*C֨qa(Gq "k8B G+[7O_ *i '{OO}qLo%/mTk SRJ 2u TEԨQa0M?ѷ5`fc;i6q߾/7g?KfV=,tA ;jF j55okHKaI&L`c%BPgS7BVCI 3۷lZ{_H?@{_3|a]+PU-.ejSZ+jiUs=Zmt+H. p05)|I,]??鴌5#'×Jc ǻF-*bӄAuuP0 #vqh|ipbԡ۶,Xkܸ?߼Np=vW-&֥ -djHz;ץ C=ҎׇAZ"z!i=U膳UWgrWxGi//36>u% P,BF 1j8[Q\j!f&!uDHM h -;g{ l:hc?[.γGضm:qBY'V ]T5^j$^~(<"FB*h(YaÇwl4klrE6;q?7D2gQEťEHT)5PNBTnu)*ɇi x/8Dٙ&6O%WQ߾{8>;\t 8tg~eΓRR/LEYz(HXHdxX Fgz&n{1S# >vt[̹BSbB4 % 3pZ 8K!:캄~- K]MbHN GT±7-/=ut+Y 3jSn-jmt"bTuf]DR0'vE^^/;aMQ.(1s ʘ,Q-dRWؒ^׵Q( SAMRE(&qP0ء&Aj69Ïu#" ccccAjbRhYD^iXs I{D% d#j! LNL-O,<܈%)HEb50H)jtk7?5J"V@|Jfhd&[ {.Ä]'Տ6 |.Xտ1Ɩ(d (~hO%01F5cXq`Rto}{|쳟 GbT5ph$(" Wk"j81t}G$W!B.E1?7z;^1/Qy`uSM*IbKEfk5du#"·Vkl=ihSJGP4DDr:DPukH#vlٺ.rY=nXQ}:2TS&3k8ːdAiď 2X@#dU DJlUFF6ư}떥C_w1yWcg0yY3ӟDH cH##Ă5VT _m*3ZDzwõf737K~ne8PX۝p/U -\!HN,yԨlG=l93y:k71,̝ D ٣/R1-KH􁔍$ >_5jXEղVT#>xutD#bt>OcJÐ*=D}X<߿\rEڵCOf^x!N N8G4*ZT5j$h U0X0[0sngvk+Tk__{{'Vf8x{ܾVưj1$Eap8U5Zh :X ` ~n;GCdjybn?/=;11]nS[gտ8>7׀cG9qhuJ;ɢI)DU.UjXBYHmTӨ#"B=9row_ӕavw~w/{БcLMLP_RSH Y[Z@J̪0wʂH\\eHힴBne+>\;|[ѰC)JJMpTKz8j5ٍ3U`-@JY`FC?) 63ݛ>t;z9:1;=߾Vc^*mD(([FzIf =Z5F(` *::.oQ4\ȳJB19ܹ3wIe"M66]rD,JLjI֐,g$PQ\Tv6 !"+8G=qjq^k36&l"pPR3 y@!Ef:HG 73gb0F1b /}57MƜ<~Hw9[cۦ\\_CG7-gH# /#&do5SwH4Q 9iFou"XQBu7x_fӻEPU CQF1t̵ٲ}{?Vo! 1=)՛B,u:h0l X)Pc vtI׵NF5Vp~bmX!ήMGEQk\"kW0`vTR:]E* Brpw{gk_y /zfn%׽ع#A VAFOS,pzjJ$20j+ IxT[ψA-J8 7(Cc G)QJx "+Bws'SO-n0>T{;߷KBIƦIZeL)KĸUUXM*D`dnDd\Ȧ&[ƘBM6-Sm[ݶ;'1)cKKKLLLP*?19n{Wh/{|Tu*qiuzmj@#gq` nA$cv'0sؓ, ؼL;OXb.+5)*bRUuhczDDkP|CE_*j$#DLcpxff򲗿.ZY9/~s5^0ߟ: . :×r3Gcjb5 6 tphA[ ⴬ݚ2pYDHcnl^=j^-@Иzr,PJg{s*IC<|Q:qx 􇔯`1DRWy =4bj Лړ(RGwň>*2 ϻR~9S8r'9HJǘ%ͫ R5JN t]fw~U:Jnۈ%5$I/|;'~g@ʇVDW㶲uCQC}ګ&a嗉S bzڕYq,,jDJP5DͰV L.ues"?#[ݔJojZZ ./IA{y0ؘ<˒<XLګseYbIX3tY20!¿_=|lSɻҟq/_GdqqN%HT08 ՓE@=AQODE+ֆmC2 l/QW D,[*+,|D֭J,ugQc]8f=Bh,KA!'V~-x˚vY7 n2(Ғjct|>W/6[E!㑩#J%M%&r{,Eh ^NtDv!FzD\7:d5_1FU)(ŎPtcHåZOCpK BkKD|Ulah0+"=1*5M{PDC+@lR^U߇qh]3xY ^zWB (k#<6sl#Ç{w_c;˹{XXncl!#3M$JjDۚciZΓڝK>`Q|vb}EީGpim|"}h 9IC :dM-ng1v"v S4PXJXi*bBƦ&l$Ҥ5g9BQm4,+dH1J<*I:%v* &Uc^ .jZP&Z(Yf11sl&jnO8ԧ9x_wWj@%炽1/Z-6JmMEjѳDHž"f5ًH L_ c$Y|Gl+"CA&Da4WGBRE35EA7lݶqv/k5i4Z| 7ۼ-oMw#;wl'%a84 ~q>_>ɕW\˛vwo#tfx8ȧ>Il۳;?[&,O<|OormaŒCkgzăQB$A/4AL=[YC(ژҊeުfCζ(bY.5@0a(KO 0 Q5JQ5{ eV2)ZS-\rW+ve6pΆ#(_rU .VsqG<3+䛅BY6q//%/-:r (XFh/}?ْ3%Y^Zfϖ1>w/}G|?+~>[8qbR~^~|C&2`*A'" \Oq"O Xq}eeHYTµn!ۦkNǢe.)' IeAXɒ!H 2R ؕɄRs뗤hHٖt3g`-Ek,4hٴc>+^Gqwhq!d5x/4aFN7nG]/o{b+w' 1.wp [6y[;O9>ܦ ~7~uP|*FXi{PC 22T9=m} Ar0,g %G d6Gh)dzoLc,;ުt,3\3\DZHdy]Y6Ljc 8bF>İa He'Ql9"Bk("i9 }~=pZ ӬWVխ{'b&{Ѝ I#:"C#:b }+Zމ 6T}0ӂg?G=q<|?s!$Z<h7yk_<>{K=F G6X܊I+ e=lOecd-4Ï~1pGرo[|_|>>Ԯ_AIzHgyI6s" eNtS1L8n c8QdEY|0 y>PN{<~Bԝޑ8)#FFe>ܵ'?S|"/9M`ȳ*Gv~p+r~񾏴۬u.$|<}0s;/`0X_cy G|4Eԉ9r Ͽ-?'0]Rm> nc6UQ֌׆VQ1qżb.@9Eu' dE 5mCta|oF, ZRlߵ ]}. ;g.x=wN'3kʡ _?G[vh'Bgުs%w'up ](|Ï}w|uSŷ~_(k[$)M$7w%2np@X2O^gߋRרK,!~*w Mx '][g2-س۱Yk9~5:>НK/~fU\v9u˫' '5`VXFs};{e}{O~3*^=G{+?yC+YsDg}~ JGi;F [^SVQ }FoUۨmZkY_|(=u~}d?A(K_o}s!!g[+GGcg;ڃ g}vsj b3ܹw\8 賗ؽMS 8r6~ W _Bn0X1I6LHsRѥe%޼x'n'/Ň 7f1y~K H"S/qRـ^WVi{cӔ||œڷIS=dq)c!珟8cx2*$-_-<ף1+1MIiu.A"z6IDATf[BEA q2cGbh{# zo۞ ? ೟ܽG?ė~ᇹ;X1-N/yKm~^= ư/\#su4֊ s]S(lE"|M0GOWO8{ {Ofe}ͱogʟ|u{ TIV0eXC z*5iBRń^rzYFNΚ=THᯣKHܢ! m~>O'\9#w?VWWٻgCw/v)Tx^eN Ǿ )wd;nk<~?~,{ط奋tZhu,xqt7skW'i"czk˼t8U 21`}X/ڤiB-2@Fiȑ۹p`C{:Q9?Gxo|^9^gGsvMvLHRp<]ďO_ĉlkgoXS;̥3]S'#.T:K?*s'i>!urdl">E~h0׳ٱ_4[;Hsu8V]^8~V`]Z8&' >x.7m18]7XB̏U3b7HmPI>x}_K5+8 06VRB^gm{N߃2GBo|j0&>c)$"0Qd3 dN8"Zm4hJ_?){_[v/(waqqA.\X=\"{I{ . \%mα˝2Z_x%uOa,hk G$OiHv#XTs4,F 7xD=$o!)2e"?#?';L9>a#Iۤ)]_}7r$:?ge@o͙{|?ˏ|\jMv?抠̵-s6+sYCĔf@n[pfA^04z=BXQZC ^66VUeB *k)riy^vIaJs|~x4Ӏ>}Uy!pƲcҦC ^r5QmZ4P^Al_Mk,&d=n.8HRn>2Ѳ ϦI_/bfoaJt"~L>؎ew,/"}a.GE<1|y???{G{vR$`+y~wn[XGbR㜰D&4j9߱X]ssJ4!E ^p shQ," &di$$1t}!Aضm{wFb.gU͝8p'^K[LVPBYޥ?pFovZ#bq囕[2ܽc(;{<2"Y\* HBFm#8C(X~! K65𽲢M|PD1]#U>||A XjIƢy/`-&LYȟJ2mB }R$ 8v9j%rȳ5Z`HHi%;ljpKEs Xz3^?{~s._\>RZFL8 F-rY|a'hLv*R[d7عm6 s}BQཏce7II-_mS1fa&P4@*m=j$m %&,oFoQofVͲCר$A#Ms>j DLjJ-UXvJivD`0DĠ$I3m+\D/ Uzwl$EQeeuϖ(qѶJI/ ݕY s1I \;ⳫO?"VTL^'b'gzE֋>IÀC4$Xl.  3X(3⽲L+/M IѡЄצߺ{klv12&?P8rj%o&8®=٩#1(:С4]WP3{Dc^KNz L JR͔f#Z;ˈy:W#N:ʇ£}~zbkgte䋢rO+ f[{ws/ 7YS4PuA &[#yrra2סF%c>kXT %4/ECѰ8j27V~̩'Ο=Hm2p8Gtd]%2r60GyOo-R#ȋ 5٨sl "~ɖ9* (-2XfF[.dTSP(Qll'xnOdJ@^0t:mJQ>NJn*UN.'>z$I8Z@Cf ^d.]>TêGD4?uX{{}Ύ ~A@ š;k/YDk*yH4>V&uJ/-O~snFT0B&1[R{fXɔl̓6-I?Ysci$o(a+D{X$2q5ڪHT+| H{`=W}?~?ru r.,fkW0.:UHi4EFs,aJwҹ:y|bY C(Qi p,/.2e ij{v5N,^t֖νeFzgA\#]!JD&^"J[]ar@k׏_}nw[gi lm$7h0$e;$f`)e#~~I5;搦ϽŴצJ\Ǩףn=UUo.[(*ji#riylq3ɼ"^%J:6oV4_wۀjl߳ (BIR7' Z-{߉ |w<݌{n&+NVG#rչ#!\eqǙKdu"2bxWtI?~sI^ fg:3 y芍i_Ƽď@oA3If14VX#3cɛ)>\E (NvȤohW񸤭vNsWi,sXg9=쬴֪$Jزĝ}@T~Cɗ&<MdtAc[D/cf9? ar<)i`B;TX'tLw;'Aj~q%Ky0pϵnw5S S`E6fD#26j(Sf*O5+ Z <߰ƪh?~6*w;*L]9od"/c"HYBQ @s߸:1˼57Ʌ~*{ʼɏ nFFc71;<*1Š`kcj1N!7Hj\B ba%Ĉ ?6ns~uld` Tjd$'璄%zgULZ/MISҼ| XkUbrTXh|$G]iH#DuϞ>ZPjZ!_];]"y,Rݢn& ebs|}{PbNChj-'lqʎcFEΥ@+NYu,0HLn"T),2[<&shPC5+C 4Ѩ ^KLJ(s~yD$IB_:>"qSS&O5/Wb.5. !OqsF6y5ZçP%AƎΫ%kzU!Lf*ƔLcc^kr *Tjqr]'{/1* \n,lv@nc-Fc7[ EzbZE:w.Z"f\ +Fv0UbL9U4>ixEoIJx !kLDC4.ibTۅy`ޢbc*\4r\UyaD f`0pBo5;uL IENDB`gx/images/Banner_bottom.png000664 001750 001750 00000011140 12702465756 017077 0ustar00sergiosergio000000 000000 PNG  IHDRdsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/12/09'IDATxo\u~3@EHVYR"ujRQ]<_qZ6ڽ?z^ uU)be%%i8q؞s~^9c'cېxgf7?^VBejjA]I7>Kx8I$U{IuIim&@]IUH,iqae^xG}+$4|((y|3o%>%Ir iIҲq … a;7 s{vuAomtn-w'O 0|,.>|KJ%b !@?az5joWoU{{oQ*C`:fZ=^$1lp5v-\9K/_W^ez+k0 wv?uyktpsNth522zoW_UŖ+­+`ځucn\0a1 L=m~}dW Psҭ7'sssWΜ9SNyWNW ~Ak\;7ݨ^!e} tB?mk>Keͩ`1eRwrD'5}އӧO:{o/?O\[si}؈b7h}gXWfwێҵmnԏیk'?˲Kefvx-oYҒ;q}#74ϯ{?99ٳgyKO+^Kx l`7>~M>? ajӓ>ssW^OfkZM_|x˿ uR/)׶bw᱋ݵCvvb;W"I{o1\uz6āa}wdP=VWqz\B+ߏuS4ڵw:vٳg``` )붆Ȑsn4C_ZZZHӴEQի~HGQTT*{`WWn$Q'T%IJe@r%!˲oʲ,Kʍ7 X$8ưPG 7(b\T/Uܧﴻw"B;. +μgf453O.\~ hUo\T<EN89)(Ժ|PO5Π,M2-&]KOЙn_\xޫvڝZ'v&!NBGf߷}I>7Ƃuo?" j>on :zB~䚏ȹ)и~_0__Rh<_lk)xBVѳ'<%4XeAz>.M-/hʂ+zUց`O%RE"8vDܚ&AY%ݰ}wjmDz?ܦøfj[٢h6{͓_O+sP(|Yme|lDivij3S_e}6S<79wG5Zߏy'QM_AzuGm[=^rg3YacmFuy6Yzhs+OZ8CXFT,(?/%}CQOI7rZ_ΞKwoj˽X10gܹVVcK޽B=6zlYR}{͡1˚sT_^=6zlcFS=-%>eA=6zlcV۠F=6zl{O"zlcF[LOcF=.옣{=6zlc==6zlcF{Xl=6zlc=L0=zlcF[{8zlcF[`cF=~I <0=6zlcF[{F=6zlcvO"yɗg vcF=6zl(6cF=6zlޓd zlcF[GC=6zlc~HcF=~DcF=6zl/Go9 =C=C=iISp̙eq+2C=C=YPU$IWp劓X9i>_=C=C=Ue=>bDJS8rC=C=tz(RVCvsN!z@=C=COg%q09C=C=YI.w-D=C=COg%zonb (z衇z衇z:+qN=y |i#=C=C=AE=6zlcA+ kW=6zlcF[{סˀ=6zlcF=IPɖ@1cF=6zlغ `cF=~IT 6cF=6zl]I}4cF=6zlupy&`zlcF=n`cF=~FQ$rCz衇z衇z:+חEnUD7e&I4ME=C=COg%{{J+WXT9T !RI47 z衇z衇z:+jQe]T*TqC=C=AIEJӴ+W9kuI=C=C=%Iҵ+k9'z6F=6zlcEO佗sW*5w\{ =C=C=S'pcIENDB`libretro/msvc/msvc-2010-360.sln000664 001750 001750 00000004577 12702465756 017103 0ustar00sergiosergio000000 000000  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genesis-next-msvc-2010-360", "msvc-2010-360\msvc-2010-360.vcxproj", "{00CE82EC-E948-4BB6-B726-23BF1571B05A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CodeAnalysis|Xbox 360 = CodeAnalysis|Xbox 360 Debug|Xbox 360 = Debug|Xbox 360 Profile_FastCap|Xbox 360 = Profile_FastCap|Xbox 360 Profile|Xbox 360 = Profile|Xbox 360 Release_LTCG|Xbox 360 = Release_LTCG|Xbox 360 Release|Xbox 360 = Release|Xbox 360 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {00CE82EC-E948-4BB6-B726-23BF1571B05A}.CodeAnalysis|Xbox 360.ActiveCfg = CodeAnalysis|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.CodeAnalysis|Xbox 360.Build.0 = CodeAnalysis|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.CodeAnalysis|Xbox 360.Deploy.0 = CodeAnalysis|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile_FastCap|Xbox 360.ActiveCfg = Profile_FastCap|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile_FastCap|Xbox 360.Build.0 = Profile_FastCap|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile_FastCap|Xbox 360.Deploy.0 = Profile_FastCap|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile|Xbox 360.ActiveCfg = Profile|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile|Xbox 360.Build.0 = Profile|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Profile|Xbox 360.Deploy.0 = Profile|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release_LTCG|Xbox 360.ActiveCfg = Release_LTCG|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release_LTCG|Xbox 360.Build.0 = Release_LTCG|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release_LTCG|Xbox 360.Deploy.0 = Release_LTCG|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release|Xbox 360.Build.0 = Release|Xbox 360 {00CE82EC-E948-4BB6-B726-23BF1571B05A}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal core/sound/blip_buf.h000664 001750 001750 00000005411 12702465756 015734 0ustar00sergiosergio000000 000000 /** Sample buffer that resamples from input clock rate to output sample rate \file */ /* blip_buf $vers */ #ifndef BLIP_BUF_H #define BLIP_BUF_H #ifdef __cplusplus extern "C" { #endif /** First parameter of most functions is blip_t*, or const blip_t* if nothing is changed. */ typedef struct blip_t blip_t; /** Creates new buffer that can hold at most sample_count samples. Sets rates so that there are blip_max_ratio clocks per sample. Returns pointer to new buffer, or NULL if insufficient memory. */ blip_t* blip_new( int sample_count ); /** Sets approximate input clock rate and output sample rate. For every clock_rate input clocks, approximately sample_rate samples are generated. */ void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, clock_rate must not be greater than sample_rate*blip_max_ratio. */ blip_max_ratio = 1 << 20 }; /** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ void blip_clear( blip_t* ); /** Adds positive/negative delta into buffer at specified clock time. */ void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); /** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); /** Length of time frame, in clocks, needed to make sample_count additional samples available. */ int blip_clocks_needed( const blip_t*, int sample_count ); enum { /** Maximum number of samples that can be generated from one time frame. */ blip_max_frame = 4000 }; /** Makes input clocks before clock_duration available for reading as output samples. Also begins new time frame at clock_duration, so that clock time 0 in the new time frame specifies the same clock as clock_duration in the old time frame specified. Deltas can have been added slightly past clock_duration (up to however many clocks there are in two output samples). */ void blip_end_frame( blip_t*, unsigned int clock_duration ); /** Number of buffered samples available for reading. */ int blip_samples_avail( const blip_t* ); /** Reads and removes at most 'count' samples and writes them to to every other element of 'out', allowing easy interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed samples. Returns number of samples actually read. */ int blip_read_samples( blip_t*, short out [], int count); /* Same as above function except sample is added to output buffer previous value */ /* This allows easy mixing of different blip buffers into a single output stream */ int blip_mix_samples( blip_t* m, short out [], int count); /** Frees buffer. No effect if NULL is passed. */ void blip_delete( blip_t* ); /* Deprecated */ typedef blip_t blip_buffer_t; #ifdef __cplusplus } #endif #endif psp2/osd.h000664 001750 001750 00000001357 12702465756 013550 0ustar00sergiosergio000000 000000 #ifndef _OSD_H_ #define _OSD_H_ #include #include #include #include #include #include "shared.h" #include "config.h" #include "error.h" #include "unzip.h" #include "fileio.h" extern void osd_input_update(void); #define GG_ROM "./ggenie.bin" #define AR_ROM "./areplay.bin" #define SK_ROM "./sk.bin" #define SK_UPMEM "./sk2chip.bin" #define CD_BIOS_US "./bios_CD_U.bin" #define CD_BIOS_EU "./bios_CD_E.bin" #define CD_BIOS_JP "./bios_CD_J.bin" #define MD_BIOS "./bios_MD.bin" #define MS_BIOS_US "./bios_U.sms" #define MS_BIOS_EU "./bios_E.sms" #define MS_BIOS_JP "./bios_J.sms" #define GG_BIOS "./bios.gg" #endif /* _OSD_H_ */ gx/images/000700 001750 001750 00000000000 12703321515 013550 5ustar00sergiosergio000000 000000 gx/images/Frame_s3.png000664 001750 001750 00000010537 12702465756 015756 0ustar00sergiosergio000000 000000 PNG  IHDR$Er sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09IDATxit7; 7 Ka\"Ȱ( uFt^iuR[j{k2@-DHYdF=!ϼx{sCٓ 9Ϲx};nq\Ugq $'|(]nԭ+UN TvAAA۟srrxdXRRw2҃7$''}+%9_ZԔ̌:sʖPm(*?P\Rh3ͯ QQ:P'=H8ٛ~5eIuu*-+WQqJL5566t;S(!!^)}R?3Cdjp@럡>}RTQQհowcx=I-9|=RGI[,x{8oݒ$5*2N%(s#_K.RO k;%pݫ.xn22e+g/NR"VL'2LG$W6ܳ7&''W[o8yzBPc=~g!FqjRxw c{&Nכns^CNddu9`z% S"q鈃 _8"{]ykaf5SE`5 Zh҇z*%U&y a.^ʹx/6nI@O1Q,_ԓ=!\0U+RKGv]F#Gw׻ iǎ]0]?;-|_I*7LUjuQ ޱxi܋QFN={USSm z"5(qv @+4gܮU?sV+@sXM2w<_I*WK^k[Imjv( >k/wݪi r󽒊G yoMyK@%?{ؑrhP.>}=Mkos⭷>^$(Q3pm[NTv9oŚv葦OJ̘:kWH%+jy']$F6N@Op홽nio,ܑWx dOtzWNzEnQ"/i8Nn a&^>ÏVPGN4}U)C w ]n@/?T 6w)v٫J͜u]>R%(fI]RVVN4U9"{$yC'|(q'_hxz_n׈I/oG8I%ktʪ ?> (I $$;TYU}g Gm|O^G)A^1[@t}dl޽OWC0$]{4az)2Jߧt_d6@Vkx @}lN-81 kxDPHFB0Lq+B5x 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B` 3($fPH̠A!0B`-gLw4fT+*&PW[64;<ښZ)2BG̥@UuqcCڮsC]7sRow$KT"i%I*Tn޼׳fN+檱#8=4zz'ȫI͒GSVI#e xm7:f4vwƌoC+}$UKj {29}}\}R5Ï(RGM.j%ɫfy%r' )iWWWfnzz8p5JJLhϓ7:5*=g_^HTnK Jj~O߻>;\+QfϚaCܹsO^4KjWF5.j)VIɕtw^s7ϝP|\UW?`Qל3䯞ZWVVZ#RjyET-ҭQ5)0OU](3*+k~7'2FEe8 ypMQ#nvn H `ܨg,YRV,5yxMzʚKKKBjQKQMﴸ1aK7IAI>OMzZSS?W(U'zMrͼvd{vUYY_E}V+kю8HG)YRZ8op2҃qEE%bWڶc'}R=\ATVz%Kw{;wSqQQ5yU(2Ht12HRQ_}KUd%ϘuĉW^5f衃 jjUZZE:pHUjljT]]ZZZN,&>>^IIJJLPffdj`?FUQHe."U٣t#o (RK^KM ߟ$oG m?N@Wowȯ"jOMm"UԢIp 5 QqJMRdU(;R5BĿQ/b K)N^㔠%F(V8)v:ȿLk:ѿ<;! Im$/&#v$6H}4Gݶ=Yt2'q҃?N@!1@]%[e[᷆Ny?;DuwNyAT`_oGP&r)51IENDB`core/sound/blip_buf.c000664 001750 001750 00000026230 12702465756 015731 0ustar00sergiosergio000000 000000 /* blip_buf $vers. http://www.slack.net/~ant/ */ /* Modified for Genesis Plus GX by EkeEke (01/09/12) */ /* - disabled assertions checks (define #BLIP_ASSERT to re-enable) */ /* - fixed multiple time-frames support & removed m->avail */ /* - modified blip_read_samples to always output to stereo streams */ /* - added blip_mix_samples function (see blip_buf.h) */ #include "blip_buf.h" #ifdef BLIP_ASSERT #include #endif #include #include #include /* Library Copyright (C) 2003-2009 Shay Green. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #if defined (BLARGG_TEST) && BLARGG_TEST #include "blargg_test.h" #endif /* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000. Avoids constants that don't fit in 32 bits. */ #if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF typedef unsigned long fixed_t; enum { pre_shift = 32 }; #elif defined(ULLONG_MAX) typedef unsigned long long fixed_t; enum { pre_shift = 32 }; #else typedef unsigned fixed_t; enum { pre_shift = 0 }; #endif enum { time_bits = pre_shift + 20 }; static fixed_t const time_unit = (fixed_t) 1 << time_bits; enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */ enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */ enum { half_width = 8 }; enum { buf_extra = half_width*2 + end_frame_extra }; enum { phase_bits = 5 }; enum { phase_count = 1 << phase_bits }; enum { delta_bits = 15 }; enum { delta_unit = 1 << delta_bits }; enum { frac_bits = time_bits - pre_shift }; /* We could eliminate avail and encode whole samples in offset, but that would limit the total buffered samples to blip_max_frame. That could only be increased by decreasing time_bits, which would reduce resample ratio accuracy. */ struct blip_t { fixed_t factor; fixed_t offset; int size; int integrator; }; typedef int buf_t; /* probably not totally portable */ #define SAMPLES( buf ) ((buf_t*) ((buf) + 1)) /* Arithmetic (sign-preserving) right shift */ #define ARITH_SHIFT( n, shift ) \ ((n) >> (shift)) enum { max_sample = +32767 }; enum { min_sample = -32768 }; #define CLAMP( n ) \ {\ if ( n > max_sample ) n = max_sample;\ else if ( n < min_sample) n = min_sample;\ } #ifdef BLIP_ASSERT static void check_assumptions( void ) { int n; #if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF #error "int must be at least 32 bits" #endif assert( (-3 >> 1) == -2 ); /* right shift must preserve sign */ n = max_sample * 2; CLAMP( n ); assert( n == max_sample ); n = min_sample * 2; CLAMP( n ); assert( n == min_sample ); assert( blip_max_ratio <= time_unit ); assert( blip_max_frame <= (fixed_t) -1 >> time_bits ); } #endif blip_t* blip_new( int size ) { blip_t* m; #ifdef BLIP_ASSERT assert( size >= 0 ); #endif m = (blip_t*) malloc( sizeof *m + (size + buf_extra) * sizeof (buf_t) ); if ( m ) { m->factor = time_unit / blip_max_ratio; m->size = size; blip_clear( m ); #ifdef BLIP_ASSERT check_assumptions(); #endif } return m; } void blip_delete( blip_t* m ) { if ( m != NULL ) { /* Clear fields in case user tries to use after freeing */ memset( m, 0, sizeof *m ); free( m ); } } void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) { double factor = time_unit * sample_rate / clock_rate; m->factor = (fixed_t) factor; #ifdef BLIP_ASSERT /* Fails if clock_rate exceeds maximum, relative to sample_rate */ assert( 0 <= factor - m->factor && factor - m->factor < 1 ); #endif /* Avoid requiring math.h. Equivalent to m->factor = (int) ceil( factor ) */ if ( m->factor < factor ) m->factor++; /* At this point, factor is most likely rounded up, but could still have been rounded down in the floating-point calculation. */ } void blip_clear( blip_t* m ) { /* We could set offset to 0, factor/2, or factor-1. 0 is suitable if factor is rounded up. factor-1 is suitable if factor is rounded down. Since we don't know rounding direction, factor/2 accommodates either, with the slight loss of showing an error in half the time. Since for a 64-bit factor this is years, the halving isn't a problem. */ m->offset = m->factor / 2; m->integrator = 0; memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) ); } int blip_clocks_needed( const blip_t* m, int samples ) { fixed_t needed; #ifdef BLIP_ASSERT /* Fails if buffer can't hold that many more samples */ assert( (samples >= 0) && (((m->offset >> time_bits) + samples) <= m->size) ); #endif needed = (fixed_t) samples * time_unit; if ( needed < m->offset ) return 0; return (needed - m->offset + m->factor - 1) / m->factor; } void blip_end_frame( blip_t* m, unsigned t ) { m->offset += t * m->factor; #ifdef BLIP_ASSERT /* Fails if buffer size was exceeded */ assert( (m->offset >> time_bits) <= m->size ); #endif } int blip_samples_avail( const blip_t* m ) { return (m->offset >> time_bits); } static void remove_samples( blip_t* m, int count ) { buf_t* buf = SAMPLES( m ); int remain = (m->offset >> time_bits) + buf_extra - count; m->offset -= count * time_unit; memmove( &buf [0], &buf [count], remain * sizeof buf [0] ); memset( &buf [remain], 0, count * sizeof buf [0] ); } int blip_read_samples( blip_t* m, short out [], int count) { #ifdef BLIP_ASSERT assert( count >= 0 ); if ( count > (m->offset >> time_bits) ) count = m->offset >> time_bits; if ( count ) #endif { buf_t const* in = SAMPLES( m ); buf_t const* end = in + count; int sum = m->integrator; do { /* Eliminate fraction */ int s = ARITH_SHIFT( sum, delta_bits ); sum += *in++; CLAMP( s ); *out = s; out += 2; /* High-pass filter */ sum -= s << (delta_bits - bass_shift); } while ( in != end ); m->integrator = sum; remove_samples( m, count ); } return count; } int blip_mix_samples( blip_t* m, short out [], int count) { #ifdef BLIP_ASSERT assert( count >= 0 ); if ( count > (m->offset >> time_bits) ) count = m->offset >> time_bits; if ( count ) #endif { buf_t const* in = SAMPLES( m ); buf_t const* end = in + count; int sum = m->integrator; do { /* Eliminate fraction */ int s = ARITH_SHIFT( sum, delta_bits ); sum += *in++; /* High-pass filter */ sum -= s << (delta_bits - bass_shift); /* Add current buffer value */ s += *out; CLAMP( s ); *out = s; out += 2; } while ( in != end ); m->integrator = sum; remove_samples( m, count ); } return count; } /* Things that didn't help performance on x86: __attribute__((aligned(128))) #define short int restrict */ /* Sinc_Generator( 0.9, 0.55, 4.5 ) */ static short const bl_step [phase_count + 1] [half_width] = { { 43, -115, 350, -488, 1136, -914, 5861,21022}, { 44, -118, 348, -473, 1076, -799, 5274,21001}, { 45, -121, 344, -454, 1011, -677, 4706,20936}, { 46, -122, 336, -431, 942, -549, 4156,20829}, { 47, -123, 327, -404, 868, -418, 3629,20679}, { 47, -122, 316, -375, 792, -285, 3124,20488}, { 47, -120, 303, -344, 714, -151, 2644,20256}, { 46, -117, 289, -310, 634, -17, 2188,19985}, { 46, -114, 273, -275, 553, 117, 1758,19675}, { 44, -108, 255, -237, 471, 247, 1356,19327}, { 43, -103, 237, -199, 390, 373, 981,18944}, { 42, -98, 218, -160, 310, 495, 633,18527}, { 40, -91, 198, -121, 231, 611, 314,18078}, { 38, -84, 178, -81, 153, 722, 22,17599}, { 36, -76, 157, -43, 80, 824, -241,17092}, { 34, -68, 135, -3, 8, 919, -476,16558}, { 32, -61, 115, 34, -60, 1006, -683,16001}, { 29, -52, 94, 70, -123, 1083, -862,15422}, { 27, -44, 73, 106, -184, 1152,-1015,14824}, { 25, -36, 53, 139, -239, 1211,-1142,14210}, { 22, -27, 34, 170, -290, 1261,-1244,13582}, { 20, -20, 16, 199, -335, 1301,-1322,12942}, { 18, -12, -3, 226, -375, 1331,-1376,12293}, { 15, -4, -19, 250, -410, 1351,-1408,11638}, { 13, 3, -35, 272, -439, 1361,-1419,10979}, { 11, 9, -49, 292, -464, 1362,-1410,10319}, { 9, 16, -63, 309, -483, 1354,-1383, 9660}, { 7, 22, -75, 322, -496, 1337,-1339, 9005}, { 6, 26, -85, 333, -504, 1312,-1280, 8355}, { 4, 31, -94, 341, -507, 1278,-1205, 7713}, { 3, 35, -102, 347, -506, 1238,-1119, 7082}, { 1, 40, -110, 350, -499, 1190,-1021, 6464}, { 0, 43, -115, 350, -488, 1136, -914, 5861} }; /* Shifting by pre_shift allows calculation using unsigned int rather than possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient. And by having pre_shift 32, a 32-bit platform can easily do the shift by simply ignoring the low half. */ void blip_add_delta( blip_t* m, unsigned time, int delta ) { unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); buf_t* out = SAMPLES( m ) + (fixed >> frac_bits); int const phase_shift = frac_bits - phase_bits; int phase = fixed >> phase_shift & (phase_count - 1); short const* in = bl_step [phase]; short const* rev = bl_step [phase_count - phase]; int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); int delta2 = (delta * interp) >> delta_bits; delta -= delta2; #ifdef BLIP_ASSERT /* Fails if buffer size was exceeded */ assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); #endif out [0] += in[0]*delta + in[half_width+0]*delta2; out [1] += in[1]*delta + in[half_width+1]*delta2; out [2] += in[2]*delta + in[half_width+2]*delta2; out [3] += in[3]*delta + in[half_width+3]*delta2; out [4] += in[4]*delta + in[half_width+4]*delta2; out [5] += in[5]*delta + in[half_width+5]*delta2; out [6] += in[6]*delta + in[half_width+6]*delta2; out [7] += in[7]*delta + in[half_width+7]*delta2; in = rev; out [ 8] += in[7]*delta + in[7-half_width]*delta2; out [ 9] += in[6]*delta + in[6-half_width]*delta2; out [10] += in[5]*delta + in[5-half_width]*delta2; out [11] += in[4]*delta + in[4-half_width]*delta2; out [12] += in[3]*delta + in[3-half_width]*delta2; out [13] += in[2]*delta + in[2-half_width]*delta2; out [14] += in[1]*delta + in[1-half_width]*delta2; out [15] += in[0]*delta + in[0-half_width]*delta2; } void blip_add_delta_fast( blip_t* m, unsigned time, int delta ) { unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); buf_t* out = SAMPLES( m ) + (fixed >> frac_bits); int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); int delta2 = delta * interp; #ifdef BLIP_ASSERT /* Fails if buffer size was exceeded */ assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); #endif out [7] += delta * delta_unit - delta2; out [8] += delta2; } core/types.h000664 001750 001750 00000000674 12702465756 014174 0ustar00sergiosergio000000 000000 #undef uint8 #undef uint16 #undef uint32 #undef int8 #undef int16 #undef int32 #define uint8 unsigned char #define uint16 unsigned short #define uint32 unsigned int #define int8 signed char #define int16 signed short #define int32 signed int typedef union { uint16 w; struct { #ifdef LSB_FIRST uint8 l; uint8 h; #else uint8 h; uint8 l; #endif } byte; } reg16_t; core/cd_hw/cdc.h000664 001750 001750 00000005562 12702465756 014646 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD data controller (LC89510 compatible) * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _HW_CDC_ #define _HW_CDC_ #define cdc scd.cdc_hw /* CDC hardware */ typedef struct { uint8 ifstat; uint8 ifctrl; reg16_t dbc; reg16_t dac; reg16_t pt; reg16_t wa; uint8 ctrl[2]; uint8 head[2][4]; uint8 stat[4]; int cycles; void (*dma_w)(unsigned int words); /* DMA transfer callback */ uint8 ram[0x4000 + 2352]; /* 16K external RAM (with one block overhead to handle buffer overrun) */ } cdc_t; /* Function prototypes */ extern void cdc_init(void); extern void cdc_reset(void); extern int cdc_context_save(uint8 *state); extern int cdc_context_load(uint8 *state); extern void cdc_dma_update(void); extern void cdc_decoder_update(uint32 header); extern void cdc_reg_w(unsigned char data); extern unsigned char cdc_reg_r(void); extern unsigned short cdc_host_r(void); #endif core/cd_hw/scd.h000664 001750 001750 00000007707 12702465756 014671 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Mega CD / Sega CD hardware * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _HW_SCD_ #define _HW_SCD_ #include "cdd.h" #include "cdc.h" #include "gfx.h" #include "pcm.h" #include "cd_cart.h" #ifdef USE_DYNAMIC_ALLOC #define scd ext->cd_hw #else #define scd ext.cd_hw #endif /* 5000000 SCD clocks/s = ~3184 clocks/line with a Master Clock of 53.693175 MHz */ /* This would be slightly (~30 clocks) more on PAL systems because of the slower */ /* Master Clock (53.203424 MHz) but not enough to really care about since clocks */ /* are not running in sync anyway. */ #define SCD_CLOCK 50000000 #define SCYCLES_PER_LINE 3184 /* Timer & Stopwatch clocks divider */ #define TIMERS_SCYCLES_RATIO (384 * 4) /* CD hardware */ typedef struct { cd_cart_t cartridge; /* ROM/RAM Cartridge */ uint8 bootrom[0x20000]; /* 128K internal BOOT ROM */ uint8 prg_ram[0x80000]; /* 512K PRG-RAM */ uint8 word_ram[2][0x20000]; /* 2 x 128K Word RAM (1M mode) */ uint8 word_ram_2M[0x40000]; /* 256K Word RAM (2M mode) */ uint8 bram[0x2000]; /* 8K Backup RAM */ reg16_t regs[0x100]; /* 256 x 16-bit ASIC registers */ uint32 cycles; /* Master clock counter */ int32 stopwatch; /* Stopwatch counter */ int32 timer; /* Timer counter */ uint8 pending; /* Pending interrupts */ uint8 dmna; /* Pending DMNA write status */ gfx_t gfx_hw; /* Graphics processor */ cdc_t cdc_hw; /* CD data controller */ cdd_t cdd_hw; /* CD drive processor */ pcm_t pcm_hw; /* PCM chip */ } cd_hw_t; /* Function prototypes */ extern void scd_init(void); extern void scd_reset(int hard); extern void scd_update(unsigned int cycles); extern void scd_end_frame(unsigned int cycles); extern int scd_context_load(uint8 *state); extern int scd_context_save(uint8 *state); extern int scd_68k_irq_ack(int level); extern void prg_ram_dma_w(unsigned int words); #endif core/z80/000700 001750 001750 00000000000 12703321515 013236 5ustar00sergiosergio000000 000000 core/tremor/README000664 001750 001750 00000003625 12702465756 015046 0ustar00sergiosergio000000 000000 This README covers the Ogg Vorbis 'Tremor' integer playback codec source as of date 2002 09 02, version 1.0.0. ****** The C source in this package will build on any ANSI C compiler and function completely and properly on any platform. The included build system assumes GNU build system and make tools (m4, automake, autoconf, libtool and gmake). GCC is not required, although GCC is the most tested compiler. To build using GNU tools, type in the source directory: ./autogen.sh make Currently, the source implements playback in pure C on all platforms except ARM, where a [currently] small amount of assembly (see asm_arm.h) is used to implement 64 bit math operations and fast LSP computation. If building on ARM without the benefit of GNU build system tools, be sure that '_ARM_ASSEM_' is #defined by the build system if this assembly is desired, else the resulting library will use whatever 64 bit math builtins the compiler implements. No math library is required by this source. No floating point operations are used at any point in either setup or decode. This decoder library will properly decode any past, current or future Vorbis I file or stream. ******** The build system produces a static and [when supported by the OS] dynamic library named 'libvorbisidec'. This library exposes an API nearly identical to the BSD reference library's 'libvorbisfile', including all the features familiar to users of vorbisfile. This API is similar enough that the proper header file to include is named 'ivorbisfile.h' [included in the source build directory]. Lower level libvorbis-style headers and structures are in 'ivorbiscodec.h' [included in the source build directory]. A simple example program, ivorbisfile_example.c, can be built with 'make example'. ******** Detailed Tremor API Documentation begins at doc/index.html Monty xiph.org core/cd_hw/cdc.c000664 001750 001750 00000041663 12702465756 014643 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD data controller (LC89510 compatible) * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /* IFSTAT register bitmasks */ #define BIT_DTEI 0x40 #define BIT_DECI 0x20 #define BIT_DTBSY 0x08 #define BIT_DTEN 0x02 /* IFCTRL register bitmasks */ #define BIT_DTEIEN 0x40 #define BIT_DECIEN 0x20 #define BIT_DOUTEN 0x02 /* CTRL0 register bitmasks */ #define BIT_DECEN 0x80 #define BIT_E01RQ 0x20 #define BIT_AUTORQ 0x10 #define BIT_WRRQ 0x04 /* CTRL1 register bitmasks */ #define BIT_MODRQ 0x08 #define BIT_FORMRQ 0x04 #define BIT_SHDREN 0x01 /* CTRL2 register bitmask */ #define BIT_VALST 0x80 /* TODO: figure exact DMA transfer rate */ #define DMA_BYTES_PER_LINE 512 void cdc_init(void) { memset(&cdc, 0, sizeof(cdc_t)); } void cdc_reset(void) { /* reset CDC register index */ scd.regs[0x04>>1].byte.l = 0x00; /* reset CDC registers */ cdc.ifstat = 0xff; cdc.ifctrl = 0x00; cdc.ctrl[0] = 0x00; cdc.ctrl[1] = 0x00; cdc.stat[0] = 0x00; cdc.stat[1] = 0x00; cdc.stat[2] = 0x00; cdc.stat[3] = 0x80; cdc.head[0][0] = 0x00; cdc.head[0][1] = 0x00; cdc.head[0][2] = 0x00; cdc.head[0][3] = 0x01; cdc.head[1][0] = 0x00; cdc.head[1][1] = 0x00; cdc.head[1][2] = 0x00; cdc.head[1][3] = 0x00; /* reset CDC cycle counter */ cdc.cycles = 0; /* DMA transfer disabled */ cdc.dma_w = 0; /* clear any pending IRQ */ if (scd.pending & (1 << 5)) { /* clear any pending interrupt level 5 */ scd.pending &= ~(1 << 5); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } int cdc_context_save(uint8 *state) { uint8 tmp8; int bufferptr = 0; if (cdc.dma_w == pcm_ram_dma_w) { tmp8 = 1; } else if (cdc.dma_w == prg_ram_dma_w) { tmp8 = 2; } else if (cdc.dma_w == word_ram_0_dma_w) { tmp8 = 3; } else if (cdc.dma_w == word_ram_1_dma_w) { tmp8 = 4; } else if (cdc.dma_w == word_ram_2M_dma_w) { tmp8 = 5; } else { tmp8 = 0; } save_param(&cdc, sizeof(cdc)); save_param(&tmp8, 1); return bufferptr; } int cdc_context_load(uint8 *state) { uint8 tmp8; int bufferptr = 0; load_param(&cdc, sizeof(cdc)); load_param(&tmp8, 1); switch (tmp8) { case 1: cdc.dma_w = pcm_ram_dma_w; break; case 2: cdc.dma_w = prg_ram_dma_w; break; case 3: cdc.dma_w = word_ram_0_dma_w; break; case 4: cdc.dma_w = word_ram_1_dma_w; break; case 5: cdc.dma_w = word_ram_2M_dma_w; break; default: cdc.dma_w = 0; break; } return bufferptr; } void cdc_dma_update(void) { /* maximal transfer length */ int length = DMA_BYTES_PER_LINE; /* end of DMA transfer ? */ if (cdc.dbc.w < DMA_BYTES_PER_LINE) { /* transfer remaining words using 16-bit DMA */ cdc.dma_w((cdc.dbc.w + 1) >> 1); /* reset data byte counter (DBCH bits 4-7 should be set to 1) */ cdc.dbc.w = 0xf000; /* clear !DTEN and !DTBSY */ cdc.ifstat |= (BIT_DTBSY | BIT_DTEN); /* pending Data Transfer End interrupt */ cdc.ifstat &= ~BIT_DTEI; /* Data Transfer End interrupt enabled ? */ if (cdc.ifctrl & BIT_DTEIEN) { /* pending level 5 interrupt */ scd.pending |= (1 << 5); /* level 5 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x20) { /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* clear DSR bit & set EDT bit (CD register $04) */ scd.regs[0x04>>1].byte.h = (scd.regs[0x04>>1].byte.h & 0x07) | 0x80; /* SUB-CPU idle on register $04 polling ? */ if (s68k.stopped & (1<<0x04)) { /* sync SUB-CPU with CDC */ s68k.cycles = scd.cycles; /* restart SUB-CPU */ s68k.stopped = 0; #ifdef LOG_SCD error("s68k started from %d cycles\n", s68k.cycles); #endif } /* disable DMA transfer */ cdc.dma_w = 0; } else { /* transfer all words using 16-bit DMA */ cdc.dma_w(DMA_BYTES_PER_LINE >> 1); /* decrement data byte counter */ cdc.dbc.w -= length; } } void cdc_decoder_update(uint32 header) { /* data decoding enabled ? */ if (cdc.ctrl[0] & BIT_DECEN) { /* update HEAD registers */ *(uint32 *)(cdc.head[0]) = header; /* set !VALST */ cdc.stat[3] = 0x00; /* pending decoder interrupt */ cdc.ifstat &= ~BIT_DECI; /* decoder interrupt enabled ? */ if (cdc.ifctrl & BIT_DECIEN) { /* pending level 5 interrupt */ scd.pending |= (1 << 5); /* level 5 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x20) { /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* buffer RAM write enabled ? */ if (cdc.ctrl[0] & BIT_WRRQ) { int offset; /* increment block pointer */ cdc.pt.w += 2352; /* increment write address */ cdc.wa.w += 2352; /* CDC buffer address */ offset = cdc.pt.w & 0x3fff; /* write CDD block header (4 bytes) */ *(uint32 *)(cdc.ram + offset) = header; /* write CDD block data (2048 bytes) */ cdd_read_data(cdc.ram + 4 + offset); /* take care of buffer overrun */ offset = offset + 2048 + 4 - 0x4000; if (offset > 0) { /* data should be written at the start of buffer */ memcpy(cdc.ram, cdc.ram + 0x4000, offset); } } } } void cdc_reg_w(unsigned char data) { #ifdef LOG_CDC error("CDC register %X write 0x%04x (%X)\n", scd.regs[0x04>>1].byte.l & 0x0F, data, s68k.pc); #endif switch (scd.regs[0x04>>1].byte.l & 0x0F) { case 0x01: /* IFCTRL */ { /* pending interrupts ? */ if (((data & BIT_DTEIEN) && !(cdc.ifstat & BIT_DTEI)) || ((data & BIT_DECIEN) && !(cdc.ifstat & BIT_DECI))) { /* pending level 5 interrupt */ scd.pending |= (1 << 5); /* level 5 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x20) { /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } else if (scd.pending & (1 << 5)) { /* clear pending level 5 interrupts */ scd.pending &= ~(1 << 5); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } /* abort any data transfer if data output is disabled */ if (!(data & BIT_DOUTEN)) { /* clear !DTBSY and !DTEN */ cdc.ifstat |= (BIT_DTBSY | BIT_DTEN); } cdc.ifctrl = data; scd.regs[0x04>>1].byte.l = 0x02; break; } case 0x02: /* DBCL */ cdc.dbc.byte.l = data; scd.regs[0x04>>1].byte.l = 0x03; break; case 0x03: /* DBCH */ cdc.dbc.byte.h = data; scd.regs[0x04>>1].byte.l = 0x04; break; case 0x04: /* DACL */ cdc.dac.byte.l = data; scd.regs[0x04>>1].byte.l = 0x05; break; case 0x05: /* DACH */ cdc.dac.byte.h = data; scd.regs[0x04>>1].byte.l = 0x06; break; case 0x06: /* DTRG */ { /* start data transfer if data output is enabled */ if (cdc.ifctrl & BIT_DOUTEN) { /* set !DTBSY and !DTEN */ cdc.ifstat &= ~(BIT_DTBSY | BIT_DTEN); /* clear DBCH bits 4-7 */ cdc.dbc.byte.h &= 0x0f; /* clear EDT & DSR bits (SCD register $04) */ scd.regs[0x04>>1].byte.h &= 0x07; /* setup data transfer destination */ switch (scd.regs[0x04>>1].byte.h & 0x07) { case 2: /* MAIN-CPU host read */ case 3: /* SUB-CPU host read */ { /* set DSR bit (SCD register $04) */ scd.regs[0x04>>1].byte.h |= 0x40; break; } case 4: /* PCM RAM DMA */ { cdc.dma_w = pcm_ram_dma_w; break; } case 5: /* PRG-RAM DMA */ { cdc.dma_w = prg_ram_dma_w; break; } case 7: /* WORD-RAM DMA */ { /* check memory mode */ if (scd.regs[0x02 >> 1].byte.l & 0x04) { /* 1M mode */ if (scd.regs[0x02 >> 1].byte.l & 0x01) { /* Word-RAM bank 0 is assigned to SUB-CPU */ cdc.dma_w = word_ram_0_dma_w; } else { /* Word-RAM bank 1 is assigned to SUB-CPU */ cdc.dma_w = word_ram_1_dma_w; } } else { /* 2M mode */ if (scd.regs[0x02 >> 1].byte.l & 0x02) { /* only process DMA if Word-RAM is assigned to SUB-CPU */ cdc.dma_w = word_ram_2M_dma_w; } } break; } default: /* invalid */ { #ifdef LOG_CDC error("invalid CDC tranfer destination (%d)\n", scd.regs[0x04>>1].byte.h & 0x07); #endif break; } } } scd.regs[0x04>>1].byte.l = 0x07; break; } case 0x07: /* DTACK */ { /* clear pending data transfer end interrupt */ cdc.ifstat |= BIT_DTEI; /* clear DBCH bits 4-7 */ cdc.dbc.byte.h &= 0x0f; #if 0 /* no pending decoder interrupt ? */ if ((cdc.ifstat | BIT_DECI) || !(cdc.ifctrl & BIT_DECIEN)) { /* clear pending level 5 interrupt */ scd.pending &= ~(1 << 5); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } #endif scd.regs[0x04>>1].byte.l = 0x08; break; } case 0x08: /* WAL */ cdc.wa.byte.l = data; scd.regs[0x04>>1].byte.l = 0x09; break; case 0x09: /* WAH */ cdc.wa.byte.h = data; scd.regs[0x04>>1].byte.l = 0x0a; break; case 0x0a: /* CTRL0 */ { /* set CRCOK bit only if decoding is enabled */ cdc.stat[0] = data & BIT_DECEN; /* update decoding mode */ if (data & BIT_AUTORQ) { /* set MODE bit according to CTRL1 register & clear FORM bit */ cdc.stat[2] = cdc.ctrl[1] & BIT_MODRQ; } else { /* set MODE & FORM bits according to CTRL1 register */ cdc.stat[2] = cdc.ctrl[1] & (BIT_MODRQ | BIT_FORMRQ); } cdc.ctrl[0] = data; scd.regs[0x04>>1].byte.l = 0x0b; break; } case 0x0b: /* CTRL1 */ { /* update decoding mode */ if (cdc.ctrl[0] & BIT_AUTORQ) { /* set MODE bit according to CTRL1 register & clear FORM bit */ cdc.stat[2] = data & BIT_MODRQ; } else { /* set MODE & FORM bits according to CTRL1 register */ cdc.stat[2] = data & (BIT_MODRQ | BIT_FORMRQ); } cdc.ctrl[1] = data; scd.regs[0x04>>1].byte.l = 0x0c; break; } case 0x0c: /* PTL */ cdc.pt.byte.l = data; scd.regs[0x04>>1].byte.l = 0x0d; break; case 0x0d: /* PTH */ cdc.pt.byte.h = data; scd.regs[0x04>>1].byte.l = 0x0e; break; case 0x0e: /* CTRL2 (unused) */ scd.regs[0x04>>1].byte.l = 0x0f; break; case 0x0f: /* RESET */ cdc_reset(); break; default: /* by default, SBOUT is not used */ break; } } unsigned char cdc_reg_r(void) { switch (scd.regs[0x04>>1].byte.l & 0x0F) { case 0x01: /* IFSTAT */ scd.regs[0x04>>1].byte.l = 0x02; return cdc.ifstat; case 0x02: /* DBCL */ scd.regs[0x04>>1].byte.l = 0x03; return cdc.dbc.byte.l; case 0x03: /* DBCH */ scd.regs[0x04>>1].byte.l = 0x04; return cdc.dbc.byte.h; case 0x04: /* HEAD0 */ scd.regs[0x04>>1].byte.l = 0x05; return cdc.head[cdc.ctrl[1] & BIT_SHDREN][0]; case 0x05: /* HEAD1 */ scd.regs[0x04>>1].byte.l = 0x06; return cdc.head[cdc.ctrl[1] & BIT_SHDREN][1]; case 0x06: /* HEAD2 */ scd.regs[0x04>>1].byte.l = 0x07; return cdc.head[cdc.ctrl[1] & BIT_SHDREN][2]; case 0x07: /* HEAD3 */ scd.regs[0x04>>1].byte.l = 0x08; return cdc.head[cdc.ctrl[1] & BIT_SHDREN][3]; case 0x08: /* PTL */ scd.regs[0x04>>1].byte.l = 0x09; return cdc.pt.byte.l; case 0x09: /* PTH */ scd.regs[0x04>>1].byte.l = 0x0a; return cdc.pt.byte.h; case 0x0a: /* WAL */ scd.regs[0x04>>1].byte.l = 0x0b; return cdc.wa.byte.l; case 0x0b: /* WAH */ scd.regs[0x04>>1].byte.l = 0x0c; return cdc.wa.byte.h; case 0x0c: /* STAT0 */ scd.regs[0x04>>1].byte.l = 0x0d; return cdc.stat[0]; case 0x0d: /* STAT1 (always return 0) */ scd.regs[0x04>>1].byte.l = 0x0e; return 0x00; case 0x0e: /* STAT2 */ scd.regs[0x04>>1].byte.l = 0x0f; return cdc.stat[2]; case 0x0f: /* STAT3 */ { uint8 data = cdc.stat[3]; /* clear !VALST (note: this is not 100% correct but BIOS do not seem to care) */ cdc.stat[3] = BIT_VALST; /* clear pending decoder interrupt */ cdc.ifstat |= BIT_DECI; #if 0 /* no pending data transfer end interrupt */ if ((cdc.ifstat | BIT_DTEI) || !(cdc.ifctrl & BIT_DTEIEN)) { /* clear pending level 5 interrupt */ scd.pending &= ~(1 << 5); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } #endif scd.regs[0x04>>1].byte.l = 0x00; return data; } default: /* by default, COMIN is always empty */ return 0xff; } } unsigned short cdc_host_r(void) { /* check if data is available */ if (scd.regs[0x04>>1].byte.h & 0x40) { /* read data word from CDC RAM buffer */ uint16 data = *(uint16 *)(cdc.ram + (cdc.dac.w & 0x3ffe)); #ifdef LSB_FIRST /* source data is stored in big endian format */ data = ((data >> 8) | (data << 8)) & 0xffff; #endif #ifdef LOG_CDC error("CDC host read 0x%04x -> 0x%04x (dbc=0x%x) (%X)\n", cdc.dac.w, data, cdc.dbc.w, s68k.pc); #endif /* increment data address counter */ cdc.dac.w += 2; /* decrement data byte counter */ cdc.dbc.w -= 2; /* end of transfer ? */ if ((int16)cdc.dbc.w <= 0) { /* reset data byte counter (DBCH bits 4-7 should be set to 1) */ cdc.dbc.w = 0xf000; /* clear !DTEN and !DTBSY */ cdc.ifstat |= (BIT_DTBSY | BIT_DTEN); /* pending Data Transfer End interrupt */ cdc.ifstat &= ~BIT_DTEI; /* Data Transfer End interrupt enabled ? */ if (cdc.ifctrl & BIT_DTEIEN) { /* pending level 5 interrupt */ scd.pending |= (1 << 5); /* level 5 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x20) { /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* clear DSR bit & set EDT bit (SCD register $04) */ scd.regs[0x04>>1].byte.h = (scd.regs[0x04>>1].byte.h & 0x07) | 0x80; } return data; } #ifdef LOG_CDC error("error reading CDC host (data transfer disabled)\n"); #endif return 0xffff; } libretro/msvc/msvc-2010-360/msvc-2010-360.vcxproj.filters000664 001750 001750 00000022536 12702465756 023302 0ustar00sergiosergio000000 000000  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {c0268b8d-1c7d-44d5-ae67-e3e365c991b7} {c3d17076-e795-431e-b50f-7606c81367b9} {5351583e-dbd9-4060-8497-6ddfd31e3666} {943f2af4-23b4-43eb-b9cd-91cc7af172c5} {ff45bed3-12a9-437d-ac34-7e83518ba624} {f0c37c57-d905-4002-a129-5b9ffc907c05} {2f0a4c83-ad74-4742-baef-35fafdca0e67} {c90aed8d-25e3-439e-acec-f66acc8b4c0d} {d8d4356b-c678-422e-aa12-9f52ba60fdbc} {d1768684-24bc-4639-8b7c-481d2281d4cf} Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files\z80 Source Files\sound Source Files\sound Source Files\sound Source Files\sound Source Files\sound Source Files\ntsc Source Files\ntsc Source Files\m68k Source Files\m68k Source Files\libretro Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw\svp Source Files\cart_hw\svp Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\sound Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\input_hw Source Files\input_hw core/cd_hw/scd.c000664 001750 001750 00000170107 12702465756 014657 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Mega CD / Sega CD hardware * * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /*--------------------------------------------------------------------------*/ /* Unused area (return open bus data, i.e prefetched instruction word) */ /*--------------------------------------------------------------------------*/ static unsigned int s68k_read_bus_8(unsigned int address) { #ifdef LOGERROR error("[SUB 68k] Unused read8 %08X (%08X)\n", address, s68k.pc); #endif address = s68k.pc | (address & 1); return READ_BYTE(s68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff); } static unsigned int s68k_read_bus_16(unsigned int address) { #ifdef LOGERROR error("[SUB 68k] Unused read16 %08X (%08X)\n", address, s68k.pc); #endif address = s68k.pc; return *(uint16 *)(s68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)); } static void s68k_unused_8_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("[SUB 68k] Unused write8 %08X = %02X (%08X)\n", address, data, s68k.pc); #endif } static void s68k_unused_16_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("[SUB 68k] Unused write16 %08X = %04X (%08X)\n", address, data, s68k.pc); #endif } /*--------------------------------------------------------------------------*/ /* PRG-RAM DMA access */ /*--------------------------------------------------------------------------*/ void prg_ram_dma_w(unsigned int words) { uint16 data; /* CDC buffer source address */ uint16 src_index = cdc.dac.w & 0x3ffe; /* PRG-RAM destination address*/ uint32 dst_index = (scd.regs[0x0a>>1].w << 3) & 0x7fffe; /* update DMA destination address */ scd.regs[0x0a>>1].w += (words >> 2); /* update DMA source address */ cdc.dac.w += (words << 1); /* check PRG-RAM write protected area */ if (dst_index < (scd.regs[0x02>>1].byte.h << 9)) { return; } /* DMA transfer */ while (words--) { /* read 16-bit word from CDC buffer */ data = *(uint16 *)(cdc.ram + src_index); #ifdef LSB_FIRST /* source data is stored in big endian format */ data = ((data >> 8) | (data << 8)) & 0xffff; #endif /* write 16-bit word to PRG-RAM */ *(uint16 *)(scd.prg_ram + dst_index) = data ; /* increment CDC buffer source address */ src_index = (src_index + 2) & 0x3ffe; /* increment PRG-RAM destination address */ dst_index = (dst_index + 2) & 0x7fffe; } } /*--------------------------------------------------------------------------*/ /* PRG-RAM write protected area */ /*--------------------------------------------------------------------------*/ static void prg_ram_write_byte(unsigned int address, unsigned int data) { address &= 0x7ffff; if (address >= (scd.regs[0x02>>1].byte.h << 9)) { WRITE_BYTE(scd.prg_ram, address, data); return; } #ifdef LOGERROR error("[SUB 68k] PRG-RAM protected write8 %08X = %02X (%08X)\n", address, data, s68k.pc); #endif } static void prg_ram_write_word(unsigned int address, unsigned int data) { address &= 0x7fffe; if (address >= (scd.regs[0x02>>1].byte.h << 9)) { *(uint16 *)(scd.prg_ram + address) = data; return; } #ifdef LOGERROR error("[SUB 68k] PRG-RAM protected write16 %08X = %02X (%08X)\n", address, data, s68k.pc); #endif } /*--------------------------------------------------------------------------*/ /* PRG-RAM bank mirrored access */ /*--------------------------------------------------------------------------*/ static unsigned int prg_ram_z80_read_byte(unsigned int address) { int offset = (address >> 16) & 0x03; if (zbank_memory_map[offset].read) { return zbank_memory_map[offset].read(address); } return READ_BYTE(m68k.memory_map[offset].base, address & 0xffff); } static void prg_ram_z80_write_byte(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x03; if (zbank_memory_map[offset].write) { zbank_memory_map[offset].write(address, data); } else { WRITE_BYTE(m68k.memory_map[offset].base, address & 0xffff, data); } } static unsigned int prg_ram_m68k_read_byte(unsigned int address) { int offset = (address >> 16) & 0x03; if (m68k.memory_map[offset].read8) { return m68k.memory_map[offset].read8(address); } return READ_BYTE(m68k.memory_map[offset].base, address & 0xffff); } static unsigned int prg_ram_m68k_read_word(unsigned int address) { int offset = (address >> 16) & 0x03; if (m68k.memory_map[offset].read16) { return m68k.memory_map[offset].read16(address); } return *(uint16 *)(m68k.memory_map[offset].base + (address & 0xffff)); } static void prg_ram_m68k_write_byte(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x03; if (m68k.memory_map[offset].write8) { m68k.memory_map[offset].write8(address, data); } else { WRITE_BYTE(m68k.memory_map[offset].base, address & 0xffff, data); } } static void prg_ram_m68k_write_word(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x03; if (m68k.memory_map[offset].write16) { m68k.memory_map[offset].write16(address, data); } else { *(uint16 *)(m68k.memory_map[offset].base + (address & 0xffff)) = data; } } /*--------------------------------------------------------------------------*/ /* Word-RAM bank mirrored access */ /*--------------------------------------------------------------------------*/ static unsigned int word_ram_z80_read_byte(unsigned int address) { int offset = (address >> 16) & 0x23; if (zbank_memory_map[offset].read) { return zbank_memory_map[offset].read(address); } return READ_BYTE(m68k.memory_map[offset].base, address & 0xffff); } static void word_ram_z80_write_byte(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x23; if (zbank_memory_map[offset].write) { zbank_memory_map[offset].write(address, data); } else { WRITE_BYTE(m68k.memory_map[offset].base, address & 0xffff, data); } } static unsigned int word_ram_m68k_read_byte(unsigned int address) { int offset = (address >> 16) & 0x23; if (m68k.memory_map[offset].read8) { return m68k.memory_map[offset].read8(address); } return READ_BYTE(m68k.memory_map[offset].base, address & 0xffff); } static unsigned int word_ram_m68k_read_word(unsigned int address) { int offset = (address >> 16) & 0x23; if (m68k.memory_map[offset].read16) { return m68k.memory_map[offset].read16(address); } return *(uint16 *)(m68k.memory_map[offset].base + (address & 0xffff)); } static void word_ram_m68k_write_byte(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x23; if (m68k.memory_map[offset].write8) { m68k.memory_map[offset].write8(address, data); } else { WRITE_BYTE(m68k.memory_map[offset].base, address & 0xffff, data); } } static void word_ram_m68k_write_word(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x23; if (m68k.memory_map[offset].write16) { m68k.memory_map[offset].write16(address, data); } else { *(uint16 *)(m68k.memory_map[offset].base + (address & 0xffff)) = data; } } static unsigned int word_ram_s68k_read_byte(unsigned int address) { int offset = (address >> 16) & 0x0f; if (s68k.memory_map[offset].read8) { return s68k.memory_map[offset].read8(address); } return READ_BYTE(s68k.memory_map[offset].base, address & 0xffff); } static unsigned int word_ram_s68k_read_word(unsigned int address) { int offset = (address >> 16) & 0x0f; if (s68k.memory_map[offset].read16) { return s68k.memory_map[offset].read16(address); } return *(uint16 *)(s68k.memory_map[offset].base + (address & 0xffff)); } static void word_ram_s68k_write_byte(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x0f; if (s68k.memory_map[offset].write8) { s68k.memory_map[offset].write8(address, data); } else { WRITE_BYTE(s68k.memory_map[offset].base, address & 0xffff, data); } } static void word_ram_s68k_write_word(unsigned int address, unsigned int data) { int offset = (address >> 16) & 0x0f; if (s68k.memory_map[offset].write16) { s68k.memory_map[offset].write16(address, data); } else { *(uint16 *)(s68k.memory_map[offset].base + (address & 0xffff)) = data; } } /*--------------------------------------------------------------------------*/ /* internal backup RAM (8KB) */ /*--------------------------------------------------------------------------*/ static unsigned int bram_read_byte(unsigned int address) { /* LSB only */ if (address & 0x01) { return scd.bram[(address >> 1) & 0x1fff]; } return 0xff; } static unsigned int bram_read_word(unsigned int address) { return (scd.bram[(address >> 1) & 0x1fff] | 0xff00); } static void bram_write_byte(unsigned int address, unsigned int data) { /* LSB only */ if (address & 0x01) { scd.bram[(address >> 1) & 0x1fff] = data; } } static void bram_write_word(unsigned int address, unsigned int data) { scd.bram[(address >> 1) & 0x1fff] = data & 0xff; } /*--------------------------------------------------------------------------*/ /* SUB-CPU polling detection and MAIN-CPU synchronization */ /*--------------------------------------------------------------------------*/ static void s68k_poll_detect(unsigned int reg_mask) { /* detect SUB-CPU register polling */ if (s68k.poll.detected & reg_mask) { if (s68k.cycles <= s68k.poll.cycle) { if (s68k.pc == s68k.poll.pc) { /* SUB-CPU polling confirmed ? */ if (s68k.poll.detected & 1) { /* idle SUB-CPU until register is modified */ s68k.cycles = s68k.cycle_end; s68k.stopped = reg_mask; #ifdef LOG_SCD error("s68k stopped from %d cycles\n", s68k.cycles); #endif } else { /* confirm SUB-CPU polling */ s68k.poll.detected |= 1; s68k.poll.cycle = s68k.cycles + 392; } } return; } } else { /* set SUB-CPU register access flag */ s68k.poll.detected = reg_mask; } /* reset SUB-CPU polling detection */ s68k.poll.cycle = s68k.cycles + 392; s68k.poll.pc = s68k.pc; } static void s68k_poll_sync(unsigned int reg_mask) { /* relative MAIN-CPU cycle counter */ unsigned int cycles = (s68k.cycles * MCYCLES_PER_LINE) / SCYCLES_PER_LINE; /* sync MAIN-CPU with SUB-CPU */ if (!m68k.stopped) { m68k_run(cycles); } /* MAIN-CPU idle on register polling ? */ if (m68k.stopped & reg_mask) { /* sync MAIN-CPU with SUB-CPU */ m68k.cycles = cycles; /* restart MAIN-CPU */ m68k.stopped = 0; #ifdef LOG_SCD error("m68k started from %d cycles\n", cycles); #endif } /* clear CPU register access flags */ s68k.poll.detected &= ~reg_mask; m68k.poll.detected &= ~reg_mask; } /*--------------------------------------------------------------------------*/ /* PCM chip & Gate-Array area */ /*--------------------------------------------------------------------------*/ static unsigned int scd_read_byte(unsigned int address) { /* PCM area (8K) mirrored into $xF0000-$xF7FFF */ if (!(address & 0x8000)) { /* get /LDS only */ if (address & 1) { return pcm_read((address >> 1) & 0x1fff); } return s68k_read_bus_8(address); } #ifdef LOG_SCD error("[%d][%d]read byte CD register %X (%X)\n", v_counter, s68k.cycles, address, s68k.pc); #endif /* only A1-A8 are used for decoding */ address &= 0x1ff; /* Memory Mode */ if (address == 0x03) { s68k_poll_detect(1<<0x03); return scd.regs[0x03>>1].byte.l; } /* MAIN-CPU communication flags */ if (address == 0x0e) { s68k_poll_detect(1<<0x0e); return scd.regs[0x0e>>1].byte.h; } /* CDC transfer status */ if (address == 0x04) { s68k_poll_detect(1<<0x04); return scd.regs[0x04>>1].byte.h; } /* GFX operation status */ if (address == 0x58) { s68k_poll_detect(1<<0x08); return scd.regs[0x58>>1].byte.h; } /* CDC register data (controlled by BIOS, byte access only ?) */ if (address == 0x07) { unsigned int data = cdc_reg_r(); #ifdef LOG_CDC error("CDC register %X read 0x%02X (%X)\n", scd.regs[0x04>>1].byte.l & 0x0F, data, s68k.pc); #endif return data; } /* LED status */ if (address == 0x00) { /* register $00 is reserved for MAIN-CPU, we use $06 instead */ return scd.regs[0x06>>1].byte.h; } /* RESET status */ if (address == 0x01) { /* always return 1 */ return 0x01; } /* Font data */ if ((address >= 0x50) && (address <= 0x56)) { /* shifted 4-bit input (xxxx00) */ uint8 bits = (scd.regs[0x4e>>1].w >> (((address & 6) ^ 6) << 1)) << 2; /* color code */ uint8 code = scd.regs[0x4c>>1].byte.l; /* 16-bit font data (4 pixels = 16 bits) */ uint16 data = (code >> (bits & 4)) & 0x0f; bits = bits >> 1; data = data | (((code >> (bits & 4)) << 4) & 0xf0); bits = bits >> 1; data = data | (((code >> (bits & 4)) << 8) & 0xf00); bits = bits >> 1; data = data | (((code >> (bits & 4)) << 12) & 0xf000); return (address & 1) ? (data & 0xff) : (data >> 8); } /* MAIN-CPU communication words */ if ((address & 0x1f0) == 0x10) { s68k_poll_detect(1 << (address & 0x1f)); } /* Subcode buffer */ else if (address & 0x100) { /* 64 x 16-bit mirrored */ address &= 0x17f; } /* default registers */ if (address & 1) { /* register LSB */ return scd.regs[address >> 1].byte.l; } /* register MSB */ return scd.regs[address >> 1].byte.h; } static unsigned int scd_read_word(unsigned int address) { /* PCM area (8K) mirrored into $xF0000-$xF7FFF */ if (!(address & 0x8000)) { /* get /LDS only */ return pcm_read((address >> 1) & 0x1fff); } #ifdef LOG_SCD error("[%d][%d]read word CD register %X (%X)\n", v_counter, s68k.cycles, address, s68k.pc); #endif /* only A1-A8 are used for decoding */ address &= 0x1ff; /* Memory Mode */ if (address == 0x02) { s68k_poll_detect(1<<0x03); return scd.regs[0x03>>1].w; } /* CDC host data (word access only ?) */ if (address == 0x08) { return cdc_host_r(); } /* LED & RESET status */ if (address == 0x00) { /* register $00 is reserved for MAIN-CPU, we use $06 instead */ return scd.regs[0x06>>1].w; } /* Stopwatch counter (word access only ?) */ if (address == 0x0c) { /* cycle-accurate counter value */ return (scd.regs[0x0c>>1].w + ((s68k.cycles - scd.stopwatch) / TIMERS_SCYCLES_RATIO)) & 0xfff; } /* Font data */ if ((address >= 0x50) && (address <= 0x56)) { /* shifted 4-bit input (xxxx00) */ uint8 bits = (scd.regs[0x4e>>1].w >> (((address & 6) ^ 6) << 1)) << 2; /* color code */ uint8 code = scd.regs[0x4c>>1].byte.l; /* 16-bit font data (4 pixels = 16 bits) */ uint16 data = (code >> (bits & 4)) & 0x0f; bits = bits >> 1; data = data | (((code >> (bits & 4)) << 4) & 0xf0); bits = bits >> 1; data = data | (((code >> (bits & 4)) << 8) & 0xf00); bits = bits >> 1; data = data | (((code >> (bits & 4)) << 12) & 0xf000); return data; } /* MAIN-CPU communication words */ if ((address & 0x1f0) == 0x10) { if (!m68k.stopped) { /* relative MAIN-CPU cycle counter */ unsigned int cycles = (s68k.cycles * MCYCLES_PER_LINE) / SCYCLES_PER_LINE; /* sync MAIN-CPU with SUB-CPU (Mighty Morphin Power Rangers) */ m68k_run(cycles); } s68k_poll_detect(3 << (address & 0x1e)); } /* Subcode buffer */ else if (address & 0x100) { /* 64 x 16-bit mirrored */ address &= 0x17f; } /* default registers */ return scd.regs[address >> 1].w; } INLINE void word_ram_switch(uint8 mode) { int i; uint16 *ptr1 = (uint16 *)(scd.word_ram_2M); uint16 *ptr2 = (uint16 *)(scd.word_ram[0]); uint16 *ptr3 = (uint16 *)(scd.word_ram[1]); if (mode & 0x04) { /* 2M -> 1M mode */ for (i=0; i<0x10000; i++) { *ptr2++=*ptr1++; *ptr3++=*ptr1++; } } else { /* 1M -> 2M mode */ for (i=0; i<0x10000; i++) { *ptr1++=*ptr2++; *ptr1++=*ptr3++; } /* MAIN-CPU: $200000-$21FFFF is mapped to 256K Word-RAM (lower 128K) */ for (i=scd.cartridge.boot+0x20; i> 1) & 0x1fff, data); return; } s68k_unused_8_w(address, data); return; } #ifdef LOG_SCD error("[%d][%d]write byte CD register %X -> 0x%02x (%X)\n", v_counter, s68k.cycles, address, data, s68k.pc); #endif /* Gate-Array registers */ switch (address & 0x1ff) { case 0x00: /* LED status */ { /* register $00 is reserved for MAIN-CPU, use $06 instead */ scd.regs[0x06 >> 1].byte.h = data; return; } case 0x01: /* RESET status */ { /* RESET bit cleared ? */ if (!(data & 0x01)) { /* reset CD hardware */ scd_reset(0); } return; } case 0x03: /* Memory Mode */ { s68k_poll_sync(1<<0x03); /* detect MODE & RET bits modifications */ if ((data ^ scd.regs[0x03 >> 1].byte.l) & 0x05) { int i; /* MODE bit */ if (data & 0x04) { /* 2M->1M mode switch */ if (!(scd.regs[0x03 >> 1].byte.l & 0x04)) { /* re-arrange Word-RAM banks */ word_ram_switch(0x04); } /* RET bit in 1M Mode */ if (data & 0x01) { /* Word-RAM 1 assigned to MAIN-CPU */ for (i=scd.cartridge.boot+0x20; i> 1].byte.l = (scd.regs[0x02 >> 1].byte.l & ~0x1f) | (data & 0x1d); return; } else { /* 1M->2M mode switch */ if (scd.regs[0x02 >> 1].byte.l & 0x04) { /* re-arrange Word-RAM banks */ word_ram_switch(0x00); /* RET bit set during 1M mode ? */ data |= ~scd.dmna & 0x01; /* check if RET bit is cleared */ if (!(data & 0x01)) { /* set DMNA bit */ data |= 0x02; /* mask BK0-1 bits (MAIN-CPU side only) */ scd.regs[0x02 >> 1].byte.l = (scd.regs[0x02 >> 1].byte.l & ~0x1f) | (data & 0x1f); return; } } /* RET bit set in 2M mode */ if (data & 0x01) { /* Word-RAM is returned to MAIN-CPU */ scd.dmna = 0; /* clear DMNA bit */ scd.regs[0x02 >> 1].byte.l = (scd.regs[0x02 >> 1].byte.l & ~0x1f) | (data & 0x1d); return; } } } /* update PM0-1 & MODE bits */ scd.regs[0x02 >> 1].byte.l = (scd.regs[0x02 >> 1].byte.l & ~0x1c) | (data & 0x1c); return; } case 0x07: /* CDC register write */ { cdc_reg_w(data); return; } case 0x0e: /* SUB-CPU communication flags */ case 0x0f: /* !LWR is ignored (Space Ace, Dragon's Lair) */ { s68k_poll_sync(1<<0x0f); scd.regs[0x0f>>1].byte.l = data; return; } case 0x31: /* Timer */ { /* reload timer (one timer clock = 384 CPU cycles) */ scd.timer = data * TIMERS_SCYCLES_RATIO; /* only non-zero data starts timer, writing zero stops it */ if (data) { /* adjust regarding current CPU cycle */ scd.timer += (s68k.cycles - scd.cycles); } scd.regs[0x30>>1].byte.l = data; return; } case 0x33: /* Interrupts */ { /* update register value before updating interrupts */ scd.regs[0x32>>1].byte.l = data; /* update IEN2 flag */ scd.regs[0x00].byte.h = (scd.regs[0x00].byte.h & 0x7f) | ((data & 0x04) << 5); /* clear level 1 interrupt if disabled ("Batman Returns" option menu) */ scd.pending &= 0xfd | (data & 0x02); /* update IRQ level */ s68k_update_irq((scd.pending & data) >> 1); return; } case 0x37: /* CDD control (controlled by BIOS, byte access only ?) */ { /* CDD communication started ? */ if ((data & 0x04) && !(scd.regs[0x37>>1].byte.l & 0x04)) { /* reset CDD cycle counter */ cdd.cycles = (scd.cycles - s68k.cycles) * 3; /* set pending interrupt level 4 */ scd.pending |= (1 << 4); /* update IRQ level if interrupt is enabled */ if (scd.regs[0x32>>1].byte.l & 0x10) { s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } scd.regs[0x37>>1].byte.l = data; return; } default: { /* SUB-CPU communication words */ if ((address & 0xf0) == 0x20) { s68k_poll_sync(1 << ((address - 0x10) & 0x1f)); } /* default registers */ if (address & 1) { /* register LSB */ scd.regs[(address >> 1) & 0xff].byte.l = data; return; } /* register MSB */ scd.regs[(address >> 1) & 0xff].byte.h = data; return; } } } static void scd_write_word(unsigned int address, unsigned int data) { /* PCM area (8K) mirrored into $xF0000-$xF7FFF */ if (!(address & 0x8000)) { /* get /LDS only */ pcm_write((address >> 1) & 0x1fff, data); return; } #ifdef LOG_SCD error("[%d][%d]write word CD register %X -> 0x%04x (%X)\n", v_counter, s68k.cycles, address, data, s68k.pc); #endif /* Gate-Array registers */ switch (address & 0x1fe) { case 0x00: /* LED status & RESET */ { /* only update LED status (register $00 is reserved for MAIN-CPU, use $06 instead) */ scd.regs[0x06>>1].byte.h = data >> 8; /* RESET bit cleared ? */ if (!(data & 0x01)) { /* reset CD hardware */ scd_reset(0); } return; } case 0x02: /* Memory Mode */ { s68k_poll_sync(1<<0x03); /* detect MODE & RET bits modifications */ if ((data ^ scd.regs[0x03>>1].byte.l) & 0x05) { int i; /* MODE bit */ if (data & 0x04) { /* 2M->1M mode switch */ if (!(scd.regs[0x03 >> 1].byte.l & 0x04)) { /* re-arrange Word-RAM banks */ word_ram_switch(0x04); } /* RET bit in 1M Mode */ if (data & 0x01) { /* Word-RAM 1 assigned to MAIN-CPU */ for (i=scd.cartridge.boot+0x20; i>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0x1f) | (data & 0x1d); return; } else { /* 1M->2M mode switch */ if (scd.regs[0x03>>1].byte.l & 0x04) { /* re-arrange Word-RAM banks */ word_ram_switch(0x00); /* RET bit set during 1M mode ? */ data |= ~scd.dmna & 0x01; /* check if RET bit is cleared */ if (!(data & 0x01)) { /* set DMNA bit */ data |= 0x02; /* mask BK0-1 bits (MAIN-CPU side only) */ scd.regs[0x03>>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0x1f) | (data & 0x1f); return; } } /* RET bit set in 2M mode */ if (data & 0x01) { /* Word-RAM is returned to MAIN-CPU */ scd.dmna = 0; /* clear DMNA bit */ scd.regs[0x03>>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0x1f) | (data & 0x1d); return; } } } /* update PM0-1 & MODE bits */ scd.regs[0x03>>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0x1c) | (data & 0x1c); return; } case 0x06: /* CDC register write */ { cdc_reg_w(data); return; } case 0x0c: /* Stopwatch (word access only) */ { /* synchronize the counter with SUB-CPU */ int ticks = (s68k.cycles - scd.stopwatch) / TIMERS_SCYCLES_RATIO; scd.stopwatch += (ticks * TIMERS_SCYCLES_RATIO); /* any writes clear the counter */ scd.regs[0x0c>>1].w = 0; return; } case 0x0e: /* CPU Communication flags */ { s68k_poll_sync(1<<0x0f); /* D8-D15 ignored -> only SUB-CPU flags are updated */ scd.regs[0x0f>>1].byte.l = data & 0xff; return; } case 0x30: /* Timer */ { /* LSB only */ data &= 0xff; /* reload timer (one timer clock = 384 CPU cycles) */ scd.timer = data * TIMERS_SCYCLES_RATIO; /* only non-zero data starts timer, writing zero stops it */ if (data) { /* adjust regarding current CPU cycle */ scd.timer += (s68k.cycles - scd.cycles); } scd.regs[0x30>>1].byte.l = data; return; } case 0x32: /* Interrupts */ { /* LSB only */ data &= 0xff; /* update register value before updating interrupts */ scd.regs[0x32>>1].byte.l = data; /* update IEN2 flag */ scd.regs[0x00].byte.h = (scd.regs[0x00].byte.h & 0x7f) | ((data & 0x04) << 5); /* clear pending level 1 interrupt if disabled ("Batman Returns" option menu) */ scd.pending &= 0xfd | (data & 0x02); /* update IRQ level */ s68k_update_irq((scd.pending & data) >> 1); return; } case 0x4a: /* CDD command 9 (controlled by BIOS, word access only ?) */ { scd.regs[0x4a>>1].w = 0; cdd_process(); #ifdef LOG_CDD error("CDD command: %02x %02x %02x %02x %02x %02x %02x %02x\n",scd.regs[0x42>>1].byte.h, scd.regs[0x42>>1].byte.l, scd.regs[0x44>>1].byte.h, scd.regs[0x44>>1].byte.l, scd.regs[0x46>>1].byte.h, scd.regs[0x46>>1].byte.l, scd.regs[0x48>>1].byte.h, scd.regs[0x48>>1].byte.l); error("CDD status: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",scd.regs[0x38>>1].byte.h, scd.regs[0x38>>1].byte.l, scd.regs[0x3a>>1].byte.h, scd.regs[0x3a>>1].byte.l, scd.regs[0x3c>>1].byte.h, scd.regs[0x3c>>1].byte.l, scd.regs[0x3e>>1].byte.h, scd.regs[0x3e>>1].byte.l, scd.regs[0x40>>1].byte.h, scd.regs[0x40>>1].byte.l); #endif break; } case 0x66: /* Trace vector base address */ { scd.regs[0x66>>1].w = data; /* start GFX operation */ gfx_start(data, s68k.cycles); return; } default: { /* SUB-CPU communication words */ if ((address & 0xf0) == 0x20) { s68k_poll_sync(3 << ((address - 0x10) & 0x1e)); } /* default registers */ scd.regs[(address >> 1) & 0xff].w = data; return; } } } void scd_init(void) { int i; /****************************************************************/ /* MAIN-CPU low memory map ($000000-$7FFFFF) */ /****************************************************************/ /* 0x00: boot from CD (default) */ /* 0x40: boot from cartridge (mode 1) when /CART is asserted */ int base = scd.cartridge.boot; /* $400000-$7FFFFF (resp. $000000-$3FFFFF): cartridge port (/CE0 asserted) */ cd_cart_init(); /* $000000-$1FFFFF (resp. $400000-$5FFFFF): expansion port (/ROM asserted) */ for (i=base+0x00; i (base + 0x03)) { m68k.memory_map[i].read8 = prg_ram_m68k_read_byte; m68k.memory_map[i].read16 = prg_ram_m68k_read_word; m68k.memory_map[i].write8 = prg_ram_m68k_write_byte; m68k.memory_map[i].write16 = prg_ram_m68k_write_word; zbank_memory_map[i].read = prg_ram_z80_read_byte; zbank_memory_map[i].write = prg_ram_z80_write_byte; } else { m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = NULL; m68k.memory_map[i].write16 = NULL; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = NULL; } break; } } } /* $200000-$3FFFFF (resp. $600000-$7FFFFF): expansion port (/RAS2 asserted) */ for (i=base+0x20; i (base + 0x23)) { m68k.memory_map[i].read8 = word_ram_m68k_read_byte; m68k.memory_map[i].read16 = word_ram_m68k_read_word; m68k.memory_map[i].write8 = word_ram_m68k_write_byte; m68k.memory_map[i].write16 = word_ram_m68k_write_word; zbank_memory_map[i].read = word_ram_z80_read_byte; zbank_memory_map[i].write = word_ram_z80_write_byte; } else { m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = NULL; m68k.memory_map[i].write16 = NULL; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = NULL; } } /****************************************************************/ /* SUB-CPU memory map ($000000-$FFFFFF) */ /****************************************************************/ for (i=0x00; i<0x100; i++) { /* only A1-A19 are connected to SUB-CPU */ switch (i & 0x0f) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: { /* $000000-$07FFFF (mirrored every 1MB): PRG-RAM (512KB) */ s68k.memory_map[i].base = scd.prg_ram + ((i & 0x07) << 16); s68k.memory_map[i].read8 = NULL; s68k.memory_map[i].read16 = NULL; /* first 128KB can be write-protected */ s68k.memory_map[i].write8 = (i & 0x0e) ? NULL : prg_ram_write_byte; s68k.memory_map[i].write16 = (i & 0x0e) ? NULL : prg_ram_write_word; break; } case 0x08: case 0x09: case 0x0a: case 0x0b: { /* $080000-$0BFFFF (mirrored every 1MB): Word-RAM in 2M mode (256KB)*/ s68k.memory_map[i].base = scd.word_ram_2M + ((i & 0x03) << 16); /* automatic mirrored range remapping when switching Word-RAM */ if (i > 0x0f) { s68k.memory_map[i].read8 = word_ram_s68k_read_byte; s68k.memory_map[i].read16 = word_ram_s68k_read_word; s68k.memory_map[i].write8 = word_ram_s68k_write_byte; s68k.memory_map[i].write16 = word_ram_s68k_write_word; } else { s68k.memory_map[i].read8 = NULL; s68k.memory_map[i].read16 = NULL; s68k.memory_map[i].write8 = NULL; s68k.memory_map[i].write16 = NULL; } break; } case 0x0c: case 0x0d: { /* $0C0000-$0DFFFF (mirrored every 1MB): unused in 2M mode (?) */ s68k.memory_map[i].base = scd.word_ram_2M + ((i & 0x03) << 16); /* automatic mirrored range remapping when switching Word-RAM */ if (i > 0x0f) { s68k.memory_map[i].read8 = word_ram_s68k_read_byte; s68k.memory_map[i].read16 = word_ram_s68k_read_word; s68k.memory_map[i].write8 = word_ram_s68k_write_byte; s68k.memory_map[i].write16 = word_ram_s68k_write_word; } else { s68k.memory_map[i].read8 = s68k_read_bus_8; s68k.memory_map[i].read16 = s68k_read_bus_16; s68k.memory_map[i].write8 = s68k_unused_8_w; s68k.memory_map[i].write16 = s68k_unused_16_w; } break; } case 0x0e: { /* $FE0000-$FEFFFF (mirrored every 1MB): 8KB backup RAM */ s68k.memory_map[i].base = NULL; s68k.memory_map[i].read8 = bram_read_byte; s68k.memory_map[i].read16 = bram_read_word; s68k.memory_map[i].write8 = bram_write_byte; s68k.memory_map[i].write16 = bram_write_word; break; } case 0x0f: { /* $FF0000-$FFFFFF (mirrored every 1MB): PCM hardware & SUB-CPU registers */ s68k.memory_map[i].base = NULL; s68k.memory_map[i].read8 = scd_read_byte; s68k.memory_map[i].read16 = scd_read_word; s68k.memory_map[i].write8 = scd_write_byte; s68k.memory_map[i].write16 = scd_write_word; break; } } } /* Initialize CD hardware */ cdc_init(); gfx_init(); /* Clear RAM */ memset(scd.prg_ram, 0x00, sizeof(scd.prg_ram)); memset(scd.word_ram, 0x00, sizeof(scd.word_ram)); memset(scd.word_ram_2M, 0x00, sizeof(scd.word_ram_2M)); memset(scd.bram, 0x00, sizeof(scd.bram)); } void scd_reset(int hard) { /* TODO: figure what exactly is resetted when RESET bit is cleared by SUB-CPU */ if (hard) { /* Clear all ASIC registers by default */ memset(scd.regs, 0, sizeof(scd.regs)); /* Clear pending DMNA write status */ scd.dmna = 0; /* H-INT default vector */ *(uint16 *)(m68k.memory_map[scd.cartridge.boot].base + 0x70) = 0x00FF; *(uint16 *)(m68k.memory_map[scd.cartridge.boot].base + 0x72) = 0xFFFF; /* Power ON initial values (MAIN-CPU side) */ scd.regs[0x00>>1].w = 0x0002; scd.regs[0x02>>1].w = 0x0001; /* 2M mode */ word_ram_switch(0); /* reset PRG-RAM bank on MAIN-CPU side */ m68k.memory_map[scd.cartridge.boot + 0x02].base = scd.prg_ram; m68k.memory_map[scd.cartridge.boot + 0x03].base = scd.prg_ram + 0x10000; /* allow access to PRG-RAM from MAIN-CPU */ m68k.memory_map[scd.cartridge.boot + 0x02].read8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x03].read8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].read16 = NULL; m68k.memory_map[scd.cartridge.boot + 0x03].read16 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].write8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x03].write8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].write16 = NULL; m68k.memory_map[scd.cartridge.boot + 0x03].write16 = NULL; zbank_memory_map[scd.cartridge.boot + 0x02].read = NULL; zbank_memory_map[scd.cartridge.boot + 0x03].read = NULL; zbank_memory_map[scd.cartridge.boot + 0x02].write = NULL; zbank_memory_map[scd.cartridge.boot + 0x03].write = NULL; /* reset & halt SUB-CPU */ s68k.cycles = 0; s68k_pulse_reset(); s68k_pulse_halt(); } else { /* Clear only SUB-CPU side registers */ memset(&scd.regs[0x04>>1], 0, sizeof(scd.regs) - 4); } /* SUB-CPU side default values */ scd.regs[0x08>>1].w = 0xffff; scd.regs[0x0a>>1].w = 0xffff; scd.regs[0x36>>1].w = 0x0100; scd.regs[0x40>>1].w = 0x000f; scd.regs[0x42>>1].w = 0xffff; scd.regs[0x44>>1].w = 0xffff; scd.regs[0x46>>1].w = 0xffff; scd.regs[0x48>>1].w = 0xffff; scd.regs[0x4a>>1].w = 0xffff; /* RESET register always return 1 (register $06 is unused by both sides, it is used for SUB-CPU first register) */ scd.regs[0x06>>1].byte.l = 0x01; /* Reset Timer & Stopwatch counters */ scd.timer = 0; scd.stopwatch = 0; /* Reset frame cycle counter */ scd.cycles = 0; /* Clear pending interrupts */ scd.pending = 0; /* Clear CPU polling detection */ memset(&m68k.poll, 0, sizeof(m68k.poll)); memset(&s68k.poll, 0, sizeof(s68k.poll)); /* Reset CD hardware */ cdd_reset(); cdc_reset(); gfx_reset(); pcm_reset(); } void scd_update(unsigned int cycles) { /* update CDC DMA transfer */ if (cdc.dma_w) { cdc_dma_update(); } /* run both CPU in sync until end of line */ do { m68k_run(cycles); s68k_run(scd.cycles + SCYCLES_PER_LINE); } while ((m68k.cycles < cycles) || (s68k.cycles < (scd.cycles + SCYCLES_PER_LINE))); /* increment CD hardware cycle counter */ scd.cycles += SCYCLES_PER_LINE; /* CDD processing at 75Hz (one clock = 12500000/75 = 500000/3 CPU clocks) */ cdd.cycles += (SCYCLES_PER_LINE * 3); if (cdd.cycles >= (500000 * 4)) { /* reload CDD cycle counter */ cdd.cycles -= (500000 * 4); /* update CDD sector */ cdd_update(); /* check if a new CDD command has been processed */ if (!(scd.regs[0x4a>>1].byte.l & 0xf0)) { /* reset CDD command wait flag */ scd.regs[0x4a>>1].byte.l = 0xf0; /* pending level 4 interrupt */ scd.pending |= (1 << 4); /* level 4 interrupt enabled */ if (scd.regs[0x32>>1].byte.l & 0x10) { /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } } /* Timer */ if (scd.timer) { /* decrement timer */ scd.timer -= SCYCLES_PER_LINE; if (scd.timer <= 0) { /* reload timer (one timer clock = 384 CPU cycles) */ scd.timer += (scd.regs[0x30>>1].byte.l * TIMERS_SCYCLES_RATIO); /* level 3 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x08) { /* trigger level 3 interrupt */ scd.pending |= (1 << 3); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } } /* GFX processing */ if (scd.regs[0x58>>1].byte.h & 0x80) { /* update graphics operation if running */ gfx_update(scd.cycles); } } void scd_end_frame(unsigned int cycles) { /* run Stopwatch until end of frame */ int ticks = (cycles - scd.stopwatch) / TIMERS_SCYCLES_RATIO; scd.regs[0x0c>>1].w = (scd.regs[0x0c>>1].w + ticks) & 0xfff; /* adjust Stopwatch counter for next frame (can be negative) */ scd.stopwatch += (ticks * TIMERS_SCYCLES_RATIO) - cycles; /* adjust SUB-CPU & GPU cycle counters for next frame */ s68k.cycles -= cycles; gfx.cycles -= cycles; /* reset CPU registers polling */ m68k.poll.cycle = 0; s68k.poll.cycle = 0; } int scd_context_save(uint8 *state) { uint16 tmp16; uint32 tmp32; int bufferptr = 0; /* internal harware */ save_param(scd.regs, sizeof(scd.regs)); save_param(&scd.cycles, sizeof(scd.cycles)); save_param(&scd.stopwatch, sizeof(scd.stopwatch)); save_param(&scd.timer, sizeof(scd.timer)); save_param(&scd.pending, sizeof(scd.pending)); save_param(&scd.dmna, sizeof(scd.dmna)); /* GFX processor */ bufferptr += gfx_context_save(&state[bufferptr]); /* CD Data controller */ bufferptr += cdc_context_save(&state[bufferptr]); /* CD Drive processor */ bufferptr += cdd_context_save(&state[bufferptr]); /* PCM chip */ bufferptr += pcm_context_save(&state[bufferptr]); /* PRG-RAM */ save_param(scd.prg_ram, sizeof(scd.prg_ram)); /* Word-RAM */ if (scd.regs[0x03>>1].byte.l & 0x04) { /* 1M mode */ save_param(scd.word_ram, sizeof(scd.word_ram)); } else { /* 2M mode */ save_param(scd.word_ram_2M, sizeof(scd.word_ram_2M)); } /* MAIN-CPU & SUB-CPU polling */ save_param(&m68k.poll, sizeof(m68k.poll)); save_param(&s68k.poll, sizeof(s68k.poll)); /* H-INT default vector */ tmp16 = *(uint16 *)(m68k.memory_map[scd.cartridge.boot].base + 0x72); save_param(&tmp16, 2); /* SUB-CPU registers */ tmp32 = s68k_get_reg(M68K_REG_D0); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D1); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D2); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D3); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D4); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D5); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D6); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_D7); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A0); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A1); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A2); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A3); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A4); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A5); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A6); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_A7); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_PC); save_param(&tmp32, 4); tmp16 = s68k_get_reg(M68K_REG_SR); save_param(&tmp16, 2); tmp32 = s68k_get_reg(M68K_REG_USP); save_param(&tmp32, 4); tmp32 = s68k_get_reg(M68K_REG_ISP); save_param(&tmp32, 4); /* SUB-CPU internal state */ save_param(&s68k.cycles, sizeof(s68k.cycles)); save_param(&s68k.int_level, sizeof(s68k.int_level)); save_param(&s68k.stopped, sizeof(s68k.stopped)); /* bootable MD cartridge */ if (scd.cartridge.boot) { bufferptr += md_cart_context_save(&state[bufferptr]); } return bufferptr; } int scd_context_load(uint8 *state) { int i; uint16 tmp16; uint32 tmp32; int bufferptr = 0; /* internal harware */ load_param(scd.regs, sizeof(scd.regs)); load_param(&scd.cycles, sizeof(scd.cycles)); load_param(&scd.stopwatch, sizeof(scd.stopwatch)); load_param(&scd.timer, sizeof(scd.timer)); load_param(&scd.pending, sizeof(scd.pending)); load_param(&scd.dmna, sizeof(scd.dmna)); /* GFX processor */ bufferptr += gfx_context_load(&state[bufferptr]); /* CD Data controller */ bufferptr += cdc_context_load(&state[bufferptr]); /* CD Drive processor */ bufferptr += cdd_context_load(&state[bufferptr]); /* PCM chip */ bufferptr += pcm_context_load(&state[bufferptr]); /* PRG-RAM */ load_param(scd.prg_ram, sizeof(scd.prg_ram)); /* PRG-RAM 128K bank mapped on MAIN-CPU side */ m68k.memory_map[scd.cartridge.boot + 0x02].base = scd.prg_ram + ((scd.regs[0x03>>1].byte.l & 0xc0) << 11); m68k.memory_map[scd.cartridge.boot + 0x03].base = m68k.memory_map[scd.cartridge.boot + 0x02].base + 0x10000; /* PRG-RAM can only be accessed from MAIN 68K & Z80 if SUB-CPU is halted (Dungeon Explorer USA version) */ if ((scd.regs[0x00].byte.l & 0x03) != 0x01) { m68k.memory_map[scd.cartridge.boot + 0x02].read8 = m68k.memory_map[scd.cartridge.boot + 0x03].read8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].read16 = m68k.memory_map[scd.cartridge.boot + 0x03].read16 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].write8 = m68k.memory_map[scd.cartridge.boot + 0x03].write8 = NULL; m68k.memory_map[scd.cartridge.boot + 0x02].write16 = m68k.memory_map[scd.cartridge.boot + 0x03].write16 = NULL; zbank_memory_map[scd.cartridge.boot + 0x02].read = zbank_memory_map[scd.cartridge.boot + 0x03].read = NULL; zbank_memory_map[scd.cartridge.boot + 0x02].write = zbank_memory_map[scd.cartridge.boot + 0x03].write = NULL; } else { m68k.memory_map[scd.cartridge.boot + 0x02].read8 = m68k.memory_map[scd.cartridge.boot + 0x03].read8 = m68k_read_bus_8; m68k.memory_map[scd.cartridge.boot + 0x02].read16 = m68k.memory_map[scd.cartridge.boot + 0x03].read16 = m68k_read_bus_16; m68k.memory_map[scd.cartridge.boot + 0x02].write8 = m68k.memory_map[scd.cartridge.boot + 0x03].write8 = m68k_unused_8_w; m68k.memory_map[scd.cartridge.boot + 0x02].write16 = m68k.memory_map[scd.cartridge.boot + 0x03].write16 = m68k_unused_16_w; zbank_memory_map[scd.cartridge.boot + 0x02].read = zbank_memory_map[scd.cartridge.boot + 0x03].read = zbank_unused_r; zbank_memory_map[scd.cartridge.boot + 0x02].write = zbank_memory_map[scd.cartridge.boot + 0x03].write = zbank_unused_w; } /* Word-RAM */ if (scd.regs[0x03>>1].byte.l & 0x04) { /* 1M Mode */ load_param(scd.word_ram, sizeof(scd.word_ram)); if (scd.regs[0x03>>1].byte.l & 0x01) { /* Word-RAM 1 assigned to MAIN-CPU */ for (i=scd.cartridge.boot+0x20; i>1].byte.l) >> 1); } return M68K_INT_ACK_AUTOVECTOR; } Makefile.gc000664 001750 001750 00000014302 12702465756 013750 0ustar00sergiosergio000000 000000 #--------------------------------------------------------------------------------- # Clear the implicit built in rules #--------------------------------------------------------------------------------- .SUFFIXES: #--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITPPC)),) $(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC) endif include $(DEVKITPPC)/gamecube_rules #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files #--------------------------------------------------------------------------------- TARGET := genplus_cube BUILD := build_cube SOURCES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds \ $(BUILD) #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DDISABLE_MANY_OGG_OPEN_FILES -DUSE_16BPP_RENDERING -DALT_RENDERER CXXFLAGS = $(CFLAGS) LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- LIBS := -lpng -lfat -liso9660 -lasnd -logc -lm -lz #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- LIBDIRS := $(PORTLIBS) #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional # rules for different file extensions #--------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- export OUTPUT := $(CURDIR)/$(TARGET) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ $(foreach dir,$(DATA),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) #--------------------------------------------------------------------------------- # automatically build a list of object files for our project #--------------------------------------------------------------------------------- CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- ifeq ($(strip $(CPPFILES)),) export LD := $(CC) else export LD := $(CXX) endif export OFILES := $(addsuffix .o,$(BINFILES)) \ $(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) $(OGGFILES:.ogg=.ogg.o) \ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ $(sFILES:.s=.o) $(SFILES:.S=.o) #--------------------------------------------------------------------------------- # build a list of include paths #--------------------------------------------------------------------------------- export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I$(CURDIR)/$(BUILD) \ -I$(LIBOGC_INC) -I$(PORTLIBS)/include #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ -L$(LIBOGC_LIB) export OUTPUT := $(CURDIR)/$(TARGET) .PHONY: $(BUILD) clean #--------------------------------------------------------------------------------- $(BUILD): @[ -d $@ ] || mkdir -p $@ @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.gc #--------------------------------------------------------------------------------- clean: @echo clean ... @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol #--------------------------------------------------------------------------------- else DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- # main targets #--------------------------------------------------------------------------------- $(OUTPUT).dol: $(OUTPUT).elf $(OUTPUT).elf: $(OFILES) #--------------------------------------------------------------------------------- # This rule links in binary data with the various extension #--------------------------------------------------------------------------------- %.jpg.o : %.jpg @echo $(notdir $<) $(bin2o) %.png.o : %.png @echo $(notdir $<) $(bin2o) %.pcm.o : %.pcm @echo $(notdir $<) $(bin2o) %.ogg.o : %.ogg @echo $(notdir $<) $(bin2o) -include $(DEPENDS) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- gx/images/Ctrl_graphic_board.png000664 001750 001750 00000012664 12702465756 020072 0ustar00sergiosergio000000 000000 PNG  IHDRX`sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/10/14a;IDATx{WU?Wr7&o@F|5 H 2tPJ8:: g1 8 ίxiGJқyfsrI/{kߵwhZ4 \ |iz mJ_PĐe=='h:5 wʵgO(b/rRld.|-r^ݢA&V_pRRч[I|i'q{Ľ;\(.[NSGN2(oGI2&~ U|oFGʲ4 v#PrYVEzįGq1d@2 [׮ G; E qԹ>` ^xu| ~N\LLDu(:9Yz{!WFS[ȉBVVKȫ?{GЊnow3k nwRzpI Ad G Y>T ~ ~1g$AsSQfNC9M uH(z8,si=Ϡ ,Gq qs YwF~D7n?@ѿȅ(.G A|) dy{ qDh5U"hؗҵCڟ@[OG]E= )Bj M'adMh~ ^D 0fͯ鸯/O:[A?eDM/ p´+P`%AįhG0_D^S73#0?0ˢ~q41Q~4623|}=h=9D"k N« k236YECbm+,9ڜząQҨsy77)`FCquAq ?)4"-dD'p෢ Pߍ!`<'P|Mi`5vQ@=j!/PԽ, (З ћ޴4m#{3? gB; 4e([VS}bJ;x:F|?Me=hjJ~1iF]4X_P4VZed3PȀOQ,f&2mVIۺhJ>-DȊI $X~~9}) 5G>~߈z.G8'hsq-\8Fӡ@?Ŋ-VΖ<8Adbq,ux8=h51ĩRh[Rз(NY-9UPq4 g2Z3xx/ZI Cg1ʈiJS $ d3-Y#&eAAfy S"eh@Z/Cpx wjB ZSiy ry&–="/<[gK){ܟ# s|Lv=9btZ,xZI Ľ14%SҖ羀4 ()QmPH,N[#a?޽S2`li9%YDanL{ d$O"ލH ie[Q{iZgn"Zppn:FGuNt_93Eb#Lw.sxi\^Jj8;c%1fkpGQ,~v@eZ)@YFUor O <ȺM7r?׳[lo_ݑtOPfDv֙&rT 5=wsQCׇv roȉS{In[M/Ҿ rD4#B!$ʥ %ĝ:@SznmjzpK(d9'l3(理rʖ91L#[HΨ EQ4P<4ά)(GORqtb^gG^P]SSZ'б'DO2YIXOlEvzN eIw sLJj?&ln@ۛBǀG|u{C Jrю{)JA'~ YekǞlpe3 n40=a "n~(z"@1=9᢭{0ڪ F^|{,Г׼ j *~}Qts58$A3Ǿ+U'I: ]F/rJa]Y 9Vv PGX#Pa(GϢE>NڟlS!E p(ajkY  LDy;@;4oW,˙/˦ID-/ }G8g<7'R\x;e1 "/SvYQGQ;ۡTιfSJB+PE 1F4,AړKQDYlE͞AՈ/WRVxOWPz0 iy^:r(bD}>)!gq?)hJM(WP9 ?W՟svD973zsÎZ={WgGV"nQ]e^rd#+rÆ(qfuԱG 49 _srj P|~(0tB@.ŷz #О+/M&|bҼ;)7W'šYut!O-`p,DA_27 }LJlU3Mx?؀`ɔvS?9KW`w( xQ{>hgseL x w j.(1=?? +* ~? %%GiQ:.E;Ixy4 ^5A}5ZCH8 3[ =2mb?WQX{YG+#^ 'nN`WJc$B^<#/,tBOLص4ʱZ4;1tWíyN˩NWy{,Xc2pe<=y{,Xc2pe<=y{,Xcv.Ѓ!wu}S\=:D0p{]ןJzkUU-`k]׷r;kS];um.tSօ.7?ko@H\U(zk=q;%쉎lC2Lo ,;-]NLzjSr[OumS||2qoE}_۲-^s]1[щMu]FwQ~dqN7Rނ/L3C۰{;$]6E]a[({}h ,]֘[Џovu}0y#2 𺪪ʹ>Gz{T|s}򛫪ze@̛\}K*vhe':"w $`S{]Խ[6?ۀb;a$=tMmhVUƨFSNsh텮6AXֆ77ٚD2{UUu'Ԯ_oB 0ѹtֺʖ[C='q@涪w _s=mDٺ>>l Ƿ2 ::~;"S6n›o PtƎc[Rxss^R]UU@fnz%3`6SUUYhޒg7w lUU$+XUYfq9n6ۑC;e߁(t͈{3l } 2S(Ժ+ wΒ )χ:ܙz|GsIZ 3c;^o3धIENDB`gx/images/Button_down_over.png000664 001750 001750 00000010277 12702465756 017655 0ustar00sergiosergio000000 000000 PNG  IHDRh ?`sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATxipu3;Xxߢx *T"e;LR\)ӕJRJ㊒賫Rrʪc%i[$ eX$@;3}r3=4W7>4>{p]@!Rp9 >IM: Tq1il=M);etըP*%cM@36j7cH {qP@ bܲ,Yq@= x PP01+R8&_emɻEsqqq)P#. g)Zޤk\U‡:G\Ů1y捀Ypg5L̃jK1l/xŽ㋽;n<O"cϥ< y8c0druuIZ)N(wLjtuI82!* `#4oO2|N^!a<x)Lbxp0(kE<` (H 2,T;ҮD=It¼v8Em&,FӡUrcqWQ7gm} WLc 1 q9/s^->,c e zqӃp3wWJҕ._VSS!۶b%S=YN ʴ8QUӈ{bPq.y<Rl>]S!T A۾(;ׅ+ރee*"8( V;T*5liqɠK/f@^v ?~{aWG7ɮ/kUZqxmܺkosWW73^'GCe9T ^a|?R?k.6&Vo[[=QL4)Ӊe&Fڑ ~aJ\]6ʟhKm#S8Dw|ōۿ80 AvIfopJ: SWZӠ ~g'oۋ{IGUmb:}D= m\ƩO|!@ӚFqP:^gȍ? F___?>ߓTt×OVUвhLQZ E9Md;68J#֎p΂uHayv<(?} m_m۶ntttoת^B5]=hM\Fϯ3G~m{Ѻ-A(3Ɣsp#9'?9s N&_=s… :;;YGG'*[dmMɦk g,]A++he}PEq 6 {a8u8/KaڑY Ù#^ݳܨ:޾/Z <6(ɛnjfO8Y;I,VFB4yЀVƨZ+v}ן~<)~u{~ vM';.kGC8gqyC hJ9lNxguS m=p-ǷZ~inѺD{ƭs =!Vo܅-E:zV@7wkcҊeb[]k ?9::e4m{zݞf,؀;+het1n>l B@L)];*HK#֎p΂ua?49Xj͎]|}?ܧ ( L@zhhL&/Х*n.Sl忯ch@+@lڍ]Рur^ǵs]G%'by,^:.~ylf|dź'{;{ݿz9 Dh<66itld/Y(qh@+@-o։8y1b y h}}٫7qz_z=v3C<ׁ@\xСUvܼE[j߳aV՞Âe㝇/|@MP)D%w&×nvup,YkJ5C'yЀV8@vi`KOڑYt\; h0MׁaZek?ͤ˒?ɫ?7|s PjR@N ?0{ps=m$ 8!% h%|41j@ǁIOQYZ>˛dg x+>022O?adptaitl}gEF9#}mν/3RROJ<Ej@k@+cԀ<}x;7D;'(qӳ.klG6^7?^+ًhmYbT0Wglz[E$7Hrc Yz`Q  CH2D{20}*ik@K^yD< h~iTU8֧Mfil^v?~bJj !GGFԄ9ot30ejg5PpNa <0c)z@(F hy|1Ʋ-G4wts毰R zh=Sjhk[80& jʀqtliovv=V'Invs8w!elx6g^1N8gs#5q`a-^$k2P:7ISR&S x-܄7]dQ:  9y&UG:LuTh$R-p(`o@F|s:> if-+9=شL5id%k̺?r"U?J\ӣ6>6/d(DPfԎnrsUs2$eO"˪|JӐʹ,SIcF6RT:bIe桒㩞R[3;bi܈q^L aDMUƫ;_]SwwVu *L d 𦺐IENDB`gx/images/Key_L_gcn.png000664 001750 001750 00000003472 12702465756 016151 0ustar00sergiosergio000000 000000 PNG  IHDR,sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/19/10IDATx͗k~ȒvWZʖiL]ٔ -i^PzZH/^z#ؤ^0Tc`串vW933䤡Wx9g/vϙyJR.e``RD>Ƕm8F)y4M*G>y[[[?*EQDq?nK'z裏!2SSSsa \)%qlfnݺufqq+++]ם8p@_Pu ցlFG;;;k56^Ͽbٳgn47|cX! 355ɓ'```n,RJ666˿sOG9(GR,q8ZF++EsVWWT*ܽ{}(Vpq) )Rꕵ?23<ֺJy&'''B.9J1"s#qR;v S(ɞ |mE S853yjY7`t~JfXNѸ˲L+qLYLǶd2T*>}92NN@URxϋMxk<J1\io,,Hۭ²,!Q |e P; /}CHɯy!//Ka˲ XXX޾tBs^%b!A㦒A0هazG}k_\<.0u]*۷o˸DQ=)mu yAF] dߦ|"Fs؀KoիWw]CLٵZ|>ϵk>f]'K1aeYj5&Z]@*h[N`` C:;;9u??׹wxZxi6^ Һi@$ dRRlV-v K`j4βfZُ=R plZ*ڮ.6e0D!BJָ&FcPd:YQf+jĉbii-c666~033C}k ogˠOff0iDU77N nKIfM/4mY36>{uuuX,~`4+@Sd͔&?ŴgϞ啑 jD |CrVr\fԍvj@}ARDQę3gZu`GGf3$_*D{DB&AoooVZfR2Qߓ&is ===i<%Ͼ祀XR B8>~WA@.# V{mYXUIi%%&m{ľɽijYy p!bQ6~)9vWT6/o(4Y-BJI6emm )Q8N>rRIENDB`core/input_hw/terebi_oekaki.h000664 001750 001750 00000004503 12702465756 017455 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Terebi Oekaki graphic board support * * Copyright (C) 2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _TEREBI_H_ #define _TEREBI_H_ /* Function prototypes */ extern void terebi_oekaki_reset(void); extern unsigned short terebi_oekaki_read(void); extern void terebi_oekaki_write(unsigned char data); #endif core/sound/sn76489.h000664 001750 001750 00000001137 12702465756 015215 0ustar00sergiosergio000000 000000 /* SN76489 emulation by Maxim in 2001 and 2002 */ #ifndef _SN76489_H_ #define _SN76489_H_ #include "blip_buf.h" #define SN_DISCRETE 0 #define SN_INTEGRATED 1 /* Function prototypes */ extern void SN76489_Init(int type); extern void SN76489_Reset(void); extern void SN76489_Config(unsigned int clocks, int preAmp, int boostNoise, int stereo); extern void SN76489_Write(unsigned int clocks, unsigned int data); extern void SN76489_Update(unsigned int cycles); extern void *SN76489_GetContextPtr(void); extern int SN76489_GetContextSize(void); #endif /* _SN76489_H_ */ core/cart_hw/sms_cart.h000664 001750 001750 00000005045 12702465756 016267 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * SG-1000, Master System & Game Gear cartridge hardware support * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _SMS_CART_H_ #define _SMS_CART_H_ /* Special hardware */ #define HW_3D_GLASSES 0x01 #define HW_TEREBI_OEKAKI 0x02 /* Function prototypes */ extern void sms_cart_init(void); extern void sms_cart_reset(void); extern void sms_cart_switch(uint8 mode); extern int sms_cart_region_detect(void); extern int sms_cart_context_save(uint8 *state); extern int sms_cart_context_load(uint8 *state); #endif sdl/error.c000664 001750 001750 00000000747 12702465756 014007 0ustar00sergiosergio000000 000000 /* error.c -- Error logging */ #include "osd.h" static FILE *error_log; void error_init(void) { #ifdef LOGERROR error_log = fopen("error.log","w"); #endif } void error_shutdown(void) { #ifdef LOGERROR if(error_log) fclose(error_log); #endif } void error(char *format, ...) { #ifdef LOGERROR if (log_error) { va_list ap; va_start(ap, format); if(error_log) vfprintf(error_log, format, ap); va_end(ap); } #endif } core/input_hw/terebi_oekaki.c000664 001750 001750 00000005333 12702465756 017452 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Terebi Oekaki graphic board support * * Copyright (C) 2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 axis; uint8 busy; } tablet; void terebi_oekaki_reset(void) { input.analog[0][0] = 128; input.analog[0][1] = 128; tablet.axis = 1; tablet.busy = 1; } unsigned short terebi_oekaki_read(void) { uint16 data = (tablet.busy << 15) | input.analog[0][tablet.axis]; if (!(input.pad[0] & INPUT_B)) { data |= 0x100; } /* clear BUSY flag */ tablet.busy = 0; return data; } void terebi_oekaki_write(unsigned char data) { /* X (1) or Y (0) axis */ tablet.axis = (data & 1) ^ 1; /* set BUSY flag */ tablet.busy = 1; } core/sound/sn76489.c000664 001750 001750 00000030746 12702465756 015220 0ustar00sergiosergio000000 000000 /* SN76489 emulation by Maxim in 2001 and 2002 converted from my original Delphi implementation I'm a C newbie so I'm sure there are loads of stupid things in here which I'll come back to some day and redo Includes: - Super-high quality tone channel "oversampling" by calculating fractional positions on transitions - Noise output pattern reverse engineered from actual SMS output - Volume levels taken from actual SMS output 07/08/04 Charles MacDonald Modified for use with SMS Plus: - Added support for multiple PSG chips. - Added reset/config/update routines. - Added context management routines. - Removed SN76489_GetValues(). - Removed some unused variables. 25/04/07 Eke-Eke (Genesis Plus GX) - Removed stereo GG support (unused) - Made SN76489_Update outputs 16bits mono samples - Replaced volume table with VGM plugin's one 05/01/09 Eke-Eke (Genesis Plus GX) - Modified Cut-Off frequency (according to Steve Snake: http://www.smspower.org/forums/viewtopic.php?t=1746) 24/08/10 Eke-Eke (Genesis Plus GX) - Removed multichip support (unused) - Removed alternate volume table, panning & mute support (unused) - Removed configurable Feedback and Shift Register Width (always use Sega ones) - Added linear resampling using Blip Buffer (based on Blargg's implementation: http://www.smspower.org/forums/viewtopic.php?t=11376) 01/09/12 Eke-Eke (Genesis Plus GX) - Added generic Blip-Buffer support internally, using common Master Clock as timebase - Re-added stereo GG support - Re-added configurable Feedback and Shift Register Width - Rewrote core with various optimizations */ #include "shared.h" #define PSG_MCYCLES_RATIO (16 * 15) /* Initial state of shift register */ #define NoiseInitialState 0x8000 /* Value below which PSG does not output */ /*#define PSG_CUTOFF 0x6*/ #define PSG_CUTOFF 0x1 /* original Texas Instruments TMS SN76489AN (rev. A) used in SG-1000, SC-3000H & SF-7000 computers */ #define FB_DISCRETE 0x0006 #define SRW_DISCRETE 15 /* SN76489AN clone integrated in Sega's VDP chips (315-5124, 315-5246, 315-5313, Game Gear) */ #define FB_SEGAVDP 0x0009 #define SRW_SEGAVDP 16 typedef struct { /* Configuration */ int PreAmp[4][2]; /* stereo channels pre-amplification ratio (%) */ int NoiseFeedback; int SRWidth; /* PSG registers: */ int Registers[8]; /* Tone, vol x4 */ int LatchedRegister; int NoiseShiftRegister; int NoiseFreq; /* Noise channel signal generator frequency */ /* Output calculation variables */ int ToneFreqVals[4]; /* Frequency register values (counters) */ int ToneFreqPos[4]; /* Frequency channel flip-flops */ int Channel[4][2]; /* current amplitude of each (stereo) channel */ int ChanOut[4][2]; /* current output value of each (stereo) channel */ /* Internal M-clock counter */ unsigned long clocks; } SN76489_Context; static const uint16 PSGVolumeValues[16] = { /* These values are taken from a real SMS2's output */ /*{892,892,892,760,623,497,404,323,257,198,159,123,96,75,60,0}, */ /* I can't remember why 892... :P some scaling I did at some point */ /* these values are true volumes for 2dB drops at each step (multiply previous by 10^-0.1) */ 1516,1205,957,760,603,479,381,303,240,191,152,120,96,76,60,0 }; static SN76489_Context SN76489; void SN76489_Init(int type) { int i; for (i=0; i<4; i++) { SN76489.PreAmp[i][0] = 100; SN76489.PreAmp[i][1] = 100; } if (type == SN_DISCRETE) { SN76489.NoiseFeedback = FB_DISCRETE; SN76489.SRWidth = SRW_DISCRETE; } else { SN76489.NoiseFeedback = FB_SEGAVDP; SN76489.SRWidth = SRW_SEGAVDP; } } void SN76489_Reset() { int i; for(i = 0; i <= 3; i++) { /* Initialise PSG state */ SN76489.Registers[2*i] = 1; /* tone freq=1 */ SN76489.Registers[2*i+1] = 0xf; /* vol=off */ /* Set counters to 0 */ SN76489.ToneFreqVals[i] = 0; /* Set flip-flops to 1 */ SN76489.ToneFreqPos[i] = 1; /* Clear stereo channels amplitude */ SN76489.Channel[i][0] = 0; SN76489.Channel[i][1] = 0; /* Clear stereo channel outputs in delta buffer */ SN76489.ChanOut[i][0] = 0; SN76489.ChanOut[i][1] = 0; } /* Initialise latched register index */ SN76489.LatchedRegister = 0; /* Initialise noise generator */ SN76489.NoiseShiftRegister=NoiseInitialState; SN76489.NoiseFreq = 0x10; /* Reset internal M-cycle counter */ SN76489.clocks = 0; } void *SN76489_GetContextPtr(void) { return (uint8 *)&SN76489; } int SN76489_GetContextSize(void) { return sizeof(SN76489_Context); } /* Updates tone amplitude in delta buffer. Call whenever amplitude might have changed. */ INLINE void UpdateToneAmplitude(int i, int time) { int delta; /* left output */ delta = (SN76489.Channel[i][0] * SN76489.ToneFreqPos[i]) - SN76489.ChanOut[i][0]; if (delta != 0) { SN76489.ChanOut[i][0] += delta; blip_add_delta_fast(snd.blips[0][0], time, delta); } /* right output */ delta = (SN76489.Channel[i][1] * SN76489.ToneFreqPos[i]) - SN76489.ChanOut[i][1]; if (delta != 0) { SN76489.ChanOut[i][1] += delta; blip_add_delta_fast(snd.blips[0][1], time, delta); } } /* Updates noise amplitude in delta buffer. Call whenever amplitude might have changed. */ INLINE void UpdateNoiseAmplitude(int time) { int delta; /* left output */ delta = (SN76489.Channel[3][0] * ( SN76489.NoiseShiftRegister & 0x1 )) - SN76489.ChanOut[3][0]; if (delta != 0) { SN76489.ChanOut[3][0] += delta; blip_add_delta_fast(snd.blips[0][0], time, delta); } /* right output */ delta = (SN76489.Channel[3][1] * ( SN76489.NoiseShiftRegister & 0x1 )) - SN76489.ChanOut[3][1]; if (delta != 0) { SN76489.ChanOut[3][1] += delta; blip_add_delta_fast(snd.blips[0][1], time, delta); } } /* Runs tone channel for clock_length clocks */ static void RunTone(int i, int clocks) { int time; /* Update in case a register changed etc. */ UpdateToneAmplitude(i, SN76489.clocks); /* Time of next transition */ time = SN76489.ToneFreqVals[i]; /* Process any transitions that occur within clocks we're running */ while (time < clocks) { if (SN76489.Registers[i*2]>PSG_CUTOFF) { /* Flip the flip-flop */ SN76489.ToneFreqPos[i] = -SN76489.ToneFreqPos[i]; } else { /* stuck value */ SN76489.ToneFreqPos[i] = 1; } UpdateToneAmplitude(i, time); /* Advance to time of next transition */ time += SN76489.Registers[i*2] * PSG_MCYCLES_RATIO; } /* Update channel tone counter */ SN76489.ToneFreqVals[i] = time; } /* Runs noise channel for clock_length clocks */ static void RunNoise(int clocks) { int time; /* Noise channel: match to tone2 if in slave mode */ int NoiseFreq = SN76489.NoiseFreq; if (NoiseFreq == 0x80) { NoiseFreq = SN76489.Registers[2*2]; SN76489.ToneFreqVals[3] = SN76489.ToneFreqVals[2]; } /* Update in case a register changed etc. */ UpdateNoiseAmplitude(SN76489.clocks); /* Time of next transition */ time = SN76489.ToneFreqVals[3]; /* Process any transitions that occur within clocks we're running */ while (time < clocks) { /* Flip the flip-flop */ SN76489.ToneFreqPos[3] = -SN76489.ToneFreqPos[3]; if (SN76489.ToneFreqPos[3] == 1) { /* On the positive edge of the square wave (only once per cycle) */ int Feedback = SN76489.NoiseShiftRegister; if ( SN76489.Registers[6] & 0x4 ) { /* White noise */ /* Calculate parity of fed-back bits for feedback */ /* Do some optimised calculations for common (known) feedback values */ /* If two bits fed back, I can do Feedback=(nsr & fb) && (nsr & fb ^ fb) */ /* since that's (one or more bits set) && (not all bits set) */ Feedback = ((Feedback & SN76489.NoiseFeedback) && ((Feedback & SN76489.NoiseFeedback) ^ SN76489.NoiseFeedback)); } else /* Periodic noise */ Feedback = Feedback & 1; SN76489.NoiseShiftRegister = (SN76489.NoiseShiftRegister >> 1) | (Feedback << (SN76489.SRWidth - 1)); UpdateNoiseAmplitude(time); } /* Advance to time of next transition */ time += NoiseFreq * PSG_MCYCLES_RATIO; } /* Update channel tone counter */ SN76489.ToneFreqVals[3] = time; } static void SN76489_RunUntil(unsigned int clocks) { int i; /* Run noise first, since it might use current value of third tone frequency counter */ RunNoise(clocks); /* Run tone channels */ for (i=0; i<3; ++i) { RunTone(i, clocks); } } void SN76489_Config(unsigned int clocks, int preAmp, int boostNoise, int stereo) { int i; /* cycle-accurate Game Gear stereo */ if (clocks > SN76489.clocks) { /* Run chip until current timestamp */ SN76489_RunUntil(clocks); /* Update internal M-cycle counter */ SN76489.clocks += ((clocks - SN76489.clocks + PSG_MCYCLES_RATIO - 1) / PSG_MCYCLES_RATIO) * PSG_MCYCLES_RATIO; } for (i=0; i<4; i++) { /* stereo channel pre-amplification */ SN76489.PreAmp[i][0] = preAmp * ((stereo >> (i + 4)) & 1); SN76489.PreAmp[i][1] = preAmp * ((stereo >> (i + 0)) & 1); /* noise channel boost */ if (i == 3) { SN76489.PreAmp[3][0] = SN76489.PreAmp[3][0] << boostNoise; SN76489.PreAmp[3][1] = SN76489.PreAmp[3][1] << boostNoise; } /* update stereo channel amplitude */ SN76489.Channel[i][0]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][0]) / 100; SN76489.Channel[i][1]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][1]) / 100; } } void SN76489_Update(unsigned int clocks) { int i; if (clocks > SN76489.clocks) { /* Run chip until current timestamp */ SN76489_RunUntil(clocks); /* Update internal M-cycle counter */ SN76489.clocks += ((clocks - SN76489.clocks + PSG_MCYCLES_RATIO - 1) / PSG_MCYCLES_RATIO) * PSG_MCYCLES_RATIO; } /* Adjust internal M-cycle counter for next frame */ SN76489.clocks -= clocks; /* Adjust channel time counters for new frame */ for (i=0; i<4; ++i) { SN76489.ToneFreqVals[i] -= clocks; } } void SN76489_Write(unsigned int clocks, unsigned int data) { unsigned int index; if (clocks > SN76489.clocks) { /* run chip until current timestamp */ SN76489_RunUntil(clocks); /* update internal M-cycle counter */ SN76489.clocks += ((clocks - SN76489.clocks + PSG_MCYCLES_RATIO - 1) / PSG_MCYCLES_RATIO) * PSG_MCYCLES_RATIO; } if (data & 0x80) { /* latch byte %1 cc t dddd */ SN76489.LatchedRegister = index = (data >> 4) & 0x07; } else { /* restore latched register index */ index = SN76489.LatchedRegister; } switch (index) { case 0: case 2: case 4: /* Tone Channels frequency */ { if (data & 0x80) { /* Data byte %1 cc t dddd */ SN76489.Registers[index] = (SN76489.Registers[index] & 0x3f0) | (data & 0xf); } else { /* Data byte %0 - dddddd */ SN76489.Registers[index] = (SN76489.Registers[index] & 0x00f) | ((data & 0x3f) << 4); } /* zero frequency behaves the same as a value of 1 */ if (SN76489.Registers[index] == 0) { SN76489.Registers[index] = 1; } break; } case 1: case 3: case 5: /* Tone Channels attenuation */ { data &= 0x0f; SN76489.Registers[index] = data; data = PSGVolumeValues[data]; index >>= 1; SN76489.Channel[index][0] = (data * SN76489.PreAmp[index][0]) / 100; SN76489.Channel[index][1] = (data * SN76489.PreAmp[index][1]) / 100; break; } case 6: /* Noise control */ { SN76489.Registers[6] = data & 0x0f; /* reset shift register */ SN76489.NoiseShiftRegister = NoiseInitialState; /* set noise signal generator frequency */ SN76489.NoiseFreq = 0x10 << (data&0x3); break; } case 7: /* Noise attenuation */ { data &= 0x0f; SN76489.Registers[7] = data; data = PSGVolumeValues[data]; SN76489.Channel[3][0] = (data * SN76489.PreAmp[3][0]) / 100; SN76489.Channel[3][1] = (data * SN76489.PreAmp[3][1]) / 100; break; } } } gx/images/Load_recent.png000664 001750 001750 00000013054 12702465756 016533 0ustar00sergiosergio000000 000000 PNG  IHDRH\ͪsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/25/11uE{IDATx{TU?Ϲq=!H@EPc"ecZꔉVΤSrӚ,kƙk^&D6oNyY:>@*!_ Eply߾dY'X֑ `$ z 8 E֣B YrwEQvwn dZoq=,xSw{hsK0׳]ŧ{frS/h_n?k]Zﹽ,Z/2dZ6;E\_nAwHh~v\ӃVz`靫ϯzյ͝U?+:ض;Vg(Vk&=_Ѷ {6=(PתV(Ƌxm T6V5s()bCCQshۼ,:t%%%4666566z2v;Ɵ@ю"Ȟ(N^\|3f\(z7z!j#GHKKU*eee^J$It:ILL d7 y`'9n#U{gee{< b8mcRw)pgΜ!&&CF,NTj|TWWsi222عsgf%''SQQAZZl6ٹs'~!%%% x<$IBk2 sαo>ƍg?ewoqIE`Sk $RPP@FFОfAvmt:~`ݺu@ej5NYh4Fʲpp8|骫ٻw/O&333~/@ hT*h4ŋyhA>u˖-#??Pn7---DFFJjj*IIIfJ%^hsB8wEEEx"k׮ҥK^zQFD?f XcǎF=d2A`f͒y(,,$""&Ù3gSN%..z= `dر477SUUšClhmme۶m8o1iRʨU4sz=--- 00eʔ񴭍C( Yl999 0Vʕ+yIJJh4h:@V뉈 %%1c 2nI8UŔQQQ ޹!_\XXF!>>r˖-vǎ Ʉ(8NZ-(bXT)@PЙ mq\uMCiQ8z(&<<ܗ8-!Z=> ++ ٌdȑ$&&ސAeټy3ZYf1q. X,`mkwu?(v%@tt4Ng2"77F~nXسgϟh4IOO2墮VV.ӷŋIOOp> |}UGUZ[[=z4Geܸqݻw/(,,믿FTT*;v,s̹iFAh4hZrо8{9q8x^>222tS;fhZ ƍk"w)..&88Œ3n*$IE 0yd1dgg yyyMǴ tIN~xFP pZݽ~S*P( !55ll6.]"11~xA{aѾzw8 C*Pn# 9ٳԠP(0 6,mS;eee|g۷"dY&//ŋhAT aV[tD҂Z&<1=ZFRVec[mͻ(攗2h4^/Z.?""GyӧzK6qhZz=&I*; qDQf rZPWWGmm--0$${w, > s%==cx(EZZZ㏨T*^lX !XlZh[M\t/2aaak߿IB(s%nʔ)S$I;w|L&CZtK{kq(K.b 2+V#6@~;;Ƹq8x N3gp+`c2$I$RywK/Ddd$ WgYс(--eTWWc6:u*k׮$:3!Cp=R.q8l޼#GIUU'Of0<R^u~ꫯB]X&<7n\˰a<8N$I5kp@)---|DŽڊbaҥ_*_AWo4}W_}e{ٷoqqqx^xW9gqUUUUl۶-[ * ͪU7ort=8fX,aժU;+WhE+V`ٮ9}k֬a֭( 4 EOlY^ŬV^;@E1 (?uT+©S`46m?0X,khhŋ8q={PPP^G$T* .dɒ%h4Moz$В%K=z4@L/?dggc0PT8N ѣ1bFq 8NJKK9{,999 I8Nf3<(]*@ZVm@ܢ7o>Nj L&Q 8jkkq8KH׋R$%%LM V*ի.fhiiy0++ݻwBTB$IG) ;FCll,&L`̙$&&tqNwW)(++Kο/'P L&111 >xZC[vtnVMvױp={VsE***hjj$%%y###/@MCob{$ڎI Tmu&sW.][w-ͭ$}O ? >'C@~}O ? >'C@~}O ? >'C@~_=[UTT[ZZ-SN,33%?;=zoccrz7))i{>Ç|gLT*7lƍ\|, Stt۷?vڅ'O\V1c[=ؗڂfyǺu|'.2QQWW~wڵk̿UGe{E}tܹ䂂#F 65_牭[w尌FΎKX,I&jh46\r%ܹs&njO>c_9sʄ$ :uTTdd$ӧOׯem<Ochh(cǎݴbŊϟO?4iѢEH䌋㮻Zc͛7/駟BoS0?_z5O!!!vT[[; ""nRK,T*rƄ+VHЃ1Hr!IR'U wXXع s'333?olHTTT }ٳ>sGM˳gϾc~g7M0a$I$I(}] V]@aaa-*{.;wO0/_dݎ ST*^?pHjZ)BUgvjꏷ aNZ~Yv:ޔ=zۦ$MU('PC y䑿y^eEE;777Orr 6jvvU٭Su]Gv1O?3gΜԨ~hyyLe -G/B=vF#ͻW^ㅅc׭[7@$h4/_0aB^?_XXz^$IRtZ֭[ /ׯ߱3gP]]߿w:<ר `\.B$T&%%Ç_8p`Qd`… M&22/ĉ͛'/[o:,rvvC )))s~TrdxMMMJve#q.6dȐ&ȯ"""t:@BBɆ -Z^:xJtRۼyl6Gt  ..񜪫Sy~qqq% j/h4*I&oUU8jȐ!6tЯ_hobAIENDB`sdl/error.h000664 001750 001750 00000000263 12702465756 014005 0ustar00sergiosergio000000 000000 #ifndef _ERROR_H_ #define _ERROR_H_ /* Function prototypes */ void error_init(void); void error_shutdown(void); void error(char *format, ...); #endif /* _ERROR_H_ */ core/state.h000664 001750 001750 00000005032 12702465756 014141 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Savestate support * * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _STATE_H_ #define _STATE_H_ #define STATE_SIZE 0xfd000 #define STATE_VERSION "GENPLUS-GX 1.7.5" #define load_param(param, size) \ memcpy(param, &state[bufferptr], size); \ bufferptr+= size; #define save_param(param, size) \ memcpy(&state[bufferptr], param, size); \ bufferptr+= size; /* Function prototypes */ extern int state_load(unsigned char *state); extern int state_save(unsigned char *state); #endif core/cart_hw/sms_cart.c000664 001750 001750 00000155505 12702465756 016271 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * SG-1000, Master System & Game Gear cartridge hardware support * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "eeprom_93c.h" #include "terebi_oekaki.h" #define MAPPER_NONE (0x00) #define MAPPER_TEREBI (0x01) #define MAPPER_RAM_2K (0x02) #define MAPPER_RAM_8K_EXT1 (0x03) #define MAPPER_RAM_8K_EXT2 (0x04) #define MAPPER_SEGA (0x10) #define MAPPER_SEGA_X (0x11) #define MAPPER_93C46 (0x12) #define MAPPER_CODIES (0x13) #define MAPPER_MULTI_16K (0x14) #define MAPPER_KOREA (0x15) #define MAPPER_KOREA_16K (0x16) #define MAPPER_KOREA_8K (0x20) #define MAPPER_MSX (0x21) #define MAPPER_MSX_NEMESIS (0x22) #define MAPPER_MULTI_32K (0x40) typedef struct { uint32 crc; uint8 g_3d; uint8 fm; uint8 peripheral; uint8 mapper; uint8 system; uint8 region; } rominfo_t; typedef struct { uint8 fcr[4]; uint8 mapper; uint16 pages; } romhw_t; static const rominfo_t game_list[] = { /* program requiring Mega Drive VDP (Mode 5) */ {0x47FA618D, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_USA}, /* Charles MacDonald's Mode 5 Demo Program */ /* game requiring SEGA mapper */ {0xFF67359B, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* DataStorm (homebrew) */ /* games requiring 315-5124 VDP (Mark-III, Master System I) */ {0x32759751, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Y's (J) */ {0xE8B82066, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Y's (J) [Demo] */ /* games requiring Sega 315-5235 mapper without bank shifting */ {0x23BAC434, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA_X, SYSTEM_GG, REGION_USA}, /* Shining Force Gaiden - Final Conflict (JP) [T-Eng] */ /* games using "Korean" mappers */ {0x445525E2, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Penguin Adventure (KR) */ {0x83F0EEDE, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Street Master (KR) */ {0xA05258F5, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Won-Si-In (KR) */ {0x06965ED9, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* F-1 Spirit - The way to Formula-1 (KR) */ {0x77EFE84A, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Cyborg Z (KR) */ {0xF89AF3CC, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Knightmare II - The Maze of Galious (KR) */ {0x9195C34C, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Boy 3 (KR) */ {0xE316C06D, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX_NEMESIS, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis (KR) */ {0x0A77FA5E, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis 2 (KR) */ {0x89B79E77, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Dodgeball King (KR) */ {0x929222C4, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Jang Pung II (KR) */ {0x18FB98A3, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Jang Pung 3 (KR) */ {0x97D03541, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Sangokushi 3 (KR) */ {0x192949D5, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Janggun-ui Adeul (KR) */ {0x76C5BDFB, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Jang Pung II [SMS-GG] (KR) */ {0x9FA727A0, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 0] [SMS-GG] (US) */ {0xFB481971, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */ {0xA67F2A5C, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_16K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 4-Pak All Action (KR) */ {0x98AF0236, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 1) (KR) */ {0x6EBFE1C3, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 2) (KR) */ {0x81A36A4F, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 3) (KR) */ {0x8D2D695D, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 4) (KR) */ {0x82C09B57, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 5) (KR) */ {0x4088EEB4, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 6) (KR) */ {0xFBA94148, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 1) (KR) */ {0x8333C86E, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 2) (KR) */ {0x00E9809F, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 3) (KR) */ /* games using Codemaster mapper */ {0x29822980, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */ {0x8813514B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Excellent Dizzy Collection, The [Proto] */ {0xB9664AE1, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Fantastic Dizzy */ {0xA577CE46, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Micro Machines */ {0xEA5C3A6F, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_USA}, /* Dinobasher - Starring Bignose the Caveman [Proto] */ {0xAA140C9C, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Excellent Dizzy Collection, The [SMS-GG] */ {0xC888222B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Fantastic Dizzy [SMS-GG] */ {0x6CAA625B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Cosmic Spacehead [GG]*/ {0x152F0DCC, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone */ {0x5E53C7F7, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */ {0xD9A7F170, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */ {0xF7C524F6, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines [GG] */ {0xDBE8895C, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines 2 - Turbo Tournament */ {0xC1756BEE, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Pete Sampras Tennis */ {0x72981057, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* CJ Elephant Fugitive */ /* games using serial EEPROM */ {0x36EBCD6D, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* Majors Pro Baseball */ {0x3D8D0DD6, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v0] */ {0xBB38CFD7, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v1] */ {0x578A8A38, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball '95 */ /* games using Terebi Oekaki graphic board */ {0xDD4A661B, 0, 0, SYSTEM_GAMEPAD, MAPPER_TEREBI, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Terebi Oekaki */ /* games using 2KB external RAM (volatile) */ {0x092F29D6, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Castle (J) */ {0xAF4F14BC, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Othello (J) */ {0x1D1A0CA3, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello (TW) */ /* games requiring SG-1000 II 8K RAM extension adapter */ {0xCE5648C3, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special [DahJee] (TW) */ {0x223397A1, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* King's Valley (TW) */ {0x281D2888, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Knightmare (TW) */ {0x306D5F78, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X [DahJee] (TW) */ {0x29E047CC, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ {0x5CBD1163, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Tank Battalion (TW) */ {0x2E7166D5, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */ {0xC550B4F0, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* TwinBee (TW) */ {0xFC87463C, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */ {0x69FC1494, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */ {0xFFC4EE3F, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */ {0x2E366CCF, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Castle (TW) */ {0xAAAC12CF, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X (TW) */ {0xD2EDD329, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ /* games requiring 2K internal RAM (SG-1000 II clone hardware) */ {0x7F7F009D, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */ {0x77DB4704, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Q*Bert */ {0xC5A67B95, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */ /* games requiring Japanese region setting */ {0x71DEBA5A, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GG, REGION_JAPAN_NTSC}, /* Pop Breaker */ {0xC9DD4E5F, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop (Super Arkanoid) */ /* games requiring Japanese Master System I/O chip (315-5297) */ {0xBD1CC7DF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Tetris (KR) */ {0x6D309AC5, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Power Boggle Boggle (KR) */ /* games requiring random RAM pattern initialization */ {0x08BF3DE3, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Alibaba and 40 Thieves (KR) */ {0x643B6B76, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Block Hole (KR) */ /* games requiring PAL timings */ {0x72420F38, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Addams Familly */ {0x2D48C1D3, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Back to the Future Part III */ {0x1CBB7BF1, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Battlemaniacs (BR) */ {0x1B10A951, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Bram Stoker's Dracula */ {0xC0E25D62, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* California Games II */ {0x45C50294, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Jogos de Verao II (BR) */ {0xC9DBF936, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Home Alone */ {0x0047B615, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Predator2 */ {0xF42E145C, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Quest for the Shaven Yak Starring Ren Hoek & Stimpy (BR) */ {0x9F951756, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */ {0xF8176918, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sensible Soccer */ {0x1575581D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Shadow of the Beast */ {0x96B3F29E, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic Blast (BR) */ {0x5B3B922C, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V0] */ {0xD6F2BFCA, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V1] */ {0xCA1D3752, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Space Harrier [50 Hz] */ {0x85CFC9C9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Taito Chase H.Q. */ {0x332A847D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* NBA Jam [Proto] */ /* games running in Game Gear MS compatibility mode */ {0x59840FD6, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Castle of Illusion - Starring Mickey Mouse [SMS-GG] */ {0x9C76FB3A, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Rastan Saga [SMS-GG] */ {0xC8381DEF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Taito Chase H.Q [SMS-GG] */ {0xDA8E95A9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* WWF Wrestlemania Steel Cage Challenge [SMS-GG] */ {0x1D93246E, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [A][SMS-GG] */ {0xA2F9C7AF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [B][SMS-GG] */ {0x01EAB89D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa [SMS-GG] */ {0xF037EC00, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa (US) [SMS-GG] */ {0xE5F789B9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Predator 2 [SMS-GG] */ {0x311D2863, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [A][SMS-GG] */ {0x45F058D6, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [B][SMS-GG] */ {0x56201996, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* R.C. Grand Prix [SMS-GG] */ {0x10DBBEF4, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Super Kick Off [SMS-GG] */ {0x9942B69B, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Castle of Illusion - Starring Mickey Mouse (J) [SMS-GG] */ {0x7BB81E3D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Taito Chase H.Q (J) [SMS-GG] */ {0x6F8E46CF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Alex Kidd in Miracle World (TW) [SMS-GG] */ {0x3382D73F, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Olympic Gold (TW) [SMS-GG] */ /* games requiring 3-D Glasses */ {0x6BD5C2BF, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Space Harrier 3-D */ {0x8ECD201C, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D */ {0xFBF96C81, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D (BR) */ {0x58D5FC48, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D [Proto] */ {0x31B8040B, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Maze Hunter 3-D */ {0xABD48AD2, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Poseidon Wars 3-D */ {0xA3EF13CB, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D */ {0xBBA74147, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D [Proto] */ {0xD6F43DDA, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run 3-D */ {0x871562b0, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maze Walker */ {0x156948f9, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Space Harrier 3-D (J) */ /* games requiring 3-D Glasses & Sega Light Phaser */ {0xFBE5CFBB, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D */ {0xE79BB689, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D [BIOS] */ /* games requiring Sega Light Phaser */ {0x861B6E79, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Assault City [Light Phaser] */ {0x5FC74D2A, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Gangster Town */ {0xE167A561, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Hang-On / Safari Hunt */ {0x91E93385, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Hang-On / Safari Hunt [BIOS] */ {0xE8EA842C, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Marksman Shooting / Trap Shooting */ {0xE8215C2E, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Marksman Shooting / Trap Shooting / Safari Hunt */ {0x205CAAE8, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Operation Wolf */ {0x23283F37, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Operation Wolf [A] */ {0xDA5A7013, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rambo 3 */ {0x79AC8E7F, 0, 1, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rescue Mission */ {0x4B051022, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shooting Gallery */ {0xA908CFF5, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Spacegun */ {0x5359762D, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wanted */ {0x0CA95637, 0, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Laser Ghost */ /* games requiring Sega Paddle */ {0xF9DBB533, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alex Kidd BMX Trial */ {0xA6FA42D0, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Galactic Protector */ {0x29BC7FAD, 0, 1, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Megumi Rescue */ {0x315917D4, 0, 0, SYSTEM_PADDLE, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop */ /* games requiring Sega Sport Pad */ {0x41C948BF, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Sports Pad Soccer */ {0x0CB7E21F, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Ice Hockey */ {0xE42E4998, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Sports Pad Football */ /* games requiring Furrtek's Master Tap */ {0xFAB6F52F, 0, 0, SYSTEM_MASTERTAP, MAPPER_NONE, SYSTEM_SMS2, REGION_USA}, /* BOom (v1.0) */ {0x143AB50B, 0, 0, SYSTEM_MASTERTAP, MAPPER_NONE, SYSTEM_SMS2, REGION_USA}, /* BOom (v1.1) */ /* games requiring Sega Graphic Board */ {0x276AA542, 0, 0, SYSTEM_GRAPHIC_BOARD, MAPPER_NONE, SYSTEM_SMS, REGION_USA}, /* Sega Graphic Board v2.0 Software (Prototype) */ /* games supporting YM2413 FM */ {0x1C951F8E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* After Burner */ {0xC13896D5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alex Kidd: The Lost Stars */ {0x5CBFE997, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alien Syndrome */ {0xBBA2FE98, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */ {0xFF614EB3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */ {0x3084CF11, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */ {0xAC6009A7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */ {0xA4852757, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */ {0xB81F6FA5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */ {0x3CFF6E80, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */ {0xE7F62E6D, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */ {0x908E7524, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */ {0xA55D89F3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */ {0xB8B141F9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone II */ {0xD29889AD, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone: The Maze */ {0xA4AC35D8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force */ {0x6C827520, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force (U) */ {0x1890F407, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Game Box Srie Esportes Radicais (BR) */ {0xB746A6F5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense */ {0x91A0FC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */ {0x48651325, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */ {0x5DABFDC3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania [Proto] */ {0xA51376FE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golvellius - Valley of Doom */ {0x98E4AE4A, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Golf */ {0x516ED32E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */ {0xE8511B08, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Lord of The Sword */ {0x0E333B6E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord */ {0x301A59AA, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord [Proto] */ {0x01D67C0B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Mnica no Castelo do Drago (BR) */ {0x5589D8D2, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run */ {0xE030E66C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */ {0xF97E9875, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */ {0x4077EFD9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */ {0xBB54B6B0, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */ {0x42FC47EE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */ {0xC547EB1B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */ {0x9A8B28EC, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */ {0xAAB67EC3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */ {0x0C6FAC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */ {0x4752CAE7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */ {0x1A390B93, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */ {0xAE920E4B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */ {0x51BD14BE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Time Soldiers */ {0x22CCA9BB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Turma da Mnica em: O Resgate (BR) */ {0xB52D60C8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV */ {0xDE9F8517, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */ {0xDFB0B161, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Vigilante */ {0x679E1676, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy III: The Dragon's Trap */ {0x8CBEF0C1, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy in Monster Land */ {0x2F2E3BC9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zillion II - The Tri Formation */ {0x48D44A13, 0, 1, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* BIOS (J) */ {0xD8C4165B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Aleste */ {0x4CC11DF9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alien Syndrome (J) */ {0xE421E466, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Chouon Senshi Borgman */ {0x2BCDB8FA, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken */ {0x56BD2455, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken [Proto] */ {0xC722FB42, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Fantasy Zone II (J) */ {0x7ABC70E9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Family Games (Party Games) */ {0x6586BD1F, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf */ {0x4847BC91, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf [Proto] */ {0xB9FDF6D9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Haja no Fuuin */ {0x955A009E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hoshi wo Sagashite */ {0x05EA5353, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kenseiden (J) */ {0xD11D32E4, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kujakuou */ {0xAA7D6F45, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Lord of Sword */ {0xBF0411AD, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius */ {0x21A21352, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius [Proto] */ {0x5B5F9106, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nekyuu Kousien */ {0xBEA27D5C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Opa Opa */ {0x6605D36A, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Phantasy Star (J) */ {0xE1FFF1BB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Shinobi (J) */ {0x11645549, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Solomon no Kagi - Oujo Rihita no Namida */ {0x7E0EF8CB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Racing */ {0xB1DA6A30, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Wonder Boy Monster World */ {0x8132AB2C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Tensai Bakabon */ {0xC0CE19B1, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Thunder Blade (J) */ {0x07301F83, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_JAPAN_NTSC} /* Phantasy Star [Megadrive] (J) */ }; /* Cartridge & BIOS ROM hardware */ static romhw_t cart_rom; static romhw_t bios_rom; /* Current slot */ static struct { uint8 *rom; uint8 *fcr; uint8 mapper; uint16 pages; } slot; /* Function prototypes */ static void mapper_reset(void); static void mapper_8k_w(int offset, unsigned char data); static void mapper_16k_w(int offset, unsigned char data); static void mapper_32k_w(unsigned char data); static void write_mapper_none(unsigned int address, unsigned char data); static void write_mapper_sega(unsigned int address, unsigned char data); static void write_mapper_codies(unsigned int address, unsigned char data); static void write_mapper_korea(unsigned int address, unsigned char data); static void write_mapper_korea_8k(unsigned int address, unsigned char data); static void write_mapper_korea_16k(unsigned int address, unsigned char data); static void write_mapper_msx(unsigned int address, unsigned char data); static void write_mapper_multi_16k(unsigned int address, unsigned char data); static void write_mapper_multi_32k(unsigned int address, unsigned char data); static void write_mapper_93c46(unsigned int address, unsigned char data); static void write_mapper_terebi(unsigned int address, unsigned char data); static unsigned char read_mapper_93c46(unsigned int address); static unsigned char read_mapper_terebi(unsigned int address); static unsigned char read_mapper_korea_8k(unsigned int address); static unsigned char read_mapper_default(unsigned int address); void sms_cart_init(void) { int i = sizeof(game_list) / sizeof(rominfo_t) - 1; /* game CRC */ uint32 crc = crc32(0, cart.rom, cart.romsize); /* unmapped memory return $FF on read (mapped to unused cartridge areas $510000-$5103FF & $510400-$5107FF) */ memset(cart.rom + 0x510000, 0xFF, 0x800); /* default cartridge ROM mapper */ cart_rom.mapper = (cart.romsize > 0xC000) ? MAPPER_SEGA : MAPPER_NONE; /* disable 3-D Glasses by default */ cart.special = 0; /* YM2413 chip in AUTO mode */ if (config.ym2413 & 2) { if ((system_hw & SYSTEM_SMS) && (region_code == REGION_JAPAN_NTSC)) { /* japanese Master System has built-in FM chip */ config.ym2413 = 3; } else { /* by default, FM chip is disabled */ config.ym2413 = 2; } } /* auto-detect game settings */ do { if (crc == game_list[i].crc) { /* auto-detect cartridge mapper */ cart_rom.mapper = game_list[i].mapper; /* save current input settings */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* auto-detect required peripherals */ input.system[0] = game_list[i].peripheral; /* auto-detect 3D glasses support */ cart.special = game_list[i].g_3d; /* auto-detect system hardware */ if (!config.system || ((config.system == SYSTEM_GG) && (game_list[i].system == SYSTEM_GGMS))) { system_hw = game_list[i].system; } /* auto-detect YM2413 chip support in AUTO mode */ if (config.ym2413 & 2) { config.ym2413 |= game_list[i].fm; } /* game found, leave loop */ break; } } while (i--); /* ROM paging */ if (cart_rom.mapper < MAPPER_SEGA) { /* 1k ROM banks */ cart_rom.pages = (cart.romsize + (1 << 10) - 1) >> 10; } else if (cart_rom.mapper & MAPPER_KOREA_8K) { /* 8k ROM banks */ cart_rom.pages = (cart.romsize + (1 << 13) - 1) >> 13; } else if (cart_rom.mapper & MAPPER_MULTI_32K) { /* 32k ROM banks */ cart_rom.pages = (cart.romsize + (1 << 15) - 1) >> 15; } else { /* 16k ROM banks */ cart_rom.pages = (cart.romsize + (1 << 14) - 1) >> 14; } /* initialize extra hardware */ if (cart_rom.mapper == MAPPER_93C46) { /* 93C46 eeprom */ eeprom_93c_init(); } else if (cart_rom.mapper == MAPPER_TEREBI) { /* Terebi Oekaki tablet */ cart.special |= HW_TEREBI_OEKAKI; } /* initialize SRAM */ sram_init(); /* enable cartridge backup memory by default */ sram.on = 1; /* default gun offset for Light Phaser */ input.x_offset = 20; input.y_offset = 0; /* SpaceGun & Gangster Town use specific gun offset */ if ((crc == 0x5359762D) || (crc == 0x5FC74D2A)) { input.x_offset = 16; } /* BIOS support */ if (config.bios & 1) { /* load BIOS file */ int bios_size = load_bios(system_hw); if (bios_size > 0xC000) { /* assume SEGA mapper if BIOS ROM is larger than 48k */ bios_rom.mapper = MAPPER_SEGA; bios_rom.pages = bios_size >> 14; } else if (bios_size >= 0) { /* default BIOS ROM mapper */ bios_rom.mapper = MAPPER_NONE; bios_rom.pages = bios_size >> 10; } /* unload cartridge if required & BIOS ROM is loaded */ if (!(config.bios & 2) && bios_rom.pages) { cart_rom.pages = 0; } } else { /* mark Master System & Game Gear BIOS as unloaded */ system_bios &= ~(SYSTEM_SMS | SYSTEM_GG); /* BIOS ROM is disabled */ bios_rom.pages = 0; } } void sms_cart_reset(void) { /* reset BIOS ROM paging (SEGA mapper by default) */ bios_rom.fcr[0] = 0; bios_rom.fcr[1] = 0; bios_rom.fcr[2] = 1; bios_rom.fcr[3] = 2; /* reset cartridge ROM paging */ switch (cart_rom.mapper) { case MAPPER_SEGA: case MAPPER_SEGA_X: cart_rom.fcr[0] = 0; cart_rom.fcr[1] = 0; cart_rom.fcr[2] = 1; cart_rom.fcr[3] = 2; break; case MAPPER_KOREA_8K: case MAPPER_MSX: case MAPPER_MSX_NEMESIS: cart_rom.fcr[0] = 0; cart_rom.fcr[1] = 0; cart_rom.fcr[2] = 0; cart_rom.fcr[3] = 0; break; default: cart_rom.fcr[0] = 0; cart_rom.fcr[1] = 0; cart_rom.fcr[2] = 1; cart_rom.fcr[3] = 0; break; } /* check if BIOS is larger than 1k */ if (bios_rom.pages > 1) { /* enable BIOS ROM */ slot.rom = cart.rom + 0x400000; slot.fcr = bios_rom.fcr; slot.mapper = bios_rom.mapper; slot.pages = bios_rom.pages; } else { /* enable cartridge ROM */ slot.rom = cart.rom; slot.fcr = cart_rom.fcr; slot.mapper = cart_rom.mapper; slot.pages = cart_rom.pages; /* force Memory Control register value in RAM (usually set by Master System BIOS) */ if (system_hw & SYSTEM_SMS) { work_ram[0] = 0xA8; } } /* reset Memory Control register (RAM & I/O are enabled, either BIOS or Cartridge ROM are enabled) */ io_reg[0x0E] = bios_rom.pages ? 0xE0 : 0xA8; /* reset Z80 memory map */ mapper_reset(); /* 1k BIOS special case (Majesco GG) */ if (bios_rom.pages == 1) { /* BIOS ROM is mapped to $0000-$03FF */ z80_readmap[0] = cart.rom + 0x400000; } } void sms_cart_switch(uint8 mode) { /* by default, disable cartridge & BIOS ROM */ slot.pages = 0; /* cartridge ROM enabled ? */ if (mode & 0x40) { /* check if cartridge is loaded */ if (cart_rom.pages) { /* map cartridge ROM */ slot.rom = cart.rom; slot.fcr = cart_rom.fcr; slot.mapper = cart_rom.mapper; slot.pages = cart_rom.pages; } } else { /* BIOS ROM enabled ? */ if (mode & 0x08) { /* check if BIOS ROM is larger than 1K */ if (bios_rom.pages > 1) { /* map BIOS ROM */ slot.rom = cart.rom + 0x400000; slot.fcr = bios_rom.fcr; slot.mapper = bios_rom.mapper; slot.pages = bios_rom.pages; } else { /* by default, map cartridge ROM */ slot.rom = cart.rom; slot.fcr = cart_rom.fcr; slot.mapper = cart_rom.mapper; slot.pages = cart_rom.pages; } } /* assume only BIOS would disable cartridge slot */ if (!bios_rom.pages) { /* max. BIOS ROM size supported is 1MB */ if (cart.romsize <= 0x100000) { /* copy to BIOS ROM */ memcpy(cart.rom + 0x400000, cart.rom, cart.romsize); memcpy(bios_rom.fcr, cart_rom.fcr, 4); bios_rom.mapper = cart_rom.mapper; bios_rom.pages = cart_rom.pages; /* unload cartridge */ cart_rom.pages = 0; } } } /* reset Z80 memory map */ mapper_reset(); /* 1k BIOS special case (Majesco GG) */ if ((bios_rom.pages == 1) && ((mode & 0x48) == 0x08)) { /* BIOS ROM is mapped to $0000-$03FF */ z80_readmap[0] = cart.rom + 0x400000; } } int sms_cart_region_detect(void) { int i = sizeof(game_list) / sizeof(rominfo_t) - 1; /* compute CRC */ uint32 crc = crc32(0, cart.rom, cart.romsize); /* Turma da Mnica em: O Resgate & Wonder Boy III enable FM support on japanese hardware only */ if (config.ym2413 && ((crc == 0x22CCA9BB) || (crc == 0x679E1676))) { return REGION_JAPAN_NTSC; } /* game database */ do { if (crc == game_list[i].crc) { return game_list[i].region; } } while(i--); /* Mark-III hardware */ if (system_hw == SYSTEM_MARKIII) { /* Japan */ return REGION_JAPAN_NTSC; } /* default region */ return REGION_USA; } int sms_cart_context_save(uint8 *state) { int bufferptr = 0; save_param(slot.fcr, 4); return bufferptr; } int sms_cart_context_load(uint8 *state) { int bufferptr = 0; load_param(slot.fcr, 4); return bufferptr; } static void mapper_reset(void) { int i; /* reset $C000-$FFFF mapping */ if (cart_rom.mapper == MAPPER_RAM_8K_EXT2) { /* 8k RAM extension adapter (type B) */ for (i = 0x30; i < 0x40; i++) { /* $C000-$FFFF mapped to 8k external RAM (mirrored) */ z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10]; } } else if (system_hw == SYSTEM_SGII) { /* SG-1000 II clone hardware with 2KB internal RAM */ for (i = 0x30; i < 0x40; i++) { /* $C000-$FFFF mapped to 2k internal RAM (mirrored) */ z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x01) << 10]; } } else if (system_hw == SYSTEM_SG) { /* default SG-1000 hardware has only 1KB internal RAM */ for (i = 0x30; i < 0x40; i++) { /* $C000-$FFFF mapped to 1k internal RAM (mirrored) */ z80_readmap[i] = z80_writemap[i] = &work_ram[0]; } } else { /* Mark III / Master System / Game Gear hardware */ for (i = 0x30; i < 0x40; i++) { /* $C000-$FFFF mapped to 8k internal RAM (mirrored) */ z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10]; } } /* check if ROM is disabled */ if (!slot.pages) { /* $0000-$BFFF mapped to unused cartridge areas */ for(i = 0x00; i < 0x30; i++) { z80_writemap[i] = cart.rom + 0x510000; z80_readmap[i] = cart.rom + 0x510400; } /* set default Z80 memory handlers */ z80_readmem = read_mapper_default; z80_writemem = write_mapper_none; return; } /* reset $0000-$BFFF mapping */ for (i = 0x00; i < 0x30; i++) { /* by default, $0000-$BFFF is mapped to cartridge ROM (first 48k) */ z80_readmap[i] = &slot.rom[i << 10]; z80_writemap[i] = cart.rom + 0x510000; /* unused area */ } /* reset cartridge hardware mapping */ if (slot.mapper == MAPPER_RAM_8K_EXT1) { /* 8k RAM extension adapter (type A) */ for (i = 0x08; i < 0x10; i++) { /* $2000-$3FFF mapped to 8k external RAM */ z80_readmap[i] = z80_writemap[i] = &work_ram[0x2000 + ((i & 0x07) << 10)]; } } else if (slot.mapper == MAPPER_RAM_2K) { /* 2k on-board RAM (The Castle, Othello) */ for (i = 0x20; i < 0x30; i++) { /* $8000-$BFFF mapped to 2k external RAM (mirrored) */ z80_readmap[i] = z80_writemap[i] = &work_ram[0x2000 + ((i & 0x07) << 10)]; } } else if (slot.mapper >= MAPPER_SEGA) { /* reset ROM paging hardware */ if (slot.mapper & MAPPER_KOREA_8K) { /* 8k pages */ mapper_8k_w(0,slot.fcr[0]); mapper_8k_w(1,slot.fcr[1]); mapper_8k_w(2,slot.fcr[2]); mapper_8k_w(3,slot.fcr[3]); /* "Nemesis" mapper specific */ if (slot.mapper == MAPPER_MSX_NEMESIS) { /* first 8k page is mapped to last 8k ROM bank */ for (i = 0x00; i < 0x08; i++) { z80_readmap[i] = &slot.rom[(0x0f << 13) | ((i & 0x07) << 10)]; } } } else if (slot.mapper & MAPPER_MULTI_32K) { /* 32k pages */ mapper_32k_w(slot.fcr[0]); } else { /* 16k pages */ mapper_16k_w(0,slot.fcr[0]); mapper_16k_w(1,slot.fcr[1]); mapper_16k_w(2,slot.fcr[2]); mapper_16k_w(3,slot.fcr[3]); } } /* reset Z80 memory handlers */ switch (slot.mapper) { case MAPPER_NONE: case MAPPER_RAM_2K: case MAPPER_RAM_8K_EXT1: case MAPPER_RAM_8K_EXT2: z80_readmem = read_mapper_default; z80_writemem = write_mapper_none; break; case MAPPER_CODIES: z80_readmem = read_mapper_default; z80_writemem = write_mapper_codies; break; case MAPPER_KOREA: z80_readmem = read_mapper_default; z80_writemem = write_mapper_korea; break; case MAPPER_KOREA_8K: z80_readmem = read_mapper_korea_8k; z80_writemem = write_mapper_korea_8k; break; case MAPPER_KOREA_16K: z80_readmem = read_mapper_default; z80_writemem = write_mapper_korea_16k; break; case MAPPER_MSX: case MAPPER_MSX_NEMESIS: z80_readmem = read_mapper_default; z80_writemem = write_mapper_msx; break; case MAPPER_MULTI_16K: z80_readmem = read_mapper_default; z80_writemem = write_mapper_multi_16k; break; case MAPPER_MULTI_32K: z80_readmem = read_mapper_default; z80_writemem = write_mapper_multi_32k; break; case MAPPER_93C46: z80_readmem = read_mapper_93c46; z80_writemem = write_mapper_93c46; break; case MAPPER_TEREBI: z80_readmem = read_mapper_terebi; z80_writemem = write_mapper_terebi; break; default: z80_readmem = read_mapper_default; z80_writemem = write_mapper_sega; break; } } static void mapper_8k_w(int offset, unsigned char data) { int i; /* cartridge ROM page (8k) */ uint8 *page = &slot.rom[(data % slot.pages) << 13]; /* Save frame control register data */ slot.fcr[offset] = data; /* 4 x 8k banks */ switch (offset & 3) { case 0: /* cartridge ROM bank (8k) at $8000-$9FFF */ { for (i = 0x20; i < 0x28; i++) { z80_readmap[i] = &page[(i & 0x07) << 10]; } break; } case 1: /* cartridge ROM bank (8k) at $A000-$BFFF */ { for (i = 0x28; i < 0x30; i++) { z80_readmap[i] = &page[(i & 0x07) << 10]; } break; } case 2: /* cartridge ROM bank (8k) at $4000-$5FFF */ { for (i = 0x10; i < 0x18; i++) { z80_readmap[i] = &page[(i & 0x07) << 10]; } break; } case 3: /* cartridge ROM bank (8k) at $6000-$7FFF */ { for (i = 0x18; i < 0x20; i++) { z80_readmap[i] = &page[(i & 0x07) << 10]; } break; } } #ifdef CHEATS_UPDATE /* update ROM patches when banking has changed */ CHEATS_UPDATE(); #endif } static void mapper_16k_w(int offset, unsigned char data) { int i; /* cartridge ROM page (16k) */ uint8 page = data % slot.pages; /* page index increment (SEGA mapper only) */ if ((slot.fcr[0] & 0x03) && (slot.mapper == MAPPER_SEGA)) { page = (page + ((4 - (slot.fcr[0] & 0x03)) << 3)) % slot.pages; } /* save frame control register data */ slot.fcr[offset] = data; switch (offset) { case 0: /* control register (SEGA mapper only) */ { if (data & 0x08) { /* external RAM (upper or lower 16K) mapped at $8000-$BFFF */ for (i = 0x20; i < 0x30; i++) { z80_readmap[i] = z80_writemap[i] = &sram.sram[((data & 0x04) << 12) + ((i & 0x0F) << 10)]; } } else { /* cartridge ROM page (16k) */ page = slot.fcr[3] % slot.pages; /* page index increment (SEGA mapper) */ if ((data & 0x03) && (slot.mapper == MAPPER_SEGA)) { page = (page + ((4 - (data & 0x03)) << 3)) % slot.pages; } /* cartridge ROM mapped at $8000-$BFFF */ for (i = 0x20; i < 0x30; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; z80_writemap[i] = cart.rom + 0x510000; /* unused area */ } } if (data & 0x10) { /* external RAM (lower 16K) mapped at $C000-$FFFF */ for (i = 0x30; i < 0x40; i++) { z80_readmap[i] = z80_writemap[i] = &sram.sram[(i & 0x0F) << 10]; } } else { /* internal RAM (8K mirrorred) mapped at $C000-$FFFF */ for (i = 0x30; i < 0x40; i++) { z80_readmap[i] = z80_writemap[i] = &work_ram[(i & 0x07) << 10]; } } break; } case 1: /* cartridge ROM bank (16k) at $0000-$3FFF */ { /* first 1k is not fixed (CODEMASTER or MULTI mappers only) */ if ((slot.mapper == MAPPER_CODIES) || (slot.mapper == MAPPER_MULTI_16K)) { z80_readmap[0] = &slot.rom[(page << 14)]; } for (i = 0x01; i < 0x10; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; } break; } case 2: /* cartridge ROM bank (16k) at $4000-$7FFF */ { for (i = 0x10; i < 0x20; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; } /* cartridge RAM switch (CODEMASTER mapper only, see Ernie Elf's Golf) */ if (slot.mapper == MAPPER_CODIES) { if (data & 0x80) { /* external RAM (8k) mapped at $A000-$BFFF */ for (i = 0x28; i < 0x30; i++) { z80_readmap[i] = z80_writemap[i] = &sram.sram[(i & 0x0F) << 10]; } } else { /* cartridge ROM page (16k) */ page = slot.fcr[3] % slot.pages; /* cartridge ROM mapped at $A000-$BFFF */ for (i = 0x28; i < 0x30; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; z80_writemap[i] = cart.rom + 0x510000; /* unused area */ } } } break; } case 3: /* cartridge ROM bank (16k) at $8000-$BFFF */ { /* check that external RAM (16k) is not mapped at $8000-$BFFF (SEGA mapper only) */ if ((slot.fcr[0] & 0x08)) break; /* first 8k */ for (i = 0x20; i < 0x28; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; } /* check that cartridge RAM (8k) is not mapped at $A000-$BFFF (CODEMASTER mapper only) */ if ((slot.mapper == MAPPER_CODIES) && (slot.fcr[2] & 0x80)) break; /* last 8k */ for (i = 0x28; i < 0x30; i++) { z80_readmap[i] = &slot.rom[(page << 14) | ((i & 0x0F) << 10)]; } break; } } #ifdef CHEATS_UPDATE /* update ROM patches when banking has changed */ CHEATS_UPDATE(); #endif } static void mapper_32k_w(unsigned char data) { int i; /* cartridge ROM page (32k) */ uint8 *page = &slot.rom[(data % slot.pages) << 15]; /* Save frame control register data */ slot.fcr[0] = data; /* selected page (32k) is mapped at $0000-$7FFF */ for (i = 0x00; i < 0x20; i++) { z80_readmap[i] = &page[i << 10]; } /* first 16K is mirrored at $8000-$BFFF */ for (i = 0x20; i < 0x30; i++) { z80_readmap[i] = z80_readmap[i & 0x0F]; } #ifdef CHEATS_UPDATE /* update ROM patches when banking has changed */ CHEATS_UPDATE(); #endif } static void write_mapper_none(unsigned int address, unsigned char data) { z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_sega(unsigned int address, unsigned char data) { if (address >= 0xFFFC) { mapper_16k_w(address & 3, data); } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_codies(unsigned int address, unsigned char data) { if (address == 0x0000) { mapper_16k_w(1,data); return; } if (address == 0x4000) { mapper_16k_w(2,data); return; } if (address == 0x8000) { mapper_16k_w(3,data); return; } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_multi_16k(unsigned int address, unsigned char data) { if (address == 0x3FFE) { mapper_16k_w(1,data); return; } if (address == 0x7FFF) { mapper_16k_w(2,data); return; } if (address == 0xBFFF) { mapper_16k_w(3,(slot.fcr[1] & 0x30) + data); return; } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_multi_32k(unsigned int address, unsigned char data) { if (address == 0xFFFF) { mapper_32k_w(data); } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_korea(unsigned int address, unsigned char data) { if (address == 0xA000) { mapper_16k_w(3,data); return; } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_msx(unsigned int address, unsigned char data) { if (address <= 0x0003) { mapper_8k_w(address,data); return; } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_korea_8k(unsigned int address, unsigned char data) { if (address == 0x4000) { mapper_8k_w(2,data); return; } if (address == 0x6000) { mapper_8k_w(3,data); return; } if (address == 0x8000) { mapper_8k_w(0,data); return; } if (address == 0xA000) { mapper_8k_w(1,data); return; } if (address == 0xFFFE) { mapper_8k_w(2,(data << 1) & 0xFF); mapper_8k_w(3,(1 + (data << 1)) & 0xFF); } else if (address == 0xFFFF) { mapper_8k_w(0,(data << 1) & 0xFF); mapper_8k_w(1,(1 + (data << 1)) & 0xFF); } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_korea_16k(unsigned int address, unsigned char data) { if (address == 0x4000) { mapper_16k_w(2,data); return; } if (address == 0x8000) { mapper_16k_w(3,data); return; } /* SEGA mapper compatibility */ if (address >= 0xFFFC) { mapper_16k_w(address & 3, data); } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_93c46(unsigned int address, unsigned char data) { /* EEPROM serial input */ if ((address == 0x8000) && eeprom_93c.enabled) { eeprom_93c_write(data); return; } /* EEPROM ctrl */ if (address == 0xFFFC) { /* enable/disable EEPROM */ eeprom_93c.enabled = data & 0x08; if (data & 0x80) { /* reset EEPROM */ eeprom_93c_init(); } } /* SEGA mapper compatibility */ if (address > 0xFFFC) { mapper_16k_w(address & 3, data); } z80_writemap[address >> 10][address & 0x03FF] = data; } static void write_mapper_terebi(unsigned int address, unsigned char data) { if (address == 0x6000) { terebi_oekaki_write(data); return; } z80_writemap[address >> 10][address & 0x03FF] = data; } static unsigned char read_mapper_93c46(unsigned int address) { if ((address == 0x8000) && eeprom_93c.enabled) { return eeprom_93c_read(); } return z80_readmap[address >> 10][address & 0x03FF]; } static unsigned char read_mapper_terebi(unsigned int address) { if (address == 0x8000) { return (terebi_oekaki_read() >> 8); } if (address == 0xA000) { return (terebi_oekaki_read() & 0xFF); } return z80_readmap[address >> 10][address & 0x03FF]; } static unsigned char read_mapper_korea_8k(unsigned int address) { unsigned char data = z80_readmap[address >> 10][address & 0x03FF]; /* 16k page */ unsigned char page = address >> 14; /* $4000-$7FFFF and $8000-$BFFF area are protected */ if (((page == 1) && (slot.fcr[2] & 0x80)) || ((page == 2) && (slot.fcr[0] & 0x80))) { /* bit-swapped value */ data = (((data >> 7) & 0x01) | ((data >> 5) & 0x02) | ((data >> 3) & 0x04) | ((data >> 1) & 0x08) | ((data << 1) & 0x10) | ((data << 3) & 0x20) | ((data << 5) & 0x40) | ((data << 7) & 0x80)); } return data; } static unsigned char read_mapper_default(unsigned int address) { return z80_readmap[address >> 10][address & 0x03FF]; } sdl/osd.h000664 001750 001750 00000001430 12702465756 013436 0ustar00sergiosergio000000 000000 #ifndef _OSD_H_ #define _OSD_H_ #include #include #include #include #include #include #include "shared.h" #include "main.h" #include "config.h" #include "error.h" #include "unzip.h" #include "fileio.h" #define osd_input_update sdl_input_update #define GG_ROM "./ggenie.bin" #define AR_ROM "./areplay.bin" #define SK_ROM "./sk.bin" #define SK_UPMEM "./sk2chip.bin" #define CD_BIOS_US "./bios_CD_U.bin" #define CD_BIOS_EU "./bios_CD_E.bin" #define CD_BIOS_JP "./bios_CD_J.bin" #define MD_BIOS "./bios_MD.bin" #define MS_BIOS_US "./bios_U.sms" #define MS_BIOS_EU "./bios_E.sms" #define MS_BIOS_JP "./bios_J.sms" #define GG_BIOS "./bios.gg" #endif /* _OSD_H_ */ gx/fileio/file_load.h000664 001750 001750 00000005125 12702465756 015677 0ustar00sergiosergio000000 000000 /* * file_load.c * * File loading support * * Copyright Eke-Eke (2008-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILE_FAT_H #define _FILE_FAT_H /* suppported load devices */ typedef enum { TYPE_SD = 0, #ifdef HW_RVL TYPE_USB, #endif TYPE_DVD, TYPE_RECENT }DEVTYPES; /* supported file types */ typedef enum { FILETYPE_MD = 0, FILETYPE_CD, FILETYPE_MS, FILETYPE_GG, FILETYPE_SG, FILETYPE_MAX }FILETYPES; extern char *GetCurrentDirectory(void); extern int OpenDirectory(int device, int type); extern int UpdateDirectory(bool go_up, char *filename); extern int ParseDirectory(void); extern int LoadFile(int selection); extern char rom_filename[256]; #endif core/state.c000664 001750 001750 00000022517 12702465756 014143 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Savestate support * * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" int state_load(unsigned char *state) { int i, bufferptr = 0; /* signature check (GENPLUS-GX x.x.x) */ char version[17]; load_param(version,16); version[16] = 0; if (memcmp(version,STATE_VERSION,11)) { return 0; } /* version check */ if ((version[11] < 0x31) || (version[13] < 0x37) || (version[15] < 0x35)) { return 0; } /* reset system */ system_reset(); /* enable VDP access for TMSS systems */ for (i=0xc0; i<0xe0; i+=8) { m68k.memory_map[i].read8 = vdp_read_byte; m68k.memory_map[i].read16 = vdp_read_word; m68k.memory_map[i].write8 = vdp_write_byte; m68k.memory_map[i].write16 = vdp_write_word; zbank_memory_map[i].read = zbank_read_vdp; zbank_memory_map[i].write = zbank_write_vdp; } /* GENESIS */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { load_param(work_ram, sizeof(work_ram)); load_param(zram, sizeof(zram)); load_param(&zstate, sizeof(zstate)); load_param(&zbank, sizeof(zbank)); if (zstate == 3) { m68k.memory_map[0xa0].read8 = z80_read_byte; m68k.memory_map[0xa0].read16 = z80_read_word; m68k.memory_map[0xa0].write8 = z80_write_byte; m68k.memory_map[0xa0].write16 = z80_write_word; } else { m68k.memory_map[0xa0].read8 = m68k_read_bus_8; m68k.memory_map[0xa0].read16 = m68k_read_bus_16; m68k.memory_map[0xa0].write8 = m68k_unused_8_w; m68k.memory_map[0xa0].write16 = m68k_unused_16_w; } } else { load_param(work_ram, 0x2000); } /* IO */ load_param(io_reg, sizeof(io_reg)); if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { io_reg[0] = region_code | 0x20 | (config.bios & 1); } else { io_reg[0] = 0x80 | (region_code >> 1); } /* VDP */ bufferptr += vdp_context_load(&state[bufferptr]); /* SOUND */ bufferptr += sound_context_load(&state[bufferptr]); if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); } else { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]); } /* 68000 */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { uint16 tmp16; uint32 tmp32; load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D0, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D1, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D2, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D3, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D4, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D5, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D6, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_D7, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A0, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A1, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A2, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A3, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A4, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A5, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A6, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_A7, tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_PC, tmp32); load_param(&tmp16, 2); m68k_set_reg(M68K_REG_SR, tmp16); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_USP,tmp32); load_param(&tmp32, 4); m68k_set_reg(M68K_REG_ISP,tmp32); load_param(&m68k.cycles, sizeof(m68k.cycles)); load_param(&m68k.int_level, sizeof(m68k.int_level)); load_param(&m68k.stopped, sizeof(m68k.stopped)); } /* Z80 */ load_param(&Z80, sizeof(Z80_Regs)); Z80.irq_callback = z80_irq_callback; /* Extra HW */ if (system_hw == SYSTEM_MCD) { /* handle case of MD cartridge using or not CD hardware */ char id[5]; load_param(id,4); id[4] = 0; /* check if CD hardware was enabled before attempting to restore */ if (memcmp(id,"SCD!",4)) { return 0; } /* CD hardware */ bufferptr += scd_context_load(&state[bufferptr]); } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* MD cartridge hardware */ bufferptr += md_cart_context_load(&state[bufferptr]); } else { /* MS cartridge hardware */ bufferptr += sms_cart_context_load(&state[bufferptr]); sms_cart_switch(~io_reg[0x0E]); } return bufferptr; } int state_save(unsigned char *state) { /* buffer size */ int bufferptr = 0; /* version string */ char version[16]; strncpy(version,STATE_VERSION,16); save_param(version, 16); /* GENESIS */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { save_param(work_ram, sizeof(work_ram)); save_param(zram, sizeof(zram)); save_param(&zstate, sizeof(zstate)); save_param(&zbank, sizeof(zbank)); } else { save_param(work_ram, 0x2000); } /* IO */ save_param(io_reg, sizeof(io_reg)); /* VDP */ bufferptr += vdp_context_save(&state[bufferptr]); /* SOUND */ bufferptr += sound_context_save(&state[bufferptr]); /* 68000 */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { uint16 tmp16; uint32 tmp32; tmp32 = m68k_get_reg(M68K_REG_D0); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D1); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D2); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D3); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D4); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D5); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D6); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_D7); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A0); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A1); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A2); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A3); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A4); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A5); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A6); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_A7); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_PC); save_param(&tmp32, 4); tmp16 = m68k_get_reg(M68K_REG_SR); save_param(&tmp16, 2); tmp32 = m68k_get_reg(M68K_REG_USP); save_param(&tmp32, 4); tmp32 = m68k_get_reg(M68K_REG_ISP); save_param(&tmp32, 4); save_param(&m68k.cycles, sizeof(m68k.cycles)); save_param(&m68k.int_level, sizeof(m68k.int_level)); save_param(&m68k.stopped, sizeof(m68k.stopped)); } /* Z80 */ save_param(&Z80, sizeof(Z80_Regs)); /* External HW */ if (system_hw == SYSTEM_MCD) { /* CD hardware ID flag */ char id[5]; strncpy(id,"SCD!",4); save_param(id, 4); /* CD hardware */ bufferptr += scd_context_save(&state[bufferptr]); } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* MD cartridge hardware */ bufferptr += md_cart_context_save(&state[bufferptr]); } else { /* MS cartridge hardware */ bufferptr += sms_cart_context_save(&state[bufferptr]); } /* return total size */ return bufferptr; } core/cart_hw/svp/svp.h000664 001750 001750 00000001517 12702465756 016074 0ustar00sergiosergio000000 000000 /* basic, incomplete SSP160x (SSP1601?) interpreter with SVP memory controller emu (c) Copyright 2008, Grazvydas "notaz" Ignotas Free for non-commercial use. For commercial use, separate licencing terms must be obtained. Modified for Genesis Plus GX (Eke-Eke): added BIG ENDIAN support, fixed addr/code inversion */ #ifndef _SVP_H_ #define _SVP_H_ #include "shared.h" #include "ssp16.h" typedef struct { unsigned char iram_rom[0x20000]; /* IRAM (0-0x7ff) and program ROM (0x800-0x1ffff) */ unsigned char dram[0x20000]; ssp1601_t ssp1601; } svp_t; extern svp_t *svp; extern void svp_init(void); extern void svp_reset(void); extern void svp_write_dram(uint32 address, uint32 data); extern uint32 svp_read_cell_1(uint32 address); extern uint32 svp_read_cell_2(uint32 address); #endif gx/fileio/file_load.c000664 001750 001750 00000035756 12702465756 015707 0ustar00sergiosergio000000 000000 /* * file_load.c * * File loading support * * Copyright Eke-Eke (2008-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "file_load.h" #include "gui.h" #include "history.h" #include "filesel.h" #include "file_slot.h" #include #ifdef HW_RVL #include #else #include #endif char rom_filename[256]; /* device root directories */ #ifdef HW_RVL static const char rootdir[TYPE_RECENT][10] = {"sd:/","usb:/","dvd:/"}; #else static const char rootdir[TYPE_RECENT][10] = {"/","dvd:/"}; #endif /* DVD interface */ #ifdef HW_RVL static DISC_INTERFACE* dvd = (DISC_INTERFACE*) &__io_wiidvd; #else static DISC_INTERFACE* dvd = (DISC_INTERFACE*) &__io_gcdvd; #endif /* current directory */ static char *fileDir; /* current device */ static int deviceType = -1; /* current file type */ static int fileType = -1; /* DVD interface status flags */ static u8 dvdInited = 0; static u8 dvdMounted = 0; #ifndef HW_RVL static u8 dvdBuffer[2048] ATTRIBUTE_ALIGN(32); static bool dvdStartup() { DVD_Mount(); return true; } static bool dvdIsInserted() { return true; } static bool dvdReadSectors(u32 offset,u32 len,void *buffer) { vu32* const dvd = (u32*)0xCC006000; offset = offset << 9; len = len << 11; /* DVD transfer must be done into a 32-byte aligned buffer */ while (len >= 2048) { DCInvalidateRange((void *)dvdBuffer, 2048); dvd[0] = 0x2E; dvd[1] = 0; dvd[2] = 0xA8000000; dvd[3] = offset; dvd[4] = 2048; dvd[5] = (u32) dvdBuffer; dvd[6] = 2048; dvd[7] = 3; while (dvd[7] & 1); if (dvd[0] & 4) return false; memcpy (buffer, dvdBuffer, 2048); len -= 2048; buffer += 2048; offset += 512; } /* Process remaining bytes (normally not needed since libiso9960 already deals with this but you never know) */ if (len) { /* DVD transfer length should be aligned to 32 bytes */ u32 dmasize = (len + 0x1f) & ~0x1f; DCInvalidateRange((void *)dvdBuffer, dmasize); dvd[0] = 0x2E; dvd[1] = 0; dvd[2] = 0xA8000000; dvd[3] = offset; dvd[4] = dmasize; dvd[5] = (u32) dvdBuffer; dvd[6] = dmasize; dvd[7] = 3; while (dvd[7] & 1); if (dvd[0] & 4) return false; memcpy (buffer, dvdBuffer, len); } return true; } #endif /*************************************************************************** * MountDVD * * return 0 on error, 1 on success ***************************************************************************/ static int MountDVD(void) { GUI_MsgBoxOpen("Information", "Mounting DVD ...",1); /* initialize DVD interface if needed */ if (!dvdInited) { #ifdef HW_RVL DI_Init(); #else DVD_Init(); /* patch libogc DVD interface which appears to be broken on Gamecube */ dvd->startup = (FN_MEDIUM_STARTUP)dvdStartup; dvd->isInserted = (FN_MEDIUM_ISINSERTED)dvdIsInserted; dvd->readSectors = (FN_MEDIUM_READSECTORS)dvdReadSectors; #endif dvdInited = 1; } /* check if DVD is already mounted */ if (dvdMounted) { /* unmount DVD */ ISO9660_Unmount("dvd:"); dvdMounted = 0; } /* check if disc is found */ if(!dvd->isInserted()) { GUI_WaitPrompt("Error","No Disc inserted !"); return 0; } /* mount DVD */ if(!ISO9660_Mount("dvd",dvd)) { GUI_WaitPrompt("Error","Disc can not be read !"); return 0; } /* DVD is mounted */ dvdMounted = 1; GUI_MsgBoxClose(); return 1; } /*************************************************************************** * FileSortCallback (thanks to Marty Disibio) * * Quick sort callback to sort file entries with the following order: * . * .. * * ***************************************************************************/ static int FileSortCallback(const void *f1, const void *f2) { /* Special case for implicit directories */ if(((FILEENTRIES *)f1)->filename[0] == '.' || ((FILEENTRIES *)f2)->filename[0] == '.') { if(strcmp(((FILEENTRIES *)f1)->filename, ".") == 0) { return -1; } if(strcmp(((FILEENTRIES *)f2)->filename, ".") == 0) { return 1; } if(strcmp(((FILEENTRIES *)f1)->filename, "..") == 0) { return -1; } if(strcmp(((FILEENTRIES *)f2)->filename, "..") == 0) { return 1; } } /* If one is a file and one is a directory the directory is first. */ if(((FILEENTRIES *)f1)->flags && !((FILEENTRIES *)f2)->flags) return -1; if(!((FILEENTRIES *)f1)->flags && ((FILEENTRIES *)f2)->flags) return 1; return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename); } /*************************************************************************** * UpdateDirectory * * Update current browser directory * return zero if going up while in root * when going up, return previous dir name ***************************************************************************/ int UpdateDirectory(bool go_up, char *dirname) { /* go up to parent directory */ if (go_up) { int size=0; char temp[MAXPATHLEN]; /* determine last folder name length */ strcpy(temp, fileDir); char *test= strtok(temp,"/"); while (test != NULL) { size = strlen(test); if (dirname) { strncpy(dirname,test,size); dirname[size] = 0; } test = strtok(NULL,"/"); } /* check if we already are at root directory */ size = strlen(fileDir) - size - 1; if (!size) return 0; /* remove last folder from path */ fileDir[size] = 0; } else { /* by default, simply append folder name */ sprintf(fileDir, "%s%s/",fileDir, dirname); } return 1; } /*************************************************************************** * ParseDirectory * * List files into one directory ***************************************************************************/ int ParseDirectory(void) { int nbfiles = 0; /* open directory */ DIR *dir = opendir(fileDir); if (dir == NULL) { return -1; } struct dirent *entry = readdir(dir); /* list entries */ while ((entry != NULL)&& (nbfiles < MAXFILES)) { /* filter entries */ if ((entry->d_name[0] != '.') && strncasecmp(".wav", &entry->d_name[strlen(entry->d_name) - 4], 4) && strncasecmp(".ogg", &entry->d_name[strlen(entry->d_name) - 4], 4) && strncasecmp(".mp3", &entry->d_name[strlen(entry->d_name) - 4], 4)) { memset(&filelist[nbfiles], 0, sizeof (FILEENTRIES)); sprintf(filelist[nbfiles].filename,"%s",entry->d_name); if (entry->d_type == DT_DIR) { filelist[nbfiles].flags = 1; } nbfiles++; } /* next entry */ entry = readdir(dir); } /* close directory */ closedir(dir); /* Sort the file list */ qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback); return nbfiles; } /**************************************************************************** * LoadFile * * This function will load a game file into the ROM buffer. * This functions return the actual size of data copied into the buffer * ****************************************************************************/ int LoadFile(int selection) { int size, cd_mode1, filetype; char filename[MAXPATHLEN]; /* file path */ char *filepath = (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir; /* full filename */ sprintf(filename, "%s%s", filepath, filelist[selection].filename); /* DVD hot swap */ if (!strncmp(filepath, rootdir[TYPE_DVD], strlen(rootdir[TYPE_DVD]))) { /* Check if file is still accessible */ struct stat filestat; if(stat(filename, &filestat) != 0) { /* If not, try to mount DVD */ if (!MountDVD()) return 0; } } /* open message box */ GUI_MsgBoxOpen("Information", "Loading game...", 1); /* no cartridge or CD game loaded */ size = cd_mode1 = 0; /* check if virtual CD tray was open */ if ((system_hw == SYSTEM_MCD) && (cdd.status == CD_OPEN)) { /* swap CD image file in (without changing region, system,...) */ size = cdd_load(filename, (char *)(cdc.ram)); /* check if a cartridge is currently loaded */ if (scd.cartridge.boot) { /* CD Mode 1 */ cd_mode1 = size; } else { /* update game informations from CD image file header */ getrominfo((char *)(cdc.ram)); } } /* no CD image file loaded */ if (!size) { /* close CD tray to force system reset */ cdd.status = NO_DISC; /* load game file */ size = load_rom(filename); } if (size > 0) { /* do not update game basename if a CD was loaded with a cartridge (Mode 1) */ if (cd_mode1) { /* add CD image file to history list */ filetype = 1; } else { /* auto-save previous game state */ slot_autosave(config.s_default,config.s_device); /* update game basename (for screenshot, save & cheat files) */ if (romtype & SYSTEM_SMS) { /* Master System ROM file */ filetype = 2; sprintf(rom_filename,"ms/%s",filelist[selection].filename); } else if (romtype & SYSTEM_GG) { /* Game Gear ROM file */ filetype = 3; sprintf(rom_filename,"gg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_SG) { /* SG-1000 ROM file */ filetype = 4; sprintf(rom_filename,"sg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_MCD) { /* CD image file */ filetype = 1; sprintf(rom_filename,"cd/%s",filelist[selection].filename); } else { /* by default, Genesis ROM file */ filetype = 0; sprintf(rom_filename,"md/%s",filelist[selection].filename); } /* remove file extension */ int i = strlen(rom_filename) - 1; while ((i > 0) && (rom_filename[i] != '.')) i--; if (i > 0) rom_filename[i] = 0; } /* add/move the file to the top of the history. */ history_add_file(filepath, filelist[selection].filename, filetype); /* recent file list may have changed */ if (deviceType == TYPE_RECENT) deviceType = -1; /* close message box */ GUI_MsgBoxClose(); /* valid image has been loaded */ return 1; } GUI_WaitPrompt("Error", "Unable to load game"); return 0; } /**************************************************************************** * OpenDir * * Function to open a directory and load ROM file list. ****************************************************************************/ int OpenDirectory(int device, int type) { int max = 0; if (device == TYPE_RECENT) { /* fetch history list */ int i; for(i=0; i < NUM_HISTORY_ENTRIES; i++) { if(history.entries[i].filepath[0] > 0) { filelist[i].flags = 0; strncpy(filelist[i].filename,history.entries[i].filename, MAXJOLIET-1); filelist[i].filename[MAXJOLIET-1] = '\0'; max++; } else { /* Found the end of the list. */ break; } } } else { /* only DVD hot swap is supported */ if (device == TYPE_DVD) { /* try to access root directory */ DIR *dir = opendir(rootdir[TYPE_DVD]); if (dir == NULL) { /* mount DVD */ if (!MountDVD()) return 0; deviceType = -1; } else { closedir(dir); } } /* System ROM selection */ if (type >= FILETYPE_MAX) { /* allocate temporary directory */ fileDir = malloc(MAXPATHLEN); if (!fileDir) { GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } /* extract System ROM directory */ strcpy(fileDir, config.sys_rom[type-FILETYPE_MAX]); int i = strlen(fileDir) - 1; while (fileDir[i] != '/') i--; fileDir[i+1] = 0; } else { /* parse last ROM type directory on selected device */ fileDir = config.lastdir[type][device]; } max = ParseDirectory(); if (max <= 0) { /* parse root directory */ strcpy(fileDir, rootdir[device]); max = ParseDirectory(); if (max < 0) { GUI_WaitPrompt("Error","Unable to open directory !"); return 0; } deviceType = -1; } } if (max == 0) { GUI_WaitPrompt("Error","No files found !"); return 0; } /* check if device or file type has changed */ if ((device != deviceType) || (type != fileType)) { /* reset device type */ deviceType = device; /* make sure we are not selecting System ROM file */ if (type < FILETYPE_MAX) { /* reset file type */ fileType = type; /* reset File selector */ ClearSelector(max); } } return max; } char *GetCurrentDirectory(void) { return fileDir; }gx/images/Key_B_gcn.png000664 001750 001750 00000003141 12702465756 016130 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/12/09'IDATx[G?}ow]6)kvPM[kADFPhMUbKjERHU`Dk-)Rd?׋݄8̼3*oVbFI1Hpj4M?,^ lncQGou>&L_՜[]ߝ9={`,4K{c>urhtuжPPVPU4h4M e7W__ &{KkN~d4}{~%ؾF3փhLDA{9hb{ˮ\U~]cSէ.??prcO&* edB;Ж%:+βa;8˱elT\ݚ7-/Z3me{֜gʂ'c рkEYYp6}i\#8Eѽ_mZ D"z *Lq;)7D7U梌S!P+"OMOU=Ƙh0ܳ0?25=LWL0U v1,؉*Ӝ#k-6{G ljbx`*OM䁻8~PV[]S Aw,8YXkٝO*5S ؟p;p6*J(*j¦m9[հ5tńxbmy w(cQBPe!I?}?sm4T*cVCk)U6黎gw'IBAiU"WU  ~[αJ1Qƻ|RY )N *Ub =I/YL[(b-昵5ve쑈89Unt]+J>ͨ4bU(4=ӧu]CSW5,銂roNOgFitJD(U(Dja^hm@s=W0hРah9&773L馛*F :6dd/Qoرc @ƃ*Ϊ,ANf*KϜz:G>2{%~ƌyyy:8Y@CP hВKxG'vaZ_XJmJȐpSS:tᣏѧ+|6*e\S͖|wyg9Z -b @ a?Z?;0uԜ/| {44uEUUPU>Gx`Cqߞo={v^AA76TDP ؄gѲzhbJJJvi=+A9-2Z=碮 |>tkNIIXlل7]-@D(U/8cY]v(QsHMV@QU>}ʧa&挏wL>}ӷ]6< AD ]!D_#<2pdV08PI˼⥜>*8݄9---@ SO<9A+DP U_ӦM3wqm]Q- MAvS=ᣏѧ+}\lYϵ 3g?~ƭ[,@D(D|'bXzU91lYrS2zNC#|j=e\>.`R"z=(#` @9@s.@x|>GfGW4|YT `5kV{փȁ[ @`ۿ gh4P?JSP<>}Άϖ]LO2%liO=Ԥ4=EP CQs\s̀'˭ݾs/'(=k6GtzYϝ;w̔)Soذ!b\@ =a?fxGZ^K19R=YTdpO;}ΒOrI3NJx'mذ!|\`(AP fBߵ^;n~mUBh3%|OӧO5}Zơ]ߢ-@@d5zٿ˗O5iG+>tOEn5G)[FA^wRRҥK/YvIDP :oC'L4BNv{N!0j> |9>M.6Up nj36P\Pp*p8IJ>XJ+оdȢd.ϫ%.$#|O -aFA9)))'xr_O一b`E;_o 9j `ܾPUpy<$9exA>G󐋩#zԩS],1;@ @Iذ/ٿÑt)DҎ#.{Mƻs 75Gv8Uz L)Vk'69. .jD/`JqcѢEÇ }W 8/A&h>GtX T ;vlfb GbFdamLDx=L5 Uȉ§+e^˗/x2"GF_hؗ%K Gt;OQcLIɸƷ1;h ((b#Vۿ~zAŖCqh]-UUIjY8ߝ1cƌiӦm[n],,!F8222n@}-9C^(]R%=#|`ˮ\>9=)?aݺuY@@m@²errrr|Xl<߫dᣇ"iljf43>gΜq7nXPp#@EA_qrss{tMMŕ;UxtV("|t>ذ(暒ִzhƍKP\TPp -]4/ONfe/6@UPBaG GqF.=v؍sGA ~؁}ߝD' &)ᣏGzc$?2ZA"\ @+-9-[66;;oCZt@FAA >}F͗pUCgΟ>}zڵkóGB _D_ a]%TihYIJyd&|>[sA朴wY@#Xp @N0ВK))))Y Lk7@U[Fם}>§frO6mxAAAƍcY@",97}sxx]G9]SRRz{whтvF.`DPp!#=駟Ыz%2GfGᣏ[`PǷyyyŸ .H v a„ \s8?~WVA{G#|Xy?s 5%۬< =.h (B% oNHJJuc޸j,"˨ 1?>GM<۬Yևe .8ZeB1cF[%iT74\_Baf>ج~+0M._|w bv"2-~-_|brrr։Jakaڜ";]>G(ٰͷϞ=;`[X,DpA"@Es:1s|j 6PdUas 6>R|SGsR2-[6!0Gpp\@\ЈPppz|||J+ғ#|>6ihpn~n;1}ӧO " (UۿРٳfl+ln$50YU@#|>zlv+4ew}  .$~{:zꩩF1h˰P2?LE$Gᣏѣs~ g3}-k׮ P\PpAc;5kV.lGŶB<oeɲ =j\6Gᣏ,9}MI9m"=m7Gl4w1lyOq!*вᣏG裠t{B_76sуfm "\(%^wu &lhm1nc%)r`> |>|l͌)#M9>lŋO=; .D(8i#8z)9y(vBTUgᣏGq=|e1 ?sQSLٶa1.E #-=cܹOchm.WK GOƭt0)|I6l .XD(8o Ц|%瞻h49T-{S퍂T6J§m>Gp&'k7&7 a=EPpA"@N0l`!yyC\>V}hىJGgSAfLmJJ_t%Y@%)sO$@T(ڹH->GOk>[_̝&;f̘X"|E"H[9jpmj,k3Uqʄ>GO, [rͬ 'xbŋ~=bvAgi+p8o!qΣC'[fKQzg%|9>Md ꫯ7u>h?23`܋gNfnÆTӠɦp p1 x}ZQd$ =>E̹b);͚|Im" +²9%s=S )Ty%!}:_,蕚A͘2r1 ]9Gi3;VPP0|رA{9%"ojdɒṹ nos:*x<*fIs}*=yPߤ^˗/x2ZGF7%'''?cW[w౒^_l )lBEEQ(>G_>Mf>PW1sSLF{`Gz Ȣ-|hL-!t`H\lY~NNN}*񺽸nw݁>§|ocRzw}6lP 42$nA1} $IrD_mÑ(Q +H2( ܥ@]ӭ>5 |[onGN:p }Itw:$)K.ӷo>eU.7YSO[l4]#|;1u97;%q~߇vOdv@A?⁄f]{c 6DIEUR@pUM #|ϧlE3g͚_}v~dGd!FwK$7oIEC'kwܢ,nvW>§}֬εs Low݌mF % 2pn|I&a]WvYE" J7e#Z#|>}:lv|֫l3g>x 3@:HpÒ%KrsrrzWԸM?ߌڅO^=ᣏG/7+&e,YdO<ѯFy[wKD"0 =ᣏGA&'̒EW/[lܒ%KF?$m@>F5z/|9}$ v+_o#dYF{G#|M 4iDI|Ѕ8+4o|1}dY"_euG ŧLcYE{S2Gᣏѧ>uMwݦ HLnn6G, c,<+d @#|QQ@w§=>GzpxΊ$):+wc쒡3@.#|>}>GᣏG cWtŗխ_G#|>}>G.ZYAQU@#|>}>Gᣏѧ3>ƮPB+L(|>}>GᣏGq=P.)+>}>GᣏG#|鄏I1zȸN§>GᣏG#|>tǨt2JOψ>GᣏG#|>}:cT犢L=G#|>}>GOg|]3{3pGᣏG#|>}:ceYFU{܎§m>GᣏG#|>tƧk2j>GᣏG#|>}:cd5iᣏG#|>}>麹6iᣏG#|>}>1*]l{gᣏG#|>}>G.h]QVW |>mx(~Nq Vr6*$!& 2HEZe+b0#inu4֞Tm&U%)/*嬧n:T|쉽7 GRm΍T,Ñ$ф%Aj\R3r Fm?2xU6{2Y<wsCbTNbj6FM]B*NUK3^C&zIFa83GbNn4Y'-s 7p&=! pXTWGKç`sv5r~ .b0g(PUvcyݡ6=**8}#15 ^_gʏrvW*Y6{}LX{7q5E K21mhf]> UXIA6bsяq뺚8~`3UHH+V~ȲQfzѫPtOw}>1%*hXiԝ)eL)Hff}9{΍;>"jNaƳQyciM~C;@Uz~CZoũ}߷k|ͣo߾,k@'8an 3\I.[UuO>ㇶQqjCd 'Ys\0)嫢3y]<̳/0RejNڋ{.jry-WE嫍Xs2 t~.9'b;TVUW F'q7ߏZ6Φ+og#kʲCsh@c]%Ke}qk|J|ʏp$tQeU>Jbjf ^ǘq;wND ? w. j+<_8~q_~}R_SNC0dsz}|q֯" Hf2Kiny b՜}:cD e%euG㢺~띈oG%>λ̹ ?IWq{+OH{:{IA/`U 4|y0"+ڱz &-JLgfef`֬YuٓQ}3Tv`zC/Q)oT}ܭk2B2UUYK6rXa~HTU[׌{r7n^p^WS LYgkaﶏH5;cә{5)ߐmv?^|ܼ,#|9}l.`qH }O$ IDAT^[ ƌxGB]m5,˰/} J|>,+{Gi,^8* qIv&<&Zr/cƌcRRrEiǶ>\R@sc *`x230[qBe*lyֻ[}^ю]Zh4-m½ֻض6ۭI@BJfଋ@㑇sqӼC:u͕2 —5Ss8&ݷ4pcFcs$Srlgm\B >o+qknn^|>pю]Xc6OG6c?m"slBfef/; }>$*6G E6F,yy0 ᣏѧ3>]44Z F hn4[i9Χkb4@U.?ݑ*l )neĈQ_yizgcL2-⣝rc40[픔c-6omd$ 5˨GWf-p.dwa:|$^k+ݹ{/۶'!YFoOZ3>5V#Y/5^z-~+3mzK`RX]r›Z9·EaЁ mjǮң4PÏ>u"//>OVQMdCGBabϞQ{)ܲG8O!8g}-Ŏ­dlQs$?ӟ#νfIKuUi4[II w1&/9$ʪ>GاK*ȁz3pᣏ`4ܛ,b/ڶ7zDiY9?ˤEUjϔ0x1[m,֨^X |xgA  LX f_䎻9߇m,'n}#ۅ%w{ッ=^TTf+'NEwpF50G,൨~1i̸|ZZcnjh&.|6{*TFΠqhщcd 5bڳxflCjcGW~l]pwD`uL)(h yo:Oۨ[Srt'22jdd3(BaΈc l_[ W͞D=EQC׻Ŗ={bn݌9W^+7K/oT`ߵH9W>C|$I$cX0 . !c>⊣,䉈Fyg?'%%g|4~֯{Y\D=Зhmif}fR3IM0q@1.7܁#1wVk؀VLZ,`ZǟW n?wKq570uu7m¶ ֣pW|<2R `zjOV9 ˶Z 2_>Tqlq/ ̰C'${d>OcD8ж(;f%1)^ȟz'"|gY8~U CƘ>׶=\˰YqM %-WctSعk?832cFtR p9>=vIn'K>-$fD5k6aժG{Ϟ-d ?CJ+(?@B%ZRQ5(厨rv{^J2;w3$ k`FF/$Iba̻mt|GMTj }>K%x%;~E.rswdO313Y.׹544zEwm6G3[9^r2pw *$<'OLU{$jJ'>ilrt6GlAw۷ K\yFDl&olDW0R6mFOt,ry}1} #?9WFf>\@J6-zr>U1OyYvyQ#K/P^qÁQ낸 H^m6IMLЛf<gj M %e94Urh׺΢ܼ@$ޞD箫@:k<ĭ 燖E ZmMGUU$YTHd4GZчWhD21 Roo|P GR/-qkOY6bƍZmWT~y9lۼ;!4UҫwNrU&m9JݙRvmSI‘Nm)yQk;^/=f]IcM|Go%r F3͍5x,2NW>9ao[4^i,_ɽ'Es|dǍL9@`0~:?`Q?qi v*wUZHu_D,sVl[(QJWSUHCeɡvY}(-=hSxse#Ok9W>Fa K* d _g#|:KrZ6vF}A}G_N9%ʒ[~?ÑJet~}+̻m|n ˞bȐ!uɬrm?_iTe Fv@_v7ߦafbw;ftԸAjjj~5߾.{=L]m媨X og@=>MHLQ:EvԸ"zķfOы/Dhإ^;S‚w^7_g1T$=K1'>\o اhLL&]Yɽ9Sq9W]W7j, F#_v9}o'"FtXcIQ| 0W:ѽua֭y-ZOXUF۔ og2!TN ZLyd-QV;hC|-[9'Rw4G{ᅬ=!ۨQIӮw_g+xݷ"hh[z-P?ψI7.HQV╟y 츱y>$IbG <J gؼvC%5sIi933LVn՟0wNd' q Gs5A w GtĀ9y3gW_E>}h1lܸڀHz@*N %%7+VԌWlWU;y$ָuR0L|gGA.4r>dbTU%;w4 Io4cxMfSUlv^{0ϋh0,Ȳ̂Gq& JM&+{fq446vh=Ҧ3[lW#D=y7-$oK;38榺Sw'nc̙&//ɓ#b˖*.D<GbzhBQǟ/`:r8vlBBr9#/ ?lTQql,V;~,]G%h3de n"!12B*TVV駟qQ$9='hD~ 9IO< 4UU %b\ eIfڳ%}OlTUTG}u9I}]-J`>EY6`؈OL%15 5 iI"ޑBV( F!V*KP{:B%gphpOCu98]QEBB6œ#9Y/ZPscx/Ȳق%Ύ#7V3InUY{R:)C.zUL8R{ .?f#8F TjY&!)q5QYrۉC@b,#g(MuUTtR{dgUUhnL)z|^ $c4HNs^N/q&q;k,pN&HJYlN|^wĵ*?3뫪J##COᣏѧ3>ƮP=J>§mٓ1l}JcbGZ@:$$ewȧ#ؓұ'N } v|:a'c$Iq%AAcc~fO=)t~hqQAT[>e#tiZc2z^}ЫOl41pH\Jʲ=eu\OiOg|(]0R,K >GᣏG#|>}:%sȨBO OG#|>}>GNt\jR+>>@'BpL8,q`.g=Fd ́dAEnnFUZ{&%.ӌD60z\6< BTG$ld,q֏,6qv$|^~K0[ܸ]NL& &VEUrDtTf,$ EQZb`2nnqEԫ(~}ֽ4eY~`4a#I&~6 Uk?ՆZjBU|44(*~1Ԙ:Uŏbl߈+xSh$I6h~6́bas W=N٨ B,1 UEۉ>nz<&$ـ%Ύ%:f UU0XxN|fNq6au73YFϦ&܈hHhq5v5a2[cjF {$0[ln''LyKe1MpM}evUņɬ!v5!IR`v/Ȯ  x~}^q44R_S,˘,6Dž I0L #a4a0͡ukZ1-z\-Id9 h;nnnFq)¯:͍MfF K ́b 29K\|:#w}hb01bk5\:&-1t #1[q77jCeld F3nv#F3uu˲Y6h(]M(~oh.g=M6{2f-U>='p>+=$>sV1y Cx\NLLxjN^R3I*LЗ͞Lc}&54$I,C6heUHY_qo8,qvNڏфFţ(JK`4r6`2[dp;A XmKg!2>MfΔPYr(ijs* ljl]1;}HDa4] T:l݌`:(>@ t@rQ ctѾpu}76G2nW#6QU%b;n,+{HɑMf F3숺(?/ONSmwPJg)Zq9C8'Zo8gʏq7IXmv<.g輊w$Thσl؟>u;.OrEԧ6gm)Td* H#P]q e-p$>!9C0Yp6nmT"vYp7kAjnFU9dg`jJpLCV\&3FWs#&9A#ܭL84T&`+Nhǿս&8}` 1>OHMfᨪ[1e>ܑ8Xy'v6~x=.3;|RjOCU FS6PorjJT퇋$ˡ~}~ ]C'b0YZ;UQ"~}^Rz:ECl38}H cA ]}~{vE-3dPʎpjdeem{o:FݷߌXoŪ<ӱijaѼΛ[wa2Y).oɏ_!O>1+~mr˿5KBR _yw0C aڌ+o~ɐ!Cؽ+VsfȐ!ajɧŋs ^+0ey'?ֲ?z E;t(V=C 'Lfq6+*}^v8oɏ^z1x7w,^Qysvo+J|B Fӷ>\в nѦ[r2l"ny>yc'˼K<1u^%KrJ; F8>2:ߵ%?UUټq}t}c40U1m7`HkŪ<ЃXG/}ݛnrh䓈{-7/`|GCQԘu=R ql/dXRWꐐP~/^L njgUא57o^i**40 ̒%Δ p㼛7;ݑ`IDAT iUP} (*dy̛>8E1U#hM|32tzR\JK˘<2|d䩸ꩭ*%)Yd媏or6DKƍA L?Ҳ0eFmt8-3#uSV^xg?ŋ$9 ܝjD̾|o߹6A 񸚸gݔÏIJNq9qSTlD$+?9YYXZnV|ȄISZgw3a甖1oˆ{Mu L& l/ArlL}rZ`G km{w,^*\ݷc{r~ucڱre_zV3bhm/嗞G |RZZƻoj嗞 O O= wSuW_}v6W2|(zq{0dX>n;%c]cm5[? l۰a#PT%4<ٵUFCQGgmAiS%h @2ȡ.dqcxQQJ[߿J\|]VVLLf+:% F3}YYZ̀mSX]md{= &OF6zlVZ+Wan9*_U!O?Y\^5NJg$m==Fñ#xiv6SRZk5wND@ɧk9_b:8^*r>JZڒ25w?y^}w9I1[㮥7[,2j b&/%8gey 1b4Gvv>h3 ~ܱc7aݒVauHa5<e卹$bwy3 /يA6K7ͻ?mV\o#;+5k;(;ܒI\ AEng+!I{G[]Ԯ]/*mhEKzR@kQ[UC,BC>$3yy睙$繼{3~Mө8 sW+(/KMNj3CEkl IR74w,I{I^Db =.]ƕi4jvqML祮N3 .Y FQ]ζݰC˜y |3^(=x뭷YԹJG zۅizw }xl7ϦM? {̈H İ-XXMòe| ~gW-[s_M1=Tipm[Y3];vÓbJƓ,#_ nܿTWw4eg> elrӵSLM76j@0th7ywo,_5 znYmfIWOg+m3mtVX9ΠvÓL('\D|Om@yD8o6{eڴ.M7-qv,*Q[i4]߾};5Օ?w[x@30$h__T5>3iC;‘J,p" R@0Do]xHXL W>f [yq!F2n`֬5qɆ?~|jo78nt ;qo[HEkZLOkػw͟v,^vkV W~@1/nz;>+`xv|$NN ;g6H۶cp$ 2Dm|-t]g}ƌ4+}|5北K.XLvc,^Otuwiou<}qܱH`]Gx?w6>5PS=`S4sa%rm b}/˶#ܕ}ۼ5Ҧy]47,˲Wz] iӋܲt r E]\f5˖y_:Ȑrܺv ˻of1bcsc׏J,N{tpKhW^a:?XO(q . KBhmY]7XpOenv0N{&vۇﲆSF/k.\XΡbBPZCc::y&;aeCGx>tCw*Ć:ӯݰF|uܷ^k֭[W7~7=:gk_m)@tTri:p P3 x,JBOQ;0?db i:kR}il[]1F]a:a̝3M7up,\L{ӓrb-Ċ+R&3Yl4MܛL}un#24M6q c$-R^5p Km1we/دآkq z/^xֽvF֮]iܲt0~]ygkpX"%=iDRvNUw}ܭW_{=6h?}.Dzhi'nok]^;gvF|͜Cb XD|yv4 JPS~l߾ݡ#,íOr;gW<enIc4jaBE%m6oy466O!dMW0CM;ݿ|ar w%S.% $UWXf9lt!y)*?# #k:5Uok`OWi:;]ܼ[/׷ ꕗ6Q\>.w0=õ%Ĩ)n`z|\yP7$g|COujthSf٪i3ΙN㎝'s+]n9qx/F8Gy qx?l֖0 Bt. B%;Q5H71G맰d"qO$܎J C^X=TC CQYG;ܜ3Ţò,gJˡsi(9yNJKN#a7Z.^_@ ti^<y_#V"RX:IchN^A ѾY@NX4Oh?iWPFowH?ҍeYEb`MDa 7 _X't9;h?5LJb3'7nv^_.wvq ~M SX2 J~0`N>EeguD$aSF~A)`Mca&XTLk8&wsezL$ͭoIiٟJQXz&Dz:2f2h <^?%g|?ô9m[x|W|Cvy,’It~J<>ns 5 JWTnS M_ %)F=?Hm 'Mݺmk}'imir߭hQ2#a 1R㥰dzɯFh;D0 tc` + ~[ġu9lѽ7h@lm'mνWLv{5BJgnOoMazWTN~a)}=]mJW ypw'MT0`z|x>T<."=nG~a0Sr5t:hSιp1c4w j;RN]FMÉN%9Qg-:Y~ OΘIVy~<ْk$cc9\G.#KȥxR9c9L5(ee5I$,"JıX}xQ?+ţxQϨ @0D@O00=wQۡQiram_rom + 0x800, cart.rom + 0x800, 0x20000 - 0x800); ssp1601_reset(&svp->ssp1601); } void svp_write_dram(uint32 address, uint32 data) { *(uint16 *)(svp->dram + (address & 0x1fffe)) = data; if ((address == 0x30fe06) && data) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE06; if ((address == 0x30fe08) && data) svp->ssp1601.emu_status &= ~SSP_WAIT_30FE08; } uint32 svp_read_cell_1(uint32 address) { address >>= 1; address = (address & 0x7001) | ((address & 0x3e) << 6) | ((address & 0xfc0) >> 5); return *(uint16 *)(svp->dram + (address & 0x1fffe)); } uint32 svp_read_cell_2(uint32 address) { address >>= 1; address = (address & 0x7801) | ((address & 0x1e) << 6) | ((address & 0x7e0) >> 4); return *(uint16 *)(svp->dram + (address & 0x1fffe)); } sdl/main.h000664 001750 001750 00000000252 12702465756 013576 0ustar00sergiosergio000000 000000 #ifndef _MAIN_H_ #define _MAIN_H_ #define MAX_INPUTS 8 extern int debug_on; extern int log_error; extern int sdl_input_update(void); #endif /* _MAIN_H_ */ sdl/main.c000664 001750 001750 00000061416 12702465756 013602 0ustar00sergiosergio000000 000000 #ifdef __WIN32__ #include #else #define MessageBox(owner, text, caption, type) printf("%s: %s\n", caption, text) #endif #include "SDL.h" #include "SDL_thread.h" #include "shared.h" #include "sms_ntsc.h" #include "md_ntsc.h" #define SOUND_FREQUENCY 48000 #define SOUND_SAMPLES_SIZE 2048 #define VIDEO_WIDTH 320 #define VIDEO_HEIGHT 240 int joynum = 0; int log_error = 0; int debug_on = 0; int turbo_mode = 0; int use_sound = 1; int fullscreen = 0; /* SDL_FULLSCREEN */ /* sound */ struct { char* current_pos; char* buffer; int current_emulated_samples; } sdl_sound; static uint8 brm_format[0x40] = { 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f }; static short soundframe[SOUND_SAMPLES_SIZE]; static void sdl_sound_callback(void *userdata, Uint8 *stream, int len) { if(sdl_sound.current_emulated_samples < len) { memset(stream, 0, len); } else { memcpy(stream, sdl_sound.buffer, len); /* loop to compensate desync */ do { sdl_sound.current_emulated_samples -= len; } while(sdl_sound.current_emulated_samples > 2 * len); memcpy(sdl_sound.buffer, sdl_sound.current_pos - sdl_sound.current_emulated_samples, sdl_sound.current_emulated_samples); sdl_sound.current_pos = sdl_sound.buffer + sdl_sound.current_emulated_samples; } } static int sdl_sound_init() { int n; SDL_AudioSpec as_desired, as_obtained; if(SDL_Init(SDL_INIT_AUDIO) < 0) { MessageBox(NULL, "SDL Audio initialization failed", "Error", 0); return 0; } as_desired.freq = SOUND_FREQUENCY; as_desired.format = AUDIO_S16LSB; as_desired.channels = 2; as_desired.samples = SOUND_SAMPLES_SIZE; as_desired.callback = sdl_sound_callback; if(SDL_OpenAudio(&as_desired, &as_obtained) == -1) { MessageBox(NULL, "SDL Audio open failed", "Error", 0); return 0; } if(as_desired.samples != as_obtained.samples) { MessageBox(NULL, "SDL Audio wrong setup", "Error", 0); return 0; } sdl_sound.current_emulated_samples = 0; n = SOUND_SAMPLES_SIZE * 2 * sizeof(short) * 20; sdl_sound.buffer = (char*)malloc(n); if(!sdl_sound.buffer) { MessageBox(NULL, "Can't allocate audio buffer", "Error", 0); return 0; } memset(sdl_sound.buffer, 0, n); sdl_sound.current_pos = sdl_sound.buffer; return 1; } static void sdl_sound_update(enabled) { int size = audio_update(soundframe) * 2; if (enabled) { int i; short *out; SDL_LockAudio(); out = (short*)sdl_sound.current_pos; for(i = 0; i < size; i++) { *out++ = soundframe[i]; } sdl_sound.current_pos = (char*)out; sdl_sound.current_emulated_samples += size * sizeof(short); SDL_UnlockAudio(); } } static void sdl_sound_close() { SDL_PauseAudio(1); SDL_CloseAudio(); if (sdl_sound.buffer) free(sdl_sound.buffer); } /* video */ md_ntsc_t *md_ntsc; sms_ntsc_t *sms_ntsc; struct { SDL_Surface* surf_screen; SDL_Surface* surf_bitmap; SDL_Rect srect; SDL_Rect drect; Uint32 frames_rendered; } sdl_video; static int sdl_video_init() { if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { MessageBox(NULL, "SDL Video initialization failed", "Error", 0); return 0; } sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_SWSURFACE | fullscreen); sdl_video.surf_bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, 720, 576, 16, 0, 0, 0, 0); sdl_video.frames_rendered = 0; SDL_ShowCursor(0); return 1; } static void sdl_video_update() { if (system_hw == SYSTEM_MCD) { system_frame_scd(0); } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { system_frame_gen(0); } else { system_frame_sms(0); } /* viewport size changed */ if(bitmap.viewport.changed & 1) { bitmap.viewport.changed &= ~1; /* source bitmap */ sdl_video.srect.w = bitmap.viewport.w+2*bitmap.viewport.x; sdl_video.srect.h = bitmap.viewport.h+2*bitmap.viewport.y; sdl_video.srect.x = 0; sdl_video.srect.y = 0; if (sdl_video.srect.w > VIDEO_WIDTH) { sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2; sdl_video.srect.w = VIDEO_WIDTH; } if (sdl_video.srect.h > VIDEO_HEIGHT) { sdl_video.srect.y = (sdl_video.srect.h - VIDEO_HEIGHT) / 2; sdl_video.srect.h = VIDEO_HEIGHT; } /* destination bitmap */ sdl_video.drect.w = sdl_video.srect.w; sdl_video.drect.h = sdl_video.srect.h; sdl_video.drect.x = (VIDEO_WIDTH - sdl_video.drect.w) / 2; sdl_video.drect.y = (VIDEO_HEIGHT - sdl_video.drect.h) / 2; /* clear destination surface */ SDL_FillRect(sdl_video.surf_screen, 0, 0); #if 0 if (config.render && (interlaced || config.ntsc)) rect.h *= 2; if (config.ntsc) rect.w = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(rect.w) : SMS_NTSC_OUT_WIDTH(rect.w); if (config.ntsc) { sms_ntsc = (sms_ntsc_t *)malloc(sizeof(sms_ntsc_t)); md_ntsc = (md_ntsc_t *)malloc(sizeof(md_ntsc_t)); switch (config.ntsc) { case 1: sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite); break; case 2: sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo); break; case 3: sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); break; } } else { if (sms_ntsc) { free(sms_ntsc); sms_ntsc = NULL; } if (md_ntsc) { free(md_ntsc); md_ntsc = NULL; } } #endif } SDL_BlitSurface(sdl_video.surf_bitmap, &sdl_video.srect, sdl_video.surf_screen, &sdl_video.drect); SDL_UpdateRect(sdl_video.surf_screen, 0, 0, 0, 0); ++sdl_video.frames_rendered; } static void sdl_video_close() { if (sdl_video.surf_bitmap) SDL_FreeSurface(sdl_video.surf_bitmap); if (sdl_video.surf_screen) SDL_FreeSurface(sdl_video.surf_screen); } /* Timer Sync */ struct { SDL_sem* sem_sync; unsigned ticks; } sdl_sync; static Uint32 sdl_sync_timer_callback(Uint32 interval) { SDL_SemPost(sdl_sync.sem_sync); sdl_sync.ticks++; if (sdl_sync.ticks == (vdp_pal ? 50 : 20)) { SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = vdp_pal ? (sdl_video.frames_rendered / 3) : sdl_video.frames_rendered; userevent.data1 = NULL; userevent.data2 = NULL; sdl_sync.ticks = sdl_video.frames_rendered = 0; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } return interval; } static int sdl_sync_init() { if(SDL_InitSubSystem(SDL_INIT_TIMER|SDL_INIT_EVENTTHREAD) < 0) { MessageBox(NULL, "SDL Timer initialization failed", "Error", 0); return 0; } sdl_sync.sem_sync = SDL_CreateSemaphore(0); sdl_sync.ticks = 0; return 1; } static void sdl_sync_close() { if(sdl_sync.sem_sync) SDL_DestroySemaphore(sdl_sync.sem_sync); } static const uint16 vc_table[4][2] = { /* NTSC, PAL */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0xEA , 0x102}, /* Mode 5 (224 lines) */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0x106, 0x10A} /* Mode 5 (240 lines) */ }; static int sdl_control_update(SDLKey keystate) { switch (keystate) { case SDLK_TAB: { system_reset(); break; } case SDLK_F1: { if (SDL_ShowCursor(-1)) SDL_ShowCursor(0); else SDL_ShowCursor(1); break; } case SDLK_F2: { if (fullscreen) fullscreen = 0; else fullscreen = SDL_FULLSCREEN; sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_SWSURFACE | fullscreen); break; } case SDLK_F3: { if (config.bios == 0) config.bios = 3; else if (config.bios == 3) config.bios = 1; break; } case SDLK_F4: { if (!turbo_mode) use_sound ^= 1; break; } case SDLK_F5: { log_error ^= 1; break; } case SDLK_F6: { if (!use_sound) { turbo_mode ^=1; sdl_sync.ticks = 0; } break; } case SDLK_F7: { FILE *f = fopen("game.gp0","rb"); if (f) { uint8 buf[STATE_SIZE]; fread(&buf, STATE_SIZE, 1, f); state_load(buf); fclose(f); } break; } case SDLK_F8: { FILE *f = fopen("game.gp0","wb"); if (f) { uint8 buf[STATE_SIZE]; int len = state_save(buf); fwrite(&buf, len, 1, f); fclose(f); } break; } case SDLK_F9: { config.region_detect = (config.region_detect + 1) % 5; get_region(0); /* framerate has changed, reinitialize audio timings */ audio_init(snd.sample_rate, 0); /* system with region BIOS should be reinitialized */ if ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && (config.bios & 1))) { system_init(); system_reset(); } else { /* reinitialize I/O region register */ if (system_hw == SYSTEM_MD) { io_reg[0x00] = 0x20 | region_code | (config.bios & 1); } else { io_reg[0x00] = 0x80 | (region_code >> 1); } /* reinitialize VDP */ if (vdp_pal) { status |= 1; lines_per_frame = 313; } else { status &= ~1; lines_per_frame = 262; } /* reinitialize VC max value */ switch (bitmap.viewport.h) { case 192: vc_max = vc_table[0][vdp_pal]; break; case 224: vc_max = vc_table[1][vdp_pal]; break; case 240: vc_max = vc_table[3][vdp_pal]; break; } } break; } case SDLK_F10: { gen_reset(0); break; } case SDLK_F11: { config.overscan = (config.overscan + 1) & 3; if ((system_hw == SYSTEM_GG) && !config.gg_extra) { bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; } else { bitmap.viewport.x = (config.overscan & 2) * 7; } bitmap.viewport.changed = 3; break; } case SDLK_F12: { joynum = (joynum + 1) % MAX_DEVICES; while (input.dev[joynum] == NO_DEVICE) { joynum = (joynum + 1) % MAX_DEVICES; } break; } case SDLK_ESCAPE: { return 0; } default: break; } return 1; } int sdl_input_update(void) { uint8 *keystate = SDL_GetKeyState(NULL); /* reset input */ input.pad[joynum] = 0; switch (input.dev[joynum]) { case DEVICE_LIGHTGUN: { /* get mouse coordinates (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* X axis */ input.analog[joynum][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2; /* Y axis */ input.analog[joynum][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2; /* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; break; } case DEVICE_PADDLE: { /* get mouse (absolute values) */ int x; int state = SDL_GetMouseState(&x, NULL); /* Range is [0;256], 128 being middle position */ input.analog[joynum][0] = x * 256 /VIDEO_WIDTH; /* Button I -> 0 0 0 0 0 0 0 I*/ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; break; } case DEVICE_SPORTSPAD: { /* get mouse (relative values) */ int x,y; int state = SDL_GetRelativeMouseState(&x,&y); /* Range is [0;256] */ input.analog[joynum][0] = (unsigned char)(-x & 0xFF); input.analog[joynum][1] = (unsigned char)(-y & 0xFF); /* Buttons I & II -> 0 0 0 0 0 0 II I*/ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; break; } case DEVICE_MOUSE: { /* get mouse (relative values) */ int x,y; int state = SDL_GetRelativeMouseState(&x,&y); /* Sega Mouse range is [-256;+256] */ input.analog[joynum][0] = x * 2; input.analog[joynum][1] = y * 2; /* Vertical movement is upsidedown */ if (!config.invert_mouse) input.analog[joynum][1] = 0 - input.analog[joynum][1]; /* Start,Left,Right,Middle buttons -> 0 0 0 0 START MIDDLE RIGHT LEFT */ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; break; } case DEVICE_XE_1AP: { /* A,B,C,D,Select,START,E1,E2 buttons -> E1(?) E2(?) START SELECT(?) A B C D */ if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_START; if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_Y; if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_B; if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_X; if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_MODE; if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_Z; /* Left Analog Stick (bidirectional) */ if(keystate[SDLK_UP]) input.analog[joynum][1]-=2; else if(keystate[SDLK_DOWN]) input.analog[joynum][1]+=2; else input.analog[joynum][1] = 128; if(keystate[SDLK_LEFT]) input.analog[joynum][0]-=2; else if(keystate[SDLK_RIGHT]) input.analog[joynum][0]+=2; else input.analog[joynum][0] = 128; /* Right Analog Stick (unidirectional) */ if(keystate[SDLK_KP8]) input.analog[joynum+1][0]-=2; else if(keystate[SDLK_KP2]) input.analog[joynum+1][0]+=2; else if(keystate[SDLK_KP4]) input.analog[joynum+1][0]-=2; else if(keystate[SDLK_KP6]) input.analog[joynum+1][0]+=2; else input.analog[joynum+1][0] = 128; /* Limiters */ if (input.analog[joynum][0] > 0xFF) input.analog[joynum][0] = 0xFF; else if (input.analog[joynum][0] < 0) input.analog[joynum][0] = 0; if (input.analog[joynum][1] > 0xFF) input.analog[joynum][1] = 0xFF; else if (input.analog[joynum][1] < 0) input.analog[joynum][1] = 0; if (input.analog[joynum+1][0] > 0xFF) input.analog[joynum+1][0] = 0xFF; else if (input.analog[joynum+1][0] < 0) input.analog[joynum+1][0] = 0; if (input.analog[joynum+1][1] > 0xFF) input.analog[joynum+1][1] = 0xFF; else if (input.analog[joynum+1][1] < 0) input.analog[joynum+1][1] = 0; break; } case DEVICE_PICO: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = 0x3c + (x * (0x17c-0x03c+1)) / VIDEO_WIDTH; input.analog[0][1] = 0x1fc + (y * (0x2f7-0x1fc+1)) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_MMASK) pico_current = (pico_current + 1) & 7; if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_PICO_RED; if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_PICO_PEN; break; } case DEVICE_TEREBI: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = (x * 250) / VIDEO_WIDTH; input.analog[0][1] = (y * 250) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_B; break; } case DEVICE_GRAPHIC_BOARD: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = (x * 255) / VIDEO_WIDTH; input.analog[0][1] = (y * 255) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_GRAPHIC_PEN; if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_GRAPHIC_MENU; if(state & SDL_BUTTON_MMASK) input.pad[0] |= INPUT_GRAPHIC_DO; break; } case DEVICE_ACTIVATOR: { if(keystate[SDLK_g]) input.pad[joynum] |= INPUT_ACTIVATOR_7L; if(keystate[SDLK_h]) input.pad[joynum] |= INPUT_ACTIVATOR_7U; if(keystate[SDLK_j]) input.pad[joynum] |= INPUT_ACTIVATOR_8L; if(keystate[SDLK_k]) input.pad[joynum] |= INPUT_ACTIVATOR_8U; } default: { if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_B; if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_X; if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_Y; if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_Z; if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_MODE; if(keystate[SDLK_UP]) input.pad[joynum] |= INPUT_UP; else if(keystate[SDLK_DOWN]) input.pad[joynum] |= INPUT_DOWN; if(keystate[SDLK_LEFT]) input.pad[joynum] |= INPUT_LEFT; else if(keystate[SDLK_RIGHT]) input.pad[joynum] |= INPUT_RIGHT; break; } } return 1; } int main (int argc, char **argv) { FILE *fp; int running = 1; /* Print help if no game specified */ if(argc < 2) { char caption[256]; sprintf(caption, "Genesis Plus GX\\SDL\nusage: %s gamename\n", argv[0]); MessageBox(NULL, caption, "Information", 0); exit(1); } /* set default config */ error_init(); set_config_defaults(); /* mark all BIOS as unloaded */ system_bios = 0; /* Genesis BOOT ROM support (2KB max) */ memset(boot_rom, 0xFF, 0x800); fp = fopen(MD_BIOS, "rb"); if (fp != NULL) { int i; /* read BOOT ROM */ fread(boot_rom, 1, 0x800, fp); fclose(fp); /* check BOOT ROM */ if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) { /* mark Genesis BIOS as loaded */ system_bios = SYSTEM_MD; } /* Byteswap ROM */ for (i=0; i<0x800; i+=2) { uint8 temp = boot_rom[i]; boot_rom[i] = boot_rom[i+1]; boot_rom[i+1] = temp; } } /* initialize SDL */ if(SDL_Init(0) < 0) { char caption[256]; sprintf(caption, "SDL initialization failed"); MessageBox(NULL, caption, "Error", 0); exit(1); } sdl_video_init(); if (use_sound) sdl_sound_init(); sdl_sync_init(); /* initialize Genesis virtual system */ SDL_LockSurface(sdl_video.surf_bitmap); memset(&bitmap, 0, sizeof(t_bitmap)); bitmap.width = 720; bitmap.height = 576; #if defined(USE_8BPP_RENDERING) bitmap.pitch = (bitmap.width * 1); #elif defined(USE_15BPP_RENDERING) bitmap.pitch = (bitmap.width * 2); #elif defined(USE_16BPP_RENDERING) bitmap.pitch = (bitmap.width * 2); #elif defined(USE_32BPP_RENDERING) bitmap.pitch = (bitmap.width * 4); #endif bitmap.data = sdl_video.surf_bitmap->pixels; SDL_UnlockSurface(sdl_video.surf_bitmap); bitmap.viewport.changed = 3; /* Load game file */ if(!load_rom(argv[1])) { char caption[256]; sprintf(caption, "Error loading file `%s'.", argv[1]); MessageBox(NULL, caption, "Error", 0); exit(1); } /* initialize system hardware */ audio_init(SOUND_FREQUENCY, 0); system_init(); /* Mega CD specific */ if (system_hw == SYSTEM_MCD) { /* load internal backup RAM */ fp = fopen("./scd.brm", "rb"); if (fp!=NULL) { fread(scd.bram, 0x2000, 1, fp); fclose(fp); } /* check if internal backup RAM is formatted */ if (memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { /* clear internal backup RAM */ memset(scd.bram, 0x00, 0x200); /* Internal Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = 0x00; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (sizeof(scd.bram) / 64) - 3; /* format internal backup RAM */ memcpy(scd.bram + 0x2000 - 0x40, brm_format, 0x40); } /* load cartridge backup RAM */ if (scd.cartridge.id) { fp = fopen("./cart.brm", "rb"); if (fp!=NULL) { fread(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); fclose(fp); } /* check if cartridge backup RAM is formatted */ if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { /* clear cartridge backup RAM */ memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); /* Cartridge Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; /* format cartridge backup RAM */ memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - sizeof(brm_format), brm_format, sizeof(brm_format)); } } } if (sram.on) { /* load SRAM */ fp = fopen("./game.srm", "rb"); if (fp!=NULL) { fread(sram.sram,0x10000,1, fp); fclose(fp); } } /* reset system hardware */ system_reset(); if(use_sound) SDL_PauseAudio(0); /* 3 frames = 50 ms (60hz) or 60 ms (50hz) */ if(sdl_sync.sem_sync) SDL_SetTimer(vdp_pal ? 60 : 50, sdl_sync_timer_callback); /* emulation loop */ while(running) { SDL_Event event; if (SDL_PollEvent(&event)) { switch(event.type) { case SDL_USEREVENT: { char caption[100]; sprintf(caption,"Genesis Plus GX - %d fps - %s)", event.user.code, (rominfo.international[0] != 0x20) ? rominfo.international : rominfo.domestic); SDL_WM_SetCaption(caption, NULL); break; } case SDL_QUIT: { running = 0; break; } case SDL_KEYDOWN: { running = sdl_control_update(event.key.keysym.sym); break; } } } sdl_video_update(); sdl_sound_update(use_sound); if(!turbo_mode && sdl_sync.sem_sync && sdl_video.frames_rendered % 3 == 0) { SDL_SemWait(sdl_sync.sem_sync); } } if (system_hw == SYSTEM_MCD) { /* save internal backup RAM (if formatted) */ if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { fp = fopen("./scd.brm", "wb"); if (fp!=NULL) { fwrite(scd.bram, 0x2000, 1, fp); fclose(fp); } } /* save cartridge backup RAM (if formatted) */ if (scd.cartridge.id) { if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { fp = fopen("./cart.brm", "wb"); if (fp!=NULL) { fwrite(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); fclose(fp); } } } } if (sram.on) { /* save SRAM */ fp = fopen("./game.srm", "wb"); if (fp!=NULL) { fwrite(sram.sram,0x10000,1, fp); fclose(fp); } } audio_shutdown(); error_shutdown(); sdl_video_close(); sdl_sound_close(); sdl_sync_close(); SDL_Quit(); return 0; } gx/images/Main_reset.png000664 001750 001750 00000014377 12702465756 016413 0ustar00sergiosergio000000 000000 PNG  IHDR4PVVsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time06/28/125lSIDATxyTTWǿzRHJQ ".11mngtĵc55cb&15n݆47nUBc/E39uE{w<~!V޽{7Ͳ,iyj j2qD_?x?a0k׮4q6mXyyy|EEED"Q<x4MT:NgN``@ "rssyOt/566ip4mH$N <'IZ"-8 V0oGFQRǀl6ĉ~sڵeeed^TZhtZt9nԩ#rJ VTTf5Ixg}ܸq<8w\µkז^xqFaa!BBBl}-ׯwV:ozz"==]0P(yI$m7|%,,c66n8<$nS;vQQQw@ݻwٳgƍ!f "##_xOzMmfݼy V__A4^o$ a!h JueM3Z~YfYsP\P}zB jcc㖼|8p8X9EQdFjj*֯_FeדJƍ7~7o /q(J@rg>$ ͆fgt߼3N(b׮]0 RX ZZZx h$ԃhrh,vZ iTp:[A hDii) ""* 6 ( jNɨbAhh(<ʺt_@O$T qȡP(jvQTwt:p\HHHQ !uG_7}fq&O Vrtr{qVU>}R=zU>J2wqHM(((3g,,XA-7{qV+L&^~eL:NXraРAGiٷo "V(D={6X,ɓk׮GDDnbev`@TT֯_!Cd2vv6 hjjԩSf… 8|0<O1&$$&`0D9 8JtttkPjjjcBBBhii e{xx8fs3AŚ5kP[[Xlٲ .D~@dD"!CrJ| č7rS$I& IIIVtv|EEEe}$>>Ϫ7|w\fqqqB%PLÇ ˗/GBBVZ2ܼyF Gi~z"00ytBP 44t… {)v;VpjsK"Iiiiތ?qɣD"JQUU3f_Dxxx[&p)((~tFjP!V$''6m#;{$1lذ^xPаa_k^}9z/3L&X0 z쉺:lذV˲( zwAQQt:]׺*P:DGG#>>/yժUk+**ɓ'sH$<7<<رcsm6t߾}33g A4͐8Ih4X,{.JKK!:n7n7hFPP$ ^o0xg0v}233cǎ رcGFFtr?Y[WWvY)EQs9jZ:Ω a:}`ڴi.]{Fꫯ̜9s M]ntY > /Wz`RliB!D"Qۋь(p`K,q\-[~wǛ̙zpppAW0 ğ9s&joQVVA!&Çl%t{& v?^x~'|ɓXۨQvH lݻsҥ۷o?|k)))466ZyoqEGIl{f  #G߿e˖}vWꫭO͜9ӦM];<'؃"''2OW޴qFMcc[uuuܹ @4$ +NnRq_䓖`0Q5RRҶ],F#֭[$..oN08--m0JX~a@YY,C}QLTTԟ,XIll,.]pĈV^}<8b1w…fP5M;Gv쿩I typedef unsigned char bool; #define strncasecmp _strnicmp #endif #include #include #include #define MAX_INPUTS 8 #define MAX_KEYS 8 #define MAXPATHLEN 1024 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef M_PI #define M_PI 3.1415926535897932385 #endif #define CHEATS_UPDATE() ROMCheatUpdate() typedef struct { int8 device; uint8 port; uint8 padtype; } t_input_config; struct { char version[16]; uint8 hq_fm; uint8 filter; uint8 psgBoostNoise; uint8 dac_bits; uint8 ym2413; uint8 mono; int16 psg_preamp; int16 fm_preamp; int16 lp_range; int16 low_freq; int16 high_freq; int16 lg; int16 mg; int16 hg; uint8 system; uint8 region_detect; uint8 master_clock; uint8 vdp_mode; uint8 force_dtack; uint8 addr_error; uint8 bios; uint8 lock_on; uint8 overscan; uint8 ntsc; uint8 lcd; uint8 gg_extra; uint8 render; t_input_config input[MAX_INPUTS]; uint8 invert_mouse; uint8 gun_cursor; } config; extern char GG_ROM[256]; extern char AR_ROM[256]; extern char SK_ROM[256]; extern char SK_UPMEM[256]; extern char GG_BIOS[256]; extern char MD_BIOS[256]; extern char CD_BIOS_EU[256]; extern char CD_BIOS_US[256]; extern char CD_BIOS_JP[256]; extern char MS_BIOS_US[256]; extern char MS_BIOS_EU[256]; extern char MS_BIOS_JP[256]; extern void osd_input_update(void); extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); extern void ROMCheatUpdate(void); #endif /* _OSD_H */ libretro/msvc/msvc-2010/msvc-2010.vcxproj.filters000664 001750 001750 00000022531 12702465756 022461 0ustar00sergiosergio000000 000000  {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms {e0f9ca3b-df0f-4cf9-bde1-9fa3c945b0df} {0605ef1a-d898-494c-a898-8f06000646ae} {8b373848-96f7-4410-a466-5d7cb6866b0f} {ea37a461-94f4-40e3-91a8-2b254b94f547} {becebb08-7987-4fe3-8ee0-dd47889d4996} {e66cf784-cb76-4a70-a2e0-327a3b4c96eb} {39a1110f-2062-4e3c-9f43-aca63cc20cda} {95e90e29-1915-4f70-b6e0-50b9dace48cf} {eba4b43d-dbd8-4170-9853-e3234db6dfc0} {c4a5e1da-1ff3-4c81-893c-97364ed7ed4b} Source Files\cart_hw\svp Source Files\cart_hw\svp Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\input_hw Source Files\libretro Source Files\m68k Source Files\m68k Source Files\ntsc Source Files\ntsc Source Files\sound Source Files\sound Source Files\sound Source Files\sound Source Files\sound Source Files\z80 Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\cd_hw Source Files\libretro Source Files\cart_hw Source Files\cart_hw Source Files\cart_hw Source Files\sound Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor Source Files\tremor gx/utils/wrap_wiiuse.c000664 001750 001750 00000015026 12702465756 016204 0ustar00sergiosergio000000 000000 /**************************************************************************** * wrap_wiiuse.c * * libwiiuse wrapper for 3rd-party Classic Controller & Wii U Pro Controller support * * Copyright (C) 2015 Eke-Eke, based on technical info & code from Tueidj * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * 3. The name of the author may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifdef HW_RVL #include #include #define WM_EXP_MEM_BASE 0x04A40000 #define WM_CTRL_STATUS_BYTE1_ATTACHMENT 0x02 #define WIIMOTE_STATE_WIIU_PRO_FOUND 0x00002 #define WIIMOTE_STATE_HANDSHAKE 0x00004 #define WIIMOTE_STATE_HANDSHAKE_COMPLETE 0x00008 extern void __real_wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len); extern void __real_wiiuse_set_ir(struct wiimote_t *wm,int status); extern int __real_classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyte* data, uword len); static ubyte id[2]; void __wrap_wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) { if (!wm->handshake_state) { if (len==0) { /* 1st step : read wiimote status (this will also starts expansion handshake if one is connected) */ wiiuse_set_leds(wm,WIIMOTE_LED_NONE,NULL); wiiuse_status(wm,__wrap_wiiuse_handshake); return; } if (len > 2) { /* 2nd step: read expansion controller ID (if connected) */ if (data[2]&WM_CTRL_STATUS_BYTE1_ATTACHMENT) { wiiuse_read_data(wm,id,WM_EXP_MEM_BASE+0xFE,2,__wrap_wiiuse_handshake); return; } } else { /* 3rd step: finish handshake without trying to read internal memory if Wii U pro controller is detected */ if ((data[0]==0x01) && (data[1]==0x20)) { int *state = (int *)&wm->state; WIIUSE_EVENT_TYPE *event = (WIIUSE_EVENT_TYPE *)&wm->event; *state &= ~WIIMOTE_STATE_HANDSHAKE; *state |= (WIIMOTE_STATE_HANDSHAKE_COMPLETE | WIIMOTE_STATE_WIIU_PRO_FOUND); *event = WIIUSE_CONNECT; wiiuse_status(wm,NULL); return; } } } /* proceed with default handshake sequence */ __real_wiiuse_handshake(wm,data,len); } void __wrap_wiiuse_set_ir(struct wiimote_t *wm,int status) { /* do not enable IR on Wii U Pro Controller */ if (wm->state & WIIMOTE_STATE_WIIU_PRO_FOUND) { /* this will force data report modes 0x34 or 0x35 */ wiiuse_status(wm,NULL); return; } __real_wiiuse_set_ir(wm,status); } int __wrap_classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyte* data, uword len) { /* detect Wii U Pro Controller */ if ((len > 223) && (data[222] == 0x01) && (data[223] == 0x20)) { /* set default calibration values */ cc->btns = 0; cc->btns_held = 0; cc->btns_released = 0; cc->ljs.max.x = cc->ljs.max.y = cc->rjs.max.x = cc->rjs.max.y = 255; cc->ljs.min.x = cc->ljs.min.y = cc->rjs.min.x = cc->rjs.min.y = 0; cc->ljs.center.x = cc->ljs.center.y = cc->rjs.center.x = cc->rjs.center.y = 128; /* finish expansion handshake */ int *type = (int *)&wm->exp.type; *type = EXP_CLASSIC; return 1; } /* sometimes the first 16 bytes are invalid but the next 16 bytes are ok (?) */ if (data[0] == 0xFF) { if (data[16] != 0xFF) data += 16; } /* some 3rd-party classic controllers return invalid factory calibration data */ if ((data[0] <= data[2]) || (data[1] >= data[2]) || (data[3] <= data[5]) || (data[4] >= data[5]) || (data[6] <= data[8]) || (data[7] >= data[8]) || (data[9] <= data[11]) || (data[10] >= data[11])) { /* this will reset to default values */ memset(data, 0, 16); } return __real_classic_ctrl_handshake(wm, cc, data, len); } void __wrap_classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) { /* save previously pressed buttons */ cc->btns_last = cc->btns; /* detect Wii U pro controller */ if (cc->rjs.max.x == 0xFF) { /* pressed buttons (0 is active, 1 is inactive) */ cc->btns = ~((msg[8] << 8) | msg[9]) & CLASSIC_CTRL_BUTTON_ALL; /* convert 12-bit little endian analog joysticks position to 8-bit values */ cc->ljs.pos.x = (msg[0] >> 4) | (msg[1] << 4); cc->rjs.pos.x = (msg[2] >> 4) | (msg[3] << 4); cc->ljs.pos.y = (msg[4] >> 4) | (msg[5] << 4); cc->rjs.pos.y = (msg[6] >> 4) | (msg[7] << 4); /* left/right triggers (not analog) */ cc->ls_raw = cc->btns & CLASSIC_CTRL_BUTTON_FULL_L ? 0x1F : 0; cc->rs_raw = cc->btns & CLASSIC_CTRL_BUTTON_FULL_R ? 0x1F : 0; } else { /* pressed buttons (0 is active, 1 is inactive) */ cc->btns = ~((msg[4] << 8) | msg[5]) & CLASSIC_CTRL_BUTTON_ALL; /* analog joysticks position */ cc->ljs.pos.x = (msg[0] & 0x3F); cc->ljs.pos.y = (msg[1] & 0x3F); cc->rjs.pos.x = ((msg[0] & 0xC0) >> 3) | ((msg[1] & 0xC0) >> 5) | ((msg[2] & 0x80) >> 7); cc->rjs.pos.y = (msg[2] & 0x1F); /* left/right triggers (analog) */ cc->ls_raw = (((msg[2] & 0x60) >> 2) | ((msg[3] & 0xE0) >> 5)); cc->rs_raw = (msg[3] & 0x1F); } /* held buttons */ cc->btns_held = (cc->btns & cc->btns_last); /* released buttons */ cc->btns_released = (~cc->btns & cc->btns_last); } #endif gx/gui/menu.h000664 001750 001750 00000004243 12702465756 014242 0ustar00sergiosergio000000 000000 /**************************************************************************** * menu.c * * Genesis Plus GX menus * * Copyright Eke-Eke (2009-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _MENU_H #define _MENU_H extern void mainmenu(void); extern void (*reload)(void); #endif gx/images/Browser_dir.png000664 001750 001750 00000000702 12702465756 016571 0ustar00sergiosergio000000 000000 PNG  IHDR_sBIT|d pHYs  ~tEXtCreation Time04/06/09%$ tEXtSoftwareMacromedia Fireworks MX*$IDATx1J@_b.Zg\z K;/`aQAVwbC\6dKDh k#=lqu NpH?}z }'<ǔ 8163J㦊7. Lop*[hӛS2jW.#l_*"M7 ۉ@6X8!\G`1ZNU 뉰.šMV?2\UĞ]M(DPB1}G]H</IENDB`gcw0/opk_build.sh000664 001750 001750 00000000162 12702465756 015063 0ustar00sergiosergio000000 000000 #!/bin/sh rm -rf genplus.opk mksquashfs gen_gcw0 opk-data/* genplus.opk -all-root -noappend -no-exports -no-xattrsgx/fileio/fileio.h000664 001750 001750 00000004457 12702465756 015237 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive into ROM buffer. * Returns loaded ROM size (zero if an error occured). * * Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILEIO_H_ #define _FILEIO_H_ /* Function prototypes */ int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); #endif /* _FILEIO_H_ */ gx/fileio/history.h000664 001750 001750 00000005362 12702465756 015465 0ustar00sergiosergio000000 000000 /* * history.c * * Generic ROM history list managment * * Copyright Eke-Eke (2008-2012), based on original code from Martin Disibio (2008) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _HISTORY_H #define _HISTORY_H #include "filesel.h" #define NUM_HISTORY_ENTRIES (10) /**************************************************************************** * ROM Play History * ****************************************************************************/ typedef struct { char filepath[MAXJOLIET]; char filename[MAXJOLIET]; u8 filetype; } t_history_entry; typedef struct { t_history_entry entries[NUM_HISTORY_ENTRIES]; } t_history; extern t_history history; extern void history_add_file(char *filepath, char *filename, u8 filetype); extern void history_save(void); extern void history_load(void); extern void history_default(void); #endif gx/images/Frame_s2_title.png000664 001750 001750 00000004355 12702465756 017157 0ustar00sergiosergio000000 000000 PNG  IHDR<(c5F?sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?AIDATxlSϽ`B MeNQfʺn0uUVLUn0u*U`tv vӦPT6A4&m;w{CG|;?9_JLc/[^|VEꇿ~*fZѠ/&h`YE\ H=3@vL)>%ϝbbⰑ9|M%cri n*7IId6>-{,޵6WxRѯy\CHۺY$ گ)) Eߨ(5=V*QaoΟ'x̲ Ɛ(XD:F;n÷( #R*xK.%Onb/rk5җEttG~ fYL\f C˻),X\/}Kh'tW _5cls{Uұ;r?Am\9sQ{}0ڗ}&vLCԗq>erzn=_f˾zw8Jup8kk?-^@rdv> ֑+%5Wy0P>~P<ňOch9@vS\Y&3̘]avd._iE*{߁-myn&53#EVkn+>z KiY!|ChCwA#>uQ;[LYsf}=T 7ύ·V`P,ֵX< ގ]og_50L+@)Gea;N00N?(x%F|*C ͵v=`HRc*)+5g6!7ÑYU>wwX*B}>ID$1PU4Àd<[f ja|*}' s]-Oe3_4_i;*A L{q竪޹dGR__ϝp;NjG[B0oA P ζ'Zq…5{rp"칭k-aL;r J!;A;1 Ӄ|ڳW[MQD3fz[M厎3jGASU EQiaxun:sN[~BHwe/xc}(\zS ;;A>B mغYv\U=h:HUA*; ط_ks]G78A ; uaX~\: P>gZu*b J '}yrZef4A4MAH0zsY05=^᷂Ύ높d`0wwL//@b(A:?s:sh D*0h9|0gΣ~ƒ f 2 »߇[jn. A6 t1OH,6.Ȥk U'9<}JQ1 c DJI]A øˎ3($Acxx;mix OgNx~  AAAAAAAAAAA R( 'IENDB`gx/gui/menu.c000664 001750 001750 00000416071 12702465756 014243 0ustar00sergiosergio000000 000000 /**************************************************************************** * menu.c * * Genesis Plus GX menu * * Copyright Eke-Eke (2009-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #include "gui.h" #include "filesel.h" #include "cheats.h" #include "file_load.h" #include "file_slot.h" #ifdef HW_RVL #include #endif #include #include /* Credits */ extern const u8 Bg_credits_png[]; /* Main menu */ extern const u8 Main_load_png[]; extern const u8 Main_options_png[]; extern const u8 Main_quit_png[]; extern const u8 Main_file_png[]; extern const u8 Main_reset_png[]; extern const u8 Main_cheats_png[]; extern const u8 Main_showinfo_png[]; extern const u8 Main_takeshot_png[]; #ifdef HW_RVL extern const u8 Main_play_wii_png[]; #else extern const u8 Main_play_gcn_png[]; #endif /* Options menu */ extern const u8 Option_menu_png[]; extern const u8 Option_ctrl_png[]; extern const u8 Option_sound_png[]; extern const u8 Option_video_png[]; extern const u8 Option_system_png[]; /* Load ROM menu */ extern const u8 Load_recent_png[]; extern const u8 Load_md_png[]; extern const u8 Load_ms_png[]; extern const u8 Load_gg_png[]; extern const u8 Load_sg_png[]; extern const u8 Load_cd_png[]; /* Save Manager menu */ extern const u8 Button_load_png[]; extern const u8 Button_load_over_png[]; extern const u8 Button_save_png[]; extern const u8 Button_save_over_png[]; extern const u8 Button_special_png[]; extern const u8 Button_special_over_png[]; extern const u8 Button_delete_png[]; extern const u8 Button_delete_over_png[]; /* Controller Settings */ extern const u8 Ctrl_4wayplay_png[]; extern const u8 Ctrl_gamepad_png[]; extern const u8 Ctrl_justifiers_png[]; extern const u8 Ctrl_menacer_png[]; extern const u8 Ctrl_mouse_png[]; extern const u8 Ctrl_xe_1ap_png[]; extern const u8 Ctrl_activator_png[]; extern const u8 Ctrl_lightphaser_png[]; extern const u8 Ctrl_paddle_png[]; extern const u8 Ctrl_sportspad_png[]; extern const u8 Ctrl_none_png[]; extern const u8 Ctrl_teamplayer_png[]; extern const u8 Ctrl_mastertap_png[]; extern const u8 Ctrl_graphic_board_png[]; extern const u8 Ctrl_pad_auto_png[]; extern const u8 Ctrl_pad2b_png[]; extern const u8 Ctrl_pad3b_png[]; extern const u8 Ctrl_pad6b_png[]; extern const u8 Ctrl_config_png[]; extern const u8 ctrl_option_off_png[]; extern const u8 ctrl_option_on_png[]; extern const u8 ctrl_gamecube_png[]; #ifdef HW_RVL extern const u8 ctrl_classic_png[]; extern const u8 ctrl_nunchuk_png[]; extern const u8 ctrl_wiimote_png[]; #endif /* Generic images */ extern const u8 Button_sm_blue_png[]; extern const u8 Button_sm_grey_png[]; extern const u8 Button_sm_yellow_png[]; /* Exit callback */ void (*reload)(void); /*****************************************************************************/ /* Specific Menu Callbacks */ /*****************************************************************************/ static void ctrlmenu_cb(void); static void savemenu_cb(void); static void mainmenu_cb(void); /*****************************************************************************/ /* Generic Buttons data */ /*****************************************************************************/ static butn_data arrow_up_data = { {NULL,NULL}, {Button_up_png,Button_up_over_png} }; static butn_data arrow_down_data = { {NULL,NULL}, {Button_down_png,Button_down_over_png} }; static butn_data button_text_data = { {NULL,NULL}, {Button_text_png,Button_text_over_png} }; static butn_data button_icon_data = { {NULL,NULL}, {Button_icon_png,Button_icon_over_png} }; static butn_data button_icon_sm_data = { {NULL,NULL}, {Button_icon_sm_png,Button_icon_sm_over_png} }; static butn_data button_player_data = { {NULL,NULL}, {Button_sm_blue_png,Button_sm_yellow_png} }; static butn_data button_player_none_data = { {NULL,NULL}, {Button_sm_grey_png,NULL} }; static butn_data button_load_data = { {NULL,NULL}, {Button_load_png,Button_load_over_png} }; static butn_data button_save_data = { {NULL,NULL}, {Button_save_png,Button_save_over_png} }; static butn_data button_special_data = { {NULL,NULL}, {Button_special_png,Button_special_over_png} }; static butn_data button_delete_data = { {NULL,NULL}, {Button_delete_png,Button_delete_over_png} }; /*****************************************************************************/ /* Generic GUI items */ /*****************************************************************************/ static gui_item action_cancel = { NULL,Key_B_png,"","Back",10,422,28,28 }; static gui_item action_select = { NULL,Key_A_png,"","",602,422,28,28 }; /*****************************************************************************/ /* GUI backgrounds images */ /*****************************************************************************/ static gui_image bg_main[] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_main_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,340,640,140,255}, {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,202,362,232,56,255} }; static gui_image bg_misc[] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255} }; static gui_image bg_ctrls[] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, {NULL,Frame_s2_png,IMAGE_VISIBLE,38,72,316,168,128}, {NULL,Frame_s2_png,IMAGE_VISIBLE,38,242,316,168,128}, {NULL,Frame_s3_png,IMAGE_SLIDE_RIGHT,400,134,292,248,128} }; static gui_image bg_list[] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,76} }; static gui_image bg_saves[] = { {NULL,NULL,0,0,0,0,0,255}, {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255}, {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,76}, {NULL,Frame_s1_png,IMAGE_SLIDE_RIGHT,468,108,372,296,76} }; /*****************************************************************************/ /* Menu Items description */ /*****************************************************************************/ /* Main menu */ static gui_item items_main[] = { {NULL,Main_load_png ,"","",114,162,80,92}, {NULL,Main_options_png ,"","",290,166,60,88}, {NULL,Main_quit_png ,"","",460,170,52,84}, {NULL,Main_file_png ,"","",114,216,80,92}, {NULL,Main_reset_png ,"","",294,227,52,80}, {NULL,Main_cheats_png ,"","",454,218,64,92}, {NULL,NULL ,"","", 10,334,84,32}, #ifdef HW_RVL {NULL,Main_play_wii_png,"","", 10,372,84,32}, #else {NULL,Main_play_gcn_png,"","", 10,372,84,32}, #endif {NULL,Main_takeshot_png,"","",546,334,84,32}, {NULL,Main_showinfo_png,"","",546,372,84,32} }; /* Controllers menu */ static gui_item items_ctrls[] = { {NULL,NULL,"","", 0, 0, 0, 0}, {NULL,NULL,"","", 0, 0, 0, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","",305, 0, 24, 0}, {NULL,NULL,"","", 0, 0, 0, 0}, {NULL,NULL,"","", 0, 0, 0, 0}, {NULL,Ctrl_config_png,"Keys\nConfig","Configure Controller Keys",530,306,32,32} }; /* Load menu */ static gui_item items_load[] = { {NULL,Load_recent_png,"","Load recently played games", 119,144,72, 92}, {NULL,Load_md_png, "","Load Mega Drive/Genesis games", 278,141,84, 92}, {NULL,Load_cd_png, "","Load Sega/Mega CD games", 454,141,64, 92}, {NULL,Load_ms_png, "","Load Master System games", 114,284,84, 96}, {NULL,Load_gg_png, "","Load Game Gear games", 278,283,84,100}, {NULL,Load_sg_png, "","Load SG-1000 games", 454,281,64, 96} }; /* Option menu */ static gui_item items_options[] = { {NULL,Option_system_png,"","System settings", 114,142,80,92}, {NULL,Option_video_png, "","Video settings", 288,150,64,84}, {NULL,Option_sound_png, "","Audio settings", 464,154,44,80}, {NULL,Option_ctrl_png, "","Controllers settings", 192,286,88,92}, {NULL,Option_menu_png, "","Menu settings", 370,286,60,92} }; /* Audio options */ static gui_item items_audio[] = { {NULL,NULL,"Master System FM: AUTO", "Enable/disable YM2413 chip", 56,132,276,48}, {NULL,NULL,"High-Quality FM: ON", "Adjust YM2612/YM2413 resampling quality", 56,132,276,48}, {NULL,NULL,"FM Resolution: MAX", "Adjust YM2612 DAC precision", 56,132,276,48}, {NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 output level", 56,132,276,48}, {NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output level", 56,132,276,48}, {NULL,NULL,"PSG Noise Boost: OFF", "Boost SN76489 Noise Channel", 56,132,276,48}, {NULL,NULL,"Audio Out: STEREO", "Select audio mixing output type", 56,132,276,48}, {NULL,NULL,"Filtering: 3-BAND EQ", "Setup Audio filtering", 56,132,276,48}, {NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Band Gain", 56,132,276,48}, {NULL,NULL,"Mid Gain: 1.00", "Adjust EQ Mid Band Gain", 56,132,276,48}, {NULL,NULL,"High Gain: 1.00", "Adjust EQ High Band Gain", 56,132,276,48}, {NULL,NULL,"Low Freq: 200 Hz", "Adjust EQ Lowest Frequency", 56,132,276,48}, {NULL,NULL,"High Freq: 20000 Hz", "Adjust EQ Highest Frequency", 56,132,276,48} }; /* System ROM paths */ static gui_item items_rompaths[] = { {NULL,NULL,"CD BIOS (USA): NOT FOUND", "Select Sega CD (USA) BIOS", 56,132,276,48}, {NULL,NULL,"CD BIOS (PAL): NOT FOUND", "Select Mega CD (PAL) BIOS", 56,132,276,48}, {NULL,NULL,"CD BIOS (JAP): NOT FOUND", "Select Mega CD (JAP) BIOS", 56,132,276,48}, {NULL,NULL,"MD BIOS (TMSS): NOT FOUND", "Select Mega Drive / Genesis BootROM", 56,132,276,48}, {NULL,NULL,"MS BIOS (USA): NOT FOUND", "Select Master System (USA) BootROM", 56,132,276,48}, {NULL,NULL,"MS BIOS (PAL): NOT FOUND", "Select Master System (PAL) BootROM", 56,132,276,48}, {NULL,NULL,"MS BIOS (JAP): NOT FOUND", "Select Master System (JAP) BootROM", 56,132,276,48}, {NULL,NULL,"Game Gear BIOS: NOT FOUND", "Select Game Gear BootROM", 56,132,276,48}, {NULL,NULL,"Game Genie: NOT FOUND", "Select Game Genie ROM", 56,132,276,48}, {NULL,NULL,"Action Replay: NOT FOUND", "Select Action Replay (Pro) ROM", 56,132,276,48}, {NULL,NULL,"S&K (2MB ROM): NOT FOUND", "Select Sonic & Knuckle main ROM", 56,132,276,48}, {NULL,NULL,"S2&K (256K ROM): NOT FOUND","Select Sonic 2 & Knuckle upmem ROM", 56,132,276,48}, }; /* System options */ static gui_item items_system[] = { {NULL,NULL,"Console Hardware: AUTO", "Select system hardware model", 56,132,276,48}, {NULL,NULL,"Console Region: AUTO", "Select system region", 56,132,276,48}, {NULL,NULL,"VDP Mode: AUTO", "Select VDP mode", 56,132,276,48}, {NULL,NULL,"System Clock: AUTO", "Select system clock frequency", 56,132,276,48}, {NULL,NULL,"System Boot: BIOS&CART", "Select system booting method", 56,132,276,48}, {NULL,NULL,"System Lockups: ON", "Enable/disable original system lock-ups", 56,132,276,48}, {NULL,NULL,"68k Address Error: ON", "Enable/disable 68k address error exceptions", 56,132,276,48}, {NULL,NULL,"Lock-on: OFF", "Select Lock-On cartridge type", 56,132,276,48}, {NULL,NULL,"Cartridge Swap: OFF", "Enable/disable cartridge hot swap", 56,132,276,48}, {NULL,NULL,"BIOS & Lock-On ROM paths","Configure BIOS & Lock-On ROM paths", 56,132,276,48}, {NULL,NULL,"SVP Cycles: 1500", "Adjust SVP chip emulation speed", 56,132,276,48} }; /* Video options */ static gui_item items_video[] = { {NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, {NULL,NULL,"TV mode: 50/60HZ", "Select video refresh rate", 56,132,276,48}, {NULL,NULL,"VSYNC: AUTO", "Enable/disable sync with video hardware", 56,132,276,48}, {NULL,NULL,"Bilinear Filter: OFF", "Enable/disable GX hardware texture filtering", 56,132,276,48}, {NULL,NULL,"Deflickering Filter: AUTO", "Enable/disable GX hardware framebuffer filtering", 56,132,276,48}, #ifdef HW_RVL {NULL,NULL,"Trap Filter: ON", "Enable/disable VI hardware composite out filtering",56,132,276,48}, {NULL,NULL,"Gamma Correction: 1.0", "Adjust VI hardware gamma correction", 56,132,276,48}, #endif {NULL,NULL,"LCD Ghosting Filter: OFF", "Enable/disable software LCD image persistence", 56,132,276,48}, {NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable software NTSC filtering", 56,132,276,48}, {NULL,NULL,"NTSC Sharpness: 0.0", "Adjust edge contrast enhancement/blurring", 56,132,276,48}, {NULL,NULL,"NTSC Resolution: 0.0", "Adjust image resolution", 56,132,276,48}, {NULL,NULL,"NTSC Artifacts: 0.0", "Adjust artifacts caused by color changes", 56,132,276,48}, {NULL,NULL,"NTSC Color Bleed: 0.0", "Adjust color resolution reduction", 56,132,276,48}, {NULL,NULL,"NTSC Color Fringing: 0.0", "Adjust artifacts caused by brightness changes", 56,132,276,48}, {NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48}, {NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48}, {NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48}, {NULL,NULL,"Screen Position (+0,+0)", "Adjust display position", 56,132,276,48}, {NULL,NULL,"Screen Scaling (+0,+0)", "Adjust display scaling", 56,132,276,48} }; /* Menu options */ static gui_item items_prefs[] = { {NULL,NULL,"Auto ROM Load: OFF", "Enable/disable automatic ROM loading on startup", 56,132,276,48}, {NULL,NULL,"Auto Cheats: OFF", "Enable/disable automatic cheats activation", 56,132,276,48}, {NULL,NULL,"Auto Saves: OFF", "Enable/disable automatic saves", 56,132,276,48}, {NULL,NULL,"ROM Load Device: SD", "Configure default device for ROM files", 56,132,276,48}, {NULL,NULL,"Saves Device: FAT", "Configure default device for Save files", 56,132,276,48}, {NULL,NULL,"SFX Volume: 100", "Adjust sound effects volume", 56,132,276,48}, {NULL,NULL,"BGM Volume: 100", "Adjust background music volume", 56,132,276,48}, {NULL,NULL,"BG Overlay: ON", "Enable/disable background overlay", 56,132,276,48}, {NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48}, {NULL,NULL,"Show CD Leds: OFF", "Enable/disable CD leds display", 56,132,276,48}, {NULL,NULL,"Show FPS: OFF", "Enable/disable FPS counter", 56,132,276,48}, #ifdef HW_RVL {NULL,NULL,"Wiimote Timeout: OFF","Enable/disable Wii remote automatic shutodwn", 56,132,276,48}, {NULL,NULL,"Wiimote Calibration: AUTO","Calibrate Wii remote pointer", 56,132,276,48}, #endif }; /* Save Manager */ static gui_item items_saves[] = { {NULL,NULL,"","" ,0,0,0,0}, {NULL,NULL,"","" ,0,0,0,0}, {NULL,NULL,"","" ,0,0,0,0}, {NULL,NULL,"","" ,0,0,0,0}, {NULL,NULL,"","" ,0,0,0,0}, {NULL,NULL,"","Load file" ,0,0,0,0}, {NULL,NULL,"","Set as default file",0,0,0,0}, {NULL,NULL,"","Delete file" ,0,0,0,0}, {NULL,NULL,"","Save file" ,0,0,0,0} }; /*****************************************************************************/ /* Menu Buttons description */ /*****************************************************************************/ /* Generic Buttons for list menu */ static gui_butn arrow_up = {&arrow_up_data,BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; static gui_butn arrow_down = {&arrow_down_data,BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; /* Generic list menu */ static gui_butn buttons_list[] = { {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,132,276,48}, {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,188,276,48}, {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,244,276,48}, {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,300,276,48} }; /* Main menu */ static gui_butn buttons_main[] = { {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,0,1}, 80,140,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,1,1},246,140,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,1,0},412,140,148,132}, {&button_icon_data, BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,4,0,1}, 80,194,148,132}, {&button_icon_data, BUTTON_OVER_SFX ,{3,4,1,1},246,194,148,132}, {&button_icon_data, BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,3,1,0},412,194,148,132}, {NULL , BUTTON_OVER_SFX ,{3,1,0,2}, 10,334, 84, 32}, {NULL , BUTTON_OVER_SFX ,{4,0,0,2}, 10,372, 84, 32}, {NULL , BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,1,1,0},546,334, 84, 32}, {NULL , BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,2,0},546,372, 84, 32} }; /* Controllers Menu */ static gui_butn buttons_ctrls[] = { {&button_icon_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX ,{0,1,0,2}, 60, 88,148,132}, {&button_icon_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX ,{1,0,0,5}, 60,258,148,132}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,1,2,0},250, 79, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,3,0},250,117, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,4,0},250,155, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,5,0},250,193, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,5,0},250,249, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,6,0},250,287, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,7,0},250,325, 84, 32}, {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,8,0},250,363, 84, 32}, {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX ,{0,1,1,0},436,168,160, 52}, {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX ,{1,1,0,0},436,232,160, 52}, {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX|BUTTON_SELECT_SFX ,{1,0,0,0},436,296,160, 52} }; /* Load Game menu */ static gui_butn buttons_load[] = { {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,0,1}, 80,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,1},246,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,0},412,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,0,1}, 80,264,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,1},246,264,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,0},412,264,148,132} }; /* Options menu */ static gui_butn buttons_options[] = { {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,0,1}, 80,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,1},246,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,1,1},412,120,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,1},162,264,148,132}, {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,0,1,0},330,264,148,132} }; /* Save Manager Menu */ static gui_butn buttons_saves[] = { {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,1,0,0}, 56,102,276,48}, {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,158,276,48}, {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,214,276,48}, {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,270,276,48}, {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,0,0,0}, 56,326,276,48}, {&button_load_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,1,0,0},530,130, 56,56}, {&button_special_data,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,1,0,0},530,196, 56,56}, {&button_delete_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,1,0,0},530,262, 56,56}, {&button_save_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,0,0,0},530,328, 56,56} }; /*****************************************************************************/ /* Menu descriptions */ /*****************************************************************************/ /* Main menu */ static gui_menu menu_main = { "", 0,0, 10,10,4,0, items_main, buttons_main, bg_main, {NULL,NULL}, {NULL,NULL}, NULL }; /* Main menu */ gui_menu menu_ctrls = { "Controller Settings", 0,0, 13,13,8,0, items_ctrls, buttons_ctrls, bg_ctrls, {&action_cancel, &action_select}, {NULL,NULL}, ctrlmenu_cb }; /* Load Game menu */ static gui_menu menu_load = { "Load Game", 0,0, 6,6,5,0, items_load, buttons_load, bg_misc, {&action_cancel, &action_select}, {NULL,NULL}, NULL }; /* Options menu */ static gui_menu menu_options = { "Settings", 0,0, 5,5,5,0, items_options, buttons_options, bg_misc, {&action_cancel, &action_select}, {NULL,NULL}, NULL }; /* System ROM Path submenu */ static gui_menu menu_rompaths = { "System ROM Paths", 0,0, 12,4,6,0, items_rompaths, buttons_list, bg_list, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, NULL }; /* System Options menu */ static gui_menu menu_system = { "System Settings", 0,0, 0,4,6,0, items_system, buttons_list, bg_list, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, NULL }; /* Video Options menu */ static gui_menu menu_video = { "Video Settings", 0,0, 0,4,6,0, items_video, buttons_list, bg_list, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, NULL }; /* Sound Options menu */ static gui_menu menu_audio = { "Audio Settings", 0,0, 0,4,6,0, items_audio, buttons_list, bg_list, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, NULL }; /* Sound Options menu */ static gui_menu menu_prefs = { "Menu Settings", 0,0, 0,4,6,0, items_prefs, buttons_list, bg_list, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, NULL }; /* Save Manager menu */ static gui_menu menu_saves = { "Save Manager", 0,0, 9,9,8,0, items_saves, buttons_saves, bg_saves, {&action_cancel, &action_select}, {NULL,NULL}, savemenu_cb }; /**************************************************************************** * GUI Settings menu * ****************************************************************************/ static void update_screen_w(void) { vmode->viWidth = config.screen_w; vmode->viXOrigin = (VI_MAX_WIDTH_NTSC -config.screen_w)/2; VIDEO_Configure(vmode); VIDEO_Flush(); } static void update_bgm(void) { SetVolumeOgg(((int)config.bgm_volume * 255) / 100); } static void prefmenu () { int ret, quit = 0; gui_menu *m = &menu_prefs; gui_item *items = m->items; sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF"); sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF"); if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL"); else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY"); else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY"); else sprintf (items[2].text, "Auto Saves: NONE"); #ifdef HW_RVL if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB"); else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD"); #else if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD"); #endif else sprintf (items[3].text, "ROM Load Device: SD"); if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A"); else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B"); else sprintf (items[4].text, "Saves Device: FAT"); sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume); sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume); sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF"); sprintf (items[8].text, "Screen Width: %d", config.screen_w); sprintf (items[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF"); sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); #ifdef HW_RVL sprintf (items[11].text, "Wiimote Timeout: %s", config.autosleep ? "5 MIN":"30 MIN"); sprintf (items[12].text, "Wiimote Calibration: %s", ((config.calx * config.caly) != 0) ? "MANUAL":"AUTO"); sprintf (items[12].comment, "%s", ((config.calx * config.caly) != 0) ? "Reset default Wii remote pointer calibration":"Calibrate Wii remote pointer"); m->max_items = 13; #else m->max_items = 11; #endif GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("Menu ")); while (quit == 0) { ret = GUI_RunMenu(m); switch (ret) { case 0: /* Auto load last ROM file on startup */ config.autoload ^= 1; sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF"); break; case 1: /* Cheats automatic activation */ config.autocheat ^= 1; sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF"); break; case 2: /*** Auto load/save STATE & SRAM files ***/ config.s_auto = (config.s_auto + 1) % 4; if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL"); else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY"); else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY"); else sprintf (items[2].text, "Auto Saves: NONE"); break; case 3: /*** Default ROM device ***/ #ifdef HW_RVL config.l_device = (config.l_device + 1) % 3; if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB"); else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD"); #else config.l_device ^= 1; if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD"); #endif else sprintf (items[3].text, "ROM Load Device: SD"); break; case 4: /*** Default saves device ***/ config.s_device = (config.s_device + 1) % 3; if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A"); else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B"); else sprintf (items[4].text, "Saves Device: FAT"); break; case 5: /*** Sound effects volume ***/ GUI_OptionBox(m,0,"SFX Volume",(void *)&config.sfx_volume,10.0,0.0,100.0,0); sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume); break; case 6: /*** Background music volume ***/ GUI_OptionBox(m,update_bgm,"BGM Volume",(void *)&config.bgm_volume,10.0,0.0,100.0,0); sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume); break; case 7: /*** Background overlay ***/ config.bg_overlay ^= 1; if (config.bg_overlay) { bg_main[1].state |= IMAGE_VISIBLE; bg_misc[1].state |= IMAGE_VISIBLE; bg_ctrls[1].state |= IMAGE_VISIBLE; bg_list[1].state |= IMAGE_VISIBLE; bg_saves[2].state |= IMAGE_VISIBLE; sprintf (items[7].text, "BG Overlay: ON"); } else { bg_main[1].state &= ~IMAGE_VISIBLE; bg_misc[1].state &= ~IMAGE_VISIBLE; bg_ctrls[1].state &= ~IMAGE_VISIBLE; bg_list[1].state &= ~IMAGE_VISIBLE; bg_saves[2].state &= ~IMAGE_VISIBLE; sprintf (items[7].text, "BG Overlay: OFF"); } break; case 8: /*** Screen Width ***/ GUI_OptionBox(m,update_screen_w,"Screen Width",(void *)&config.screen_w,2,640,VI_MAX_WIDTH_NTSC,1); sprintf (items[8].text, "Screen Width: %d", config.screen_w); break; case 9: /*** CD LEDS ***/ config.cd_leds ^= 1; sprintf (items[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF"); break; case 10: /*** FPS counter ***/ config.fps ^= 1; sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); break; #ifdef HW_RVL case 11: /*** Wii remote auto switch-off ***/ config.autosleep ^= 1; sprintf (items[11].text, "Wiimote Timeout: %s", config.autosleep ? "5min":"30min"); WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800); break; case 12: /*** Wii remote pointer calibration ***/ if ((config.calx * config.caly) == 0) { if (GUI_WaitConfirm("Pointer Calibration","Aim center of TV screen")) { sprintf (items[12].text, "Wiimote Calibration: MANUAL"); sprintf (items[12].comment, "Reset default Wii remote pointer calibration"); config.calx = 320 - m_input.ir.x; config.caly = 240 - m_input.ir.y; m_input.ir.x = 320; m_input.ir.y = 240; } } else { sprintf (items[12].text, "Wiimote Calibration: AUTO"); sprintf (items[12].comment, "Calibrate Wii remote pointer"); config.calx = config.caly = 0; } break; #endif case -1: quit = 1; break; } } /* stop DVD drive when not in use */ if (config.l_device != 2) { #ifdef HW_RVL DI_StopMotor(); #else vu32* const dvd = (u32*)0xCC006000; dvd[0] = 0x2e; dvd[1] = 0; dvd[2] = 0xe3000000; dvd[3] = 0; dvd[4] = 0; dvd[5] = 0; dvd[6] = 0; dvd[7] = 1; while (dvd[7] & 1); #endif } GUI_DeleteMenu(m); } /**************************************************************************** * Audio Settings menu * ****************************************************************************/ static void soundmenu () { int ret, quit = 0; float fm_volume = (float)config.fm_preamp/100.0; float psg_volume = (float)config.psg_preamp/100.0; gui_menu *m = &menu_audio; gui_item *items = m->items; if (config.ym2413 == 0) sprintf (items[0].text, "Master System FM: OFF"); else if (config.ym2413 == 1) sprintf (items[0].text, "Master System FM: ON"); else sprintf (items[0].text, "Master System FM: AUTO"); if (config.hq_fm) sprintf (items[1].text, "High-Quality FM: ON"); else sprintf (items[1].text, "High-Quality FM: OFF"); if (config.dac_bits < 14) sprintf (items[2].text, "FM Resolution: %d bits", config.dac_bits); else sprintf (items[2].text, "FM Resolution: MAX"); sprintf (items[3].text, "FM Volume: %1.2f", fm_volume); sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume); sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF"); sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); if (config.filter == 2) { float lg = (float)config.lg/100.0; float mg = (float)config.mg/100.0; float hg = (float)config.hg/100.0; sprintf(items[7].text, "Filtering: 3-BAND EQ"); sprintf(items[8].text, "Low Gain: %1.2f", lg); strcpy(items[8].comment, "Adjust EQ Low Band Gain"); sprintf(items[9].text, "Middle Gain: %1.2f", mg); sprintf(items[10].text, "High Gain: %1.2f", hg); sprintf(items[11].text, "Low Freq: %d", config.low_freq); sprintf(items[12].text, "High Freq: %d", config.high_freq); m->max_items = 13; } else if (config.filter == 1) { int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; sprintf (items[7].text, "Filtering: LOW-PASS"); sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); strcpy (items[8].comment, "Adjust Low Pass filter"); m->max_items = 9; } else { sprintf (items[7].text, "Filtering: OFF"); m->max_items = 8; } GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("Audio ")); while (quit == 0) { ret = GUI_RunMenu(m); switch (ret) { case 0: { config.ym2413++; if (config.ym2413 > 2) config.ym2413 = 0; if (config.ym2413 == 0) sprintf (items[0].text, "Master System FM: OFF"); else if (config.ym2413 == 1) sprintf (items[0].text, "Master System FM: ON"); else sprintf (items[0].text, "Master System FM: AUTO"); /* Automatic detection */ if ((config.ym2413 & 2) && system_hw && ((system_hw & SYSTEM_PBC) != SYSTEM_MD)) { /* detect if game is using YM2413 */ sms_cart_init(); /* restore SRAM */ slot_autoload(0,config.s_device); } break; } case 1: { config.hq_fm ^= 1; if (config.hq_fm) sprintf (items[1].text, "High-Quality FM: ON"); else sprintf (items[1].text, "High-Quality FM: OFF"); break; } case 2: { config.dac_bits++; if (config.dac_bits > 14) config.dac_bits = 7; if (config.dac_bits < 14) sprintf (items[2].text, "FM Resolution: %d bits", config.dac_bits); else sprintf (items[2].text, "FM Resolution: MAX"); YM2612Config(config.dac_bits); break; } case 3: { GUI_OptionBox(m,0,"FM Volume",(void *)&fm_volume,0.01,0.0,5.0,0); sprintf (items[3].text, "FM Volume: %1.2f", fm_volume); config.fm_preamp = (int)(fm_volume * 100.0 + 0.5); break; } case 4: { GUI_OptionBox(m,0,"PSG Volume",(void *)&psg_volume,0.01,0.0,5.0,0); sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume); config.psg_preamp = (int)(psg_volume * 100.0 + 0.5); if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); } else { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]); } break; } case 5: { config.psgBoostNoise ^= 1; sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF"); if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); } else { SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]); } break; } case 6: { config.mono ^= 1; sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); break; } case 7: { config.filter = (config.filter + 1) % 3; if (config.filter == 2) { float lg = (float)config.lg/100.0; sprintf (items[7].text, "Filtering: 3-BAND EQ"); sprintf (items[8].text, "Low Gain: %1.2f", lg); strcpy (items[8].comment, "Adjust EQ Low Band Gain"); m->max_items = 13; audio_set_equalizer(); } else if (config.filter == 1) { int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; sprintf (items[7].text, "Filtering: LOW-PASS"); sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); strcpy (items[8].comment, "Adjust Low Pass filter"); m->max_items = 9; } else { sprintf (items[7].text, "Filtering: OFF"); m->max_items = 8; } while ((m->offset + 4) > m->max_items) { m->offset--; m->selected++; } break; } case 8: { if (config.filter == 1) { int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; GUI_OptionBox(m,0,"Low-Pass Rate (%)",(void *)&lp_range,1,0,100,1); sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); config.lp_range = (lp_range * 0x10000) / 100; } else { float lg = (float)config.lg/100.0; GUI_OptionBox(m,0,"Low Gain",(void *)&lg,0.01,0.0,2.0,0); sprintf (items[8].text, "Low Gain: %1.2f", lg); config.lg = (int)(lg * 100.0); audio_set_equalizer(); } break; } case 9: { float mg = (float)config.mg/100.0; GUI_OptionBox(m,0,"Middle Gain",(void *)&mg,0.01,0.0,2.0,0); sprintf (items[9].text, "Middle Gain: %1.2f", mg); config.mg = (int)(mg * 100.0); audio_set_equalizer(); break; } case 10: { float hg = (float)config.hg/100.0; GUI_OptionBox(m,0,"High Gain",(void *)&hg,0.01,0.0,2.0,0); sprintf (items[10].text, "High Gain: %1.2f", hg); config.hg = (int)(hg * 100.0); audio_set_equalizer(); break; } case 11: { GUI_OptionBox(m,0,"Low Frequency",(void *)&config.low_freq,10,0,config.high_freq,1); sprintf (items[11].text, "Low Freq: %d", config.low_freq); audio_set_equalizer(); break; } case 12: { GUI_OptionBox(m,0,"High Frequency",(void *)&config.high_freq,100,config.low_freq,30000,1); sprintf (items[12].text, "High Freq: %d", config.high_freq); audio_set_equalizer(); break; } case -1: { quit = 1; break; } } } GUI_DeleteMenu(m); } /**************************************************************************** * System ROM paths menu * ****************************************************************************/ static void rompathmenu () { FILE *f; int i, ret; gui_menu *m = &menu_rompaths; gui_item *items = m->items; for (i=0; i<12; i++) { f = fopen(config.sys_rom[i],"rb"); if (f) { strcpy(strstr(items[i].text,":") + 2, "FOUND"); fclose(f); } else { strcpy(strstr(items[i].text,":") + 2, "NOT FOUND"); } } GUI_InitMenu(m); while (1) { ret = GUI_RunMenu(m); if (ret < 0) { GUI_DeleteMenu(m); return; } /* Initialize System ROM browser */ if (OpenDirectory(config.l_device, ret + FILETYPE_MAX)) { /* Get current System ROM path */ char *dir = GetCurrentDirectory(); /* Open System ROM browser */ GUI_DeleteMenu(m); i = FileSelector(ret + FILETYPE_MAX); /* System ROM selected ? */ if (i >= 0) { /* full System ROM pathname */ sprintf(config.sys_rom[ret],"%s%s",dir,filelist[i].filename); /* mark System ROM as found */ strcpy(strstr(items[ret].text,":") + 2, "FOUND"); /* BOOT ROM special cases */ switch (ret) { case 0: case 1: case 2: { /* force CD BOOT ROM reloading */ system_bios &= ~0x10; break; } case 3: { /* Genesis BOOT ROM must be reloaded */ if (load_archive(MD_BIOS, boot_rom, 0x800, NULL) > 0) { /* check if BOOT ROM header is valid */ if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) { /* mark Genesis BOOT ROM as loaded */ system_bios |= SYSTEM_MD; } else { /* mark Genesis BOOT ROM as unloaded */ system_bios &= ~SYSTEM_MD; } } break; } case 4: case 5: case 6: { /* force Master System BOOT ROM reloading */ system_bios &= ~SYSTEM_SMS; break; } case 7: { /* force Game Gear BOOT ROM reloading */ system_bios &= ~SYSTEM_GG; break; } default: { /* not a BOOT ROM */ break; } } } free(dir); GUI_InitMenu(m); } } } /**************************************************************************** * System Settings menu * ****************************************************************************/ static const uint16 vc_table[4][2] = { /* NTSC, PAL */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0xEA , 0x102}, /* Mode 5 (224 lines) */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0x106, 0x10A} /* Mode 5 (240 lines) */ }; static void systemmenu () { int ret, quit = 0; int reinit = 0; gui_menu *m = &menu_system; gui_item *items = m->items; if (config.system == 0) sprintf (items[0].text, "Console Type: AUTO"); else if (config.system == SYSTEM_SG) sprintf (items[0].text, "Console Type: SG-1000"); else if (config.system == SYSTEM_SGII) sprintf (items[0].text, "Console Type: SG-1000 II"); else if (config.system == SYSTEM_MARKIII) sprintf (items[0].text, "Console Type: MARK-III"); else if (config.system == SYSTEM_SMS) sprintf (items[0].text, "Console Type: SMS"); else if (config.system == SYSTEM_SMS2) sprintf (items[0].text, "Console Type: SMS II"); else if (config.system == SYSTEM_GG) sprintf (items[0].text, "Console Type: GG"); else if (config.system == SYSTEM_MD) sprintf (items[0].text, "Console Type: MD"); if (config.region_detect == 0) sprintf (items[1].text, "Console Region: AUTO"); else if (config.region_detect == 1) sprintf (items[1].text, "Console Region: USA"); else if (config.region_detect == 2) sprintf (items[1].text, "Console Region: PAL"); else if (config.region_detect == 3) sprintf (items[1].text, "Console Region: JAP"); if (config.vdp_mode == 0) sprintf (items[2].text, "VDP Mode: AUTO"); else if (config.vdp_mode == 1) sprintf (items[2].text, "VDP Mode: NTSC"); else if (config.vdp_mode == 2) sprintf (items[2].text, "VDP Mode: PAL"); if (config.master_clock == 0) sprintf (items[3].text, "System Clock: AUTO"); else if (config.master_clock == 1) sprintf (items[3].text, "System Clock: NTSC"); else if (config.master_clock == 2) sprintf (items[3].text, "System Clock: PAL"); sprintf (items[4].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART" : "BIOS ONLY") : "CART"); sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON"); sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); if (config.lock_on == TYPE_GG) sprintf (items[7].text, "Lock-On: GAME GENIE"); else if (config.lock_on == TYPE_AR) sprintf (items[7].text, "Lock-On: ACTION REPLAY"); else if (config.lock_on == TYPE_SK) sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); else sprintf (items[7].text, "Lock-On: OFF"); sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); if (svp) { sprintf (items[10].text, "SVP Cycles: %d", SVP_cycles); m->max_items = 11; } else { m->max_items = 10; } GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("System ")); while (quit == 0) { ret = GUI_RunMenu(m); switch (ret) { case 0: /*** Force System Hardware ***/ { if (config.system == SYSTEM_MD) { config.system = 0; sprintf (items[0].text, "Console Type: AUTO"); /* Default system hardware (auto) */ if (system_hw) system_hw = romtype; } else if (config.system == 0) { config.system = SYSTEM_SG; sprintf (items[0].text, "Console Type: SG-1000"); if (system_hw) system_hw = SYSTEM_SG; } else if (config.system == SYSTEM_SG) { config.system = SYSTEM_SGII; sprintf (items[0].text, "Console Type: SG-1000 II"); if (system_hw) system_hw = SYSTEM_SGII; } else if (config.system == SYSTEM_SGII) { config.system = SYSTEM_MARKIII; sprintf (items[0].text, "Console Type: MARK-III"); if (system_hw) system_hw = SYSTEM_MARKIII; } else if (config.system == SYSTEM_MARKIII) { config.system = SYSTEM_SMS; sprintf (items[0].text, "Console Type: SMS"); if (system_hw) system_hw = SYSTEM_SMS; } else if (config.system == SYSTEM_SMS) { config.system = SYSTEM_SMS2; sprintf (items[0].text, "Console Type: SMS II"); if (system_hw) system_hw = SYSTEM_SMS2; } else if (config.system == SYSTEM_SMS2) { config.system = SYSTEM_GG; sprintf (items[0].text, "Console Type: GG"); if (romtype == SYSTEM_GG) { /* Game Gear mode */ if (system_hw) system_hw = SYSTEM_GG; } else { /* Game Gear in MS compatibility mode */ if (system_hw) system_hw = SYSTEM_GGMS; } } else if (config.system == SYSTEM_GG) { config.system = SYSTEM_MD; sprintf (items[0].text, "Console Type: MD"); if (romtype & SYSTEM_MD) { /* Default mode */ if (system_hw) system_hw = romtype; } else { /* Mega Drive in MS compatibility mode */ if (system_hw) system_hw = SYSTEM_PBC; } } if (system_hw) { /* restore previous input settings */ if (old_system[0] != -1) { input.system[0] = old_system[0]; } if (old_system[1] != -1) { input.system[1] = old_system[1]; } /* reinitialize audio streams */ audio_init(snd.sample_rate, snd.frame_rate); /* force hard reset */ system_init(); system_reset(); /* restore SRAM */ slot_autoload(0,config.s_device); } break; } case 1: /*** Force Region ***/ { config.region_detect = (config.region_detect + 1) % 4; if (config.region_detect == 0) sprintf (items[1].text, "Console Region: AUTO"); else if (config.region_detect == 1) sprintf (items[1].text, "Console Region: USA"); else if (config.region_detect == 2) sprintf (items[1].text, "Console Region: PAL"); else if (config.region_detect == 3) sprintf (items[1].text, "Console Region: JAP"); /* force system reinitialization + region BIOS */ reinit = 2; break; } case 2: /*** Force VDP mode ***/ { config.vdp_mode = (config.vdp_mode + 1) % 3; if (config.vdp_mode == 0) sprintf (items[2].text, "VDP Mode: AUTO"); else if (config.vdp_mode == 1) sprintf (items[2].text, "VDP Mode: NTSC"); else if (config.vdp_mode == 2) sprintf (items[2].text, "VDP Mode: PAL"); /* force system reinitialization */ reinit = 1; break; } case 3: /*** Force Master Clock ***/ { config.master_clock = (config.master_clock + 1) % 3; if (config.master_clock == 0) sprintf (items[3].text, "System Clock: AUTO"); else if (config.master_clock == 1) sprintf (items[3].text, "System Clock: NTSC"); else if (config.master_clock == 2) sprintf (items[3].text, "System Clock: PAL"); /* force system reinitialization */ reinit = 1; break; } case 4: /*** BIOS support ***/ { if (config.bios == 0) config.bios = 3; else if (config.bios == 3) config.bios = 1; else config.bios = 0; sprintf (items[4].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART " : "BIOS ONLY") : "CART"); if ((system_hw == SYSTEM_MD) || (system_hw & SYSTEM_GG) || (system_hw & SYSTEM_SMS)) { /* force hard reset */ system_init(); system_reset(); /* restore SRAM */ slot_autoload(0,config.s_device); } break; } case 5: /*** force DTACK ***/ { config.force_dtack ^= 1; sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON"); break; } case 6: /*** 68k Address Error ***/ { config.addr_error ^= 1; m68k.aerr_enabled = config.addr_error; sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); break; } case 7: /*** Cart Lock-On ***/ { config.lock_on = (config.lock_on + 1) % (TYPE_SK + 1); if (config.lock_on == TYPE_GG) sprintf (items[7].text, "Lock-On: GAME GENIE"); else if (config.lock_on == TYPE_AR) sprintf (items[7].text, "Lock-On: ACTION REPLAY"); else if (config.lock_on == TYPE_SK) sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); else sprintf (items[7].text, "Lock-On: OFF"); if ((system_hw == SYSTEM_MD) || (system_hw == SYSTEM_PICO)) { /* force hard reset */ system_init(); system_reset(); /* restore SRAM */ slot_autoload(0,config.s_device); /* Action Replay switch */ if (areplay_get_status() < 0) { menu_main.buttons[6].state &= ~(BUTTON_VISIBLE | BUTTON_ACTIVE); menu_main.items[6].data = NULL; menu_main.cb = NULL; menu_main.buttons[3].shift[1] = 4; menu_main.buttons[7].shift[0] = 4; menu_main.buttons[8].shift[2] = 1; } else { menu_main.buttons[6].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); menu_main.items[6].data = Button_sm_grey_png; menu_main.cb = mainmenu_cb; menu_main.buttons[3].shift[1] = 3; menu_main.buttons[7].shift[0] = 1; menu_main.buttons[8].shift[2] = 2; } } break; } case 8: /*** Cartridge Hot Swap ***/ { config.hot_swap ^= 1; sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); break; } case 9: /*** System ROM paths ***/ { GUI_DeleteMenu(m); rompathmenu(); GUI_InitMenu(m); break; } case 10: /*** SVP cycles per line ***/ { GUI_OptionBox(m,0,"SVP Cycles",(void *)&SVP_cycles,1,1,1500,1); sprintf (items[10].text, "SVP Cycles: %d", SVP_cycles); break; } case -1: { quit = 1; break; } } } if (reinit && system_hw) { /* reinitialize console region */ get_region(NULL); /* framerate might have changed, reinitialize audio timings */ audio_init(snd.sample_rate, get_framerate()); /* system with region BIOS should be reinitialized if region code has changed */ if ((reinit & 2) && ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && (config.bios & 1)))) { system_init(); system_reset(); /* restore SRAM */ slot_autoload(0,config.s_device); } else { /* reinitialize I/O region register */ if (system_hw == SYSTEM_MD) { io_reg[0x00] = 0x20 | region_code | (config.bios & 1); } else if (system_hw == SYSTEM_MCD) { io_reg[0x00] = region_code | (config.bios & 1); } else { io_reg[0x00] = 0x80 | (region_code >> 1); } /* reinitialize VDP */ if (vdp_pal) { status |= 1; lines_per_frame = 313; } else { status &= ~1; lines_per_frame = 262; } /* reinitialize VC max value */ switch (bitmap.viewport.h) { case 192: vc_max = vc_table[0][vdp_pal]; break; case 224: vc_max = vc_table[1][vdp_pal]; break; case 240: vc_max = vc_table[3][vdp_pal]; break; } } } GUI_DeleteMenu(m); } /**************************************************************************** * Video Settings menu * ****************************************************************************/ #ifdef HW_RVL #define VI_OFFSET 7 static void update_gamma(void) { VIDEO_SetGamma((int)(config.gamma * 10.0)); VIDEO_Flush(); } #else #define VI_OFFSET 5 #endif static void videomenu () { u16 state[2]; int ret, quit = 0; int reinit = 0; gui_menu *m = &menu_video; gui_item *items = m->items; int ntsc_offset = 0; if (config.render == 1) sprintf (items[0].text,"Display: INTERLACED"); else if (config.render == 2) sprintf (items[0].text, "Display: PROGRESSIVE"); else sprintf (items[0].text, "Display: ORIGINAL"); if (config.tv_mode == 0) sprintf (items[1].text, "TV Mode: 60HZ"); else if (config.tv_mode == 1) sprintf (items[1].text, "TV Mode: 50HZ"); else sprintf (items[1].text, "TV Mode: 50/60HZ"); if (config.vsync) sprintf (items[2].text, "VSYNC: AUTO"); else sprintf (items[2].text, "VSYNC: OFF"); sprintf (items[3].text, "Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); sprintf (items[4].text, "Deflickering Filter: %s", config.vfilter ? "AUTO" : "OFF"); #ifdef HW_RVL sprintf (items[5].text, "Trap Filter: %s", config.trap ? " ON" : "OFF"); sprintf (items[6].text, "Gamma Correction: %1.1f", config.gamma); #endif if (config.lcd > 0) { int ratio = ((config.lcd * 100) + 254) / 255; sprintf (items[VI_OFFSET].text, "LCD Ghosting Filter: %d%%", ratio); } else { sprintf (items[VI_OFFSET].text, "LCD Ghosting Filter: OFF"); } if (config.ntsc == 1) sprintf (items[VI_OFFSET+1].text, "NTSC Filter: COMPOSITE"); else if (config.ntsc == 2) sprintf (items[VI_OFFSET+1].text, "NTSC Filter: S-VIDEO"); else if (config.ntsc == 3) sprintf (items[VI_OFFSET+1].text, "NTSC Filter: RGB"); else if (config.ntsc == 4) { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: MANUAL"); sprintf(items[VI_OFFSET+2].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness); sprintf(items[VI_OFFSET+3].text, "NTSC Resolution: %1.2f", config.ntsc_resolution); sprintf(items[VI_OFFSET+4].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts); sprintf(items[VI_OFFSET+5].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed); sprintf(items[VI_OFFSET+6].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing); strcpy(items[VI_OFFSET+2].comment, "Adjust edge contrast enhancement/blurring"); strcpy(items[VI_OFFSET+3].comment, "Adjust image resolution"); strcpy(items[VI_OFFSET+4].comment, "Adjust artifacts caused by color changes"); strcpy(items[VI_OFFSET+5].comment, "Adjust color resolution reduction"); strcpy(items[VI_OFFSET+6].comment, "Adjust artifacts caused by brightness changes"); ntsc_offset = 5; } else sprintf (items[VI_OFFSET+1].text, "NTSC Filter: OFF"); strcpy(items[VI_OFFSET+2+ntsc_offset].comment, "Enable/disable overscan emulation"); strcpy(items[VI_OFFSET+3+ntsc_offset].comment, "Enable/disable Game Gear extended screen"); strcpy(items[VI_OFFSET+4+ntsc_offset].comment, "Select display aspect ratio"); strcpy(items[VI_OFFSET+5+ntsc_offset].comment, "Adjust display position"); strcpy(items[VI_OFFSET+6+ntsc_offset].comment, "Adjust display scaling"); if (config.overscan == 3) sprintf (items[VI_OFFSET+2+ntsc_offset].text, "Borders: FULL"); else if (config.overscan == 2) sprintf (items[VI_OFFSET+2+ntsc_offset].text, "Borders: H ONLY"); else if (config.overscan == 1) sprintf (items[VI_OFFSET+2+ntsc_offset].text, "Borders: V ONLY"); else sprintf (items[VI_OFFSET+2+ntsc_offset].text, "Borders: NONE"); sprintf(items[VI_OFFSET+3+ntsc_offset].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); if (config.aspect == 1) sprintf (items[VI_OFFSET+4+ntsc_offset].text,"Aspect: ORIGINAL (4:3)"); else if (config.aspect == 2) sprintf (items[VI_OFFSET+4+ntsc_offset].text, "Aspect: ORIGINAL (16:9)"); else { sprintf (items[VI_OFFSET+4+ntsc_offset].text, "Aspect: SCALED"); } sprintf (items[VI_OFFSET+5+ntsc_offset].text, "Screen Position: (%s%02d,%s%02d)", (config.xshift < 0) ? "":"+", config.xshift, (config.yshift < 0) ? "":"+", config.yshift); sprintf (items[VI_OFFSET+6+ntsc_offset].text, "Screen Scaling: (%s%02d,%s%02d)", (config.xscale < 0) ? "":"+", config.xscale, (config.yscale < 0) ? "":"+", config.yscale); m->max_items = VI_OFFSET + 6 + ntsc_offset + (config.aspect == 0); GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("Video ")); while (quit == 0) { ret = GUI_RunMenu(m); if (ret > (VI_OFFSET + 1)) { ret += (5 - ntsc_offset); } switch (ret) { case 0: /*** rendering ***/ { config.render = (config.render + 1) % 3; if (config.render == 2) { /* progressive mode is only possible through component cable */ if (!VIDEO_HaveComponentCable()) { config.render = 0; } } if (config.render == 1) sprintf (items[0].text,"Display: INTERLACED"); else if (config.render == 2) sprintf (items[0].text, "Display: PROGRESSIVE"); else sprintf (items[0].text, "Display: ORIGINAL"); reinit = 1; break; } case 1: /*** tv mode ***/ { config.tv_mode = (config.tv_mode + 1) % 3; if (config.tv_mode == 0) sprintf (items[1].text, "TV Mode: 60HZ"); else if (config.tv_mode == 1) sprintf (items[1].text, "TV Mode: 50HZ"); else sprintf (items[1].text, "TV Mode: 50/60HZ"); reinit = 1; break; } case 2: /*** VSYNC ***/ { config.vsync ^= 1; if (config.vsync) sprintf (items[2].text, "VSYNC: AUTO"); else sprintf (items[2].text, "VSYNC: OFF"); reinit = 1; break; } case 3: /*** GX Texture filtering ***/ { config.bilinear ^= 1; sprintf (items[3].text, "Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); break; } case 4: /*** GX Copy filtering (deflickering filter) ***/ { config.vfilter ^= 1; sprintf (items[4].text, "Deflickering Filter: %s", config.vfilter ? "AUTO" : "OFF"); break; } #ifdef HW_RVL case 5: /*** VIDEO Trap filtering ***/ { config.trap ^= 1; sprintf (items[5].text, "Trap Filter: %s", config.trap ? " ON" : "OFF"); break; } case 6: /*** VIDEO Gamma correction ***/ { if (system_hw) { update_gamma(); state[0] = m->arrows[0]->state; state[1] = m->arrows[1]->state; m->max_buttons = 0; m->max_images = 0; m->arrows[0]->state = 0; m->arrows[1]->state = 0; m->screenshot = 255; strcpy(m->title,""); GUI_OptionBox(m,update_gamma,"Gamma Correction",(void *)&config.gamma,0.1,0.1,3.0,0); m->max_buttons = 4; m->max_images = 6; m->arrows[0]->state = state[0]; m->arrows[1]->state = state[1]; m->screenshot = 0; strcpy(m->title,"Video Settings"); sprintf (items[6].text, "Gamma Correction: %1.1f", config.gamma); VIDEO_SetGamma(VI_GM_1_0); VIDEO_Flush(); } else { GUI_WaitPrompt("Error","Please load a game first !\n"); } break; } #endif case VI_OFFSET: /*** LCD filter (soft) ***/ { if (config.ntsc) { GUI_WaitPrompt("Error","NTSC filter must be disabled\n"); break; } int16 ratio = ((config.lcd * 100) + 254) / 255; GUI_OptionBox(m,0,"LCD Ghosting Ratio (%)",(void *)&ratio,1,0,100,1); if (ratio > 0) { sprintf (items[VI_OFFSET].text, "LCD Ghosting Filter: %d%%", ratio); } else { sprintf (items[VI_OFFSET].text, "LCD Ghosting Filter: OFF"); } config.lcd = (ratio * 255) / 100; break; } case VI_OFFSET+1: /*** NTSC filter (soft) ***/ { if (config.lcd) { GUI_WaitPrompt("Error","LCD filter must be disabled\n"); break; } config.ntsc = (config.ntsc + 1) % 5; if (config.ntsc == 1) { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: COMPOSITE"); } else if (config.ntsc == 2) { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: S-VIDEO"); } else if (config.ntsc == 3) { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: RGB"); } else if (config.ntsc == 4) { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: MANUAL"); strcpy(items[VI_OFFSET+5+2].text, items[VI_OFFSET+2].text); strcpy(items[VI_OFFSET+5+3].text, items[VI_OFFSET+3].text); strcpy(items[VI_OFFSET+5+4].text, items[VI_OFFSET+4].text); strcpy(items[VI_OFFSET+5+5].text, items[VI_OFFSET+5].text); strcpy(items[VI_OFFSET+5+6].text, items[VI_OFFSET+6].text); strcpy(items[VI_OFFSET+5+2].comment, items[VI_OFFSET+2].comment); strcpy(items[VI_OFFSET+5+3].comment, items[VI_OFFSET+3].comment); strcpy(items[VI_OFFSET+5+4].comment, items[VI_OFFSET+4].comment); strcpy(items[VI_OFFSET+5+5].comment, items[VI_OFFSET+5].comment); strcpy(items[VI_OFFSET+5+6].comment, items[VI_OFFSET+6].comment); sprintf(items[VI_OFFSET+2].text, "NTSC Sharpness: %1.1f", config.ntsc_sharpness); sprintf(items[VI_OFFSET+3].text, "NTSC Resolution: %1.1f", config.ntsc_resolution); sprintf(items[VI_OFFSET+4].text, "NTSC Artifacts: %1.1f", config.ntsc_artifacts); sprintf(items[VI_OFFSET+5].text, "NTSC Color Bleed: %1.1f", config.ntsc_bleed); sprintf(items[VI_OFFSET+6].text, "NTSC Color Fringing: %1.1f", config.ntsc_fringing); strcpy(items[VI_OFFSET+2].comment, "Adjust edge contrast enhancement/blurring"); strcpy(items[VI_OFFSET+3].comment, "Adjust image resolution"); strcpy(items[VI_OFFSET+4].comment, "Adjust artifacts caused by color changes"); strcpy(items[VI_OFFSET+5].comment, "Adjust color resolution reduction"); strcpy(items[VI_OFFSET+6].comment, "Adjust artifacts caused by brightness changes"); ntsc_offset = 5; m->max_items = VI_OFFSET + 11 + (config.aspect == 0); } else { sprintf (items[VI_OFFSET+1].text, "NTSC Filter: OFF"); strcpy(items[VI_OFFSET+2].text, items[VI_OFFSET+5+2].text); strcpy(items[VI_OFFSET+3].text, items[VI_OFFSET+5+3].text); strcpy(items[VI_OFFSET+4].text, items[VI_OFFSET+5+4].text); strcpy(items[VI_OFFSET+5].text, items[VI_OFFSET+5+5].text); strcpy(items[VI_OFFSET+6].text, items[VI_OFFSET+5+6].text); strcpy(items[VI_OFFSET+2].comment, items[VI_OFFSET+5+2].comment); strcpy(items[VI_OFFSET+3].comment, items[VI_OFFSET+5+3].comment); strcpy(items[VI_OFFSET+4].comment, items[VI_OFFSET+5+4].comment); strcpy(items[VI_OFFSET+5].comment, items[VI_OFFSET+5+5].comment); strcpy(items[VI_OFFSET+6].comment, items[VI_OFFSET+5+6].comment); ntsc_offset = 0; m->max_items = VI_OFFSET + 6 + (config.aspect == 0); } break; } case VI_OFFSET+2: /*** NTSC Sharpness ***/ GUI_OptionBox(m,update_bgm,"NTSC Sharpness",(void *)&config.ntsc_sharpness,0.01,-1.0,1.0,0); sprintf(items[VI_OFFSET+2].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness); break; case VI_OFFSET+3: /*** NTSC Resolution ***/ GUI_OptionBox(m,update_bgm,"NTSC Resolution",(void *)&config.ntsc_resolution,0.01,0.0,1.0,0); sprintf(items[VI_OFFSET+3].text, "NTSC Resolution: %1.2f", config.ntsc_resolution); break; case VI_OFFSET+4: /*** NTSC Artifacts ***/ GUI_OptionBox(m,update_bgm,"NTSC Artifacts",(void *)&config.ntsc_artifacts,0.01,-1.0,0.0,0); sprintf(items[VI_OFFSET+4].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts); break; case VI_OFFSET+5: /*** NTSC Color Bleed ***/ GUI_OptionBox(m,update_bgm,"NTSC Color Bleed",(void *)&config.ntsc_bleed,0.01,-1.0,1.0,0); sprintf(items[VI_OFFSET+5].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed); break; case VI_OFFSET+6: /*** NTSC Color Fringing ***/ GUI_OptionBox(m,update_bgm,"NTSC Color Fringing",(void *)&config.ntsc_fringing,0.01,-1.0,1.0,0); sprintf(items[VI_OFFSET+6].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing); break; case VI_OFFSET+7: /*** overscan emulation ***/ { config.overscan = (config.overscan + 1) & 3; if (config.overscan == 3) sprintf (items[VI_OFFSET+ntsc_offset+2].text, "Borders: FULL"); else if (config.overscan == 2) sprintf (items[VI_OFFSET+ntsc_offset+2].text, "Borders: H ONLY"); else if (config.overscan == 1) sprintf (items[VI_OFFSET+ntsc_offset+2].text, "Borders: V ONLY"); else sprintf (items[VI_OFFSET+ntsc_offset+2].text, "Borders: NONE"); break; } case VI_OFFSET+8: /*** Game Gear extended screen */ { config.gg_extra ^= 1; sprintf(items[VI_OFFSET+ntsc_offset+3].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); break; } case VI_OFFSET+9: /*** aspect ratio ***/ { config.aspect = (config.aspect + 1) % 3; if (config.aspect == 1) sprintf (items[VI_OFFSET+ntsc_offset+4].text,"Aspect: ORIGINAL (4:3)"); else if (config.aspect == 2) sprintf (items[VI_OFFSET+ntsc_offset+4].text, "Aspect: ORIGINAL (16:9)"); else sprintf (items[VI_OFFSET+ntsc_offset+4].text, "Aspect: SCALED"); if (config.aspect) { /* disable items */ m->max_items = VI_OFFSET + ntsc_offset + 6; /* reset menu selection */ if (m->selected < 2) { m->offset = VI_OFFSET + ntsc_offset + 2; m->selected = 2; } } else { /* enable items */ m->max_items = VI_OFFSET + ntsc_offset + 7; } break; } case VI_OFFSET+10: /*** screen position ***/ { if (system_hw) { state[0] = m->arrows[0]->state; state[1] = m->arrows[1]->state; m->max_buttons = 0; m->max_images = 0; m->arrows[0]->state = 0; m->arrows[1]->state = 0; m->screenshot = 255; strcpy(m->title,""); GUI_OptionBox2(m,"X Offset","Y Offset",&config.xshift,&config.yshift,1,-99,99); m->max_buttons = 4; m->max_images = 6; m->arrows[0]->state = state[0]; m->arrows[1]->state = state[1]; m->screenshot = 0; strcpy(m->title,"Video Settings"); sprintf (items[VI_OFFSET+ntsc_offset+5].text, "Screen Position: (%s%02d,%s%02d)", (config.xshift < 0) ? "":"+", config.xshift, (config.yshift < 0) ? "":"+", config.yshift); } else { GUI_WaitPrompt("Error","Please load a game first !\n"); } break; } case VI_OFFSET+11: /*** screen scaling ***/ { if (system_hw) { state[0] = m->arrows[0]->state; state[1] = m->arrows[1]->state; m->max_buttons = 0; m->max_images = 0; m->arrows[0]->state = 0; m->arrows[1]->state = 0; m->screenshot = 255; strcpy(m->title,""); GUI_OptionBox2(m,"X Scale","Y Scale",&config.xscale,&config.yscale,1,-99,99); m->max_buttons = 4; m->max_images = 6; m->arrows[0]->state = state[0]; m->arrows[1]->state = state[1]; m->screenshot = 0; strcpy(m->title,"Video Settings"); sprintf (items[VI_OFFSET+ntsc_offset+6].text, "Screen Scaling: (%s%02d,%s%02d)", (config.xscale < 0) ? "":"+", config.xscale, (config.yscale < 0) ? "":"+", config.yscale); } else { GUI_WaitPrompt("Error","Please load a game first !\n"); } break; } case -1: { quit = 1; break; } } } if (reinit && system_hw) { /* framerate might have changed, reinitialize audio timings */ audio_init(snd.sample_rate, get_framerate()); } GUI_DeleteMenu(m); } /**************************************************************************** * Controllers Settings menu ****************************************************************************/ static int player = 0; static void ctrlmenu_cb(void) { int i, cnt = 1; char msg[16]; gui_menu *m = &menu_ctrls; if (m->bg_images[7].state & IMAGE_VISIBLE) { /* draw device port number */ if (config.input[player].device != -1) { sprintf(msg,"%d",config.input[player].port + 1); if (m->selected == 11) FONT_write(msg,16,m->items[11].x+m->items[11].w+2,m->items[11].y+m->items[11].h+2,640,(GXColor)DARK_GREY); else FONT_write(msg,14,m->items[11].x+m->items[11].w,m->items[11].y+m->items[11].h,640,(GXColor)DARK_GREY); } } /* draw players index */ for (i=2; iselected == i) { FONT_writeCenter("Player", 16, m->buttons[i].x + 2, m->buttons[i].x + 54, m->buttons[i].y + (m->buttons[i].h - 16)/2 + 16, (GXColor)DARK_GREY); } else { FONT_writeCenter("Player", 14, m->buttons[i].x + 4, m->buttons[i].x + 54, m->buttons[i].y + (m->buttons[i].h - 14)/2 + 14, (GXColor)DARK_GREY); } if (input.dev[i-2] != NO_DEVICE) { sprintf(msg,"%d",cnt++); if (m->selected == i) { FONT_writeCenter(msg,18,m->items[i].x+2,m->items[i].x+m->items[i].w+2,m->buttons[i].y+(m->buttons[i].h-18)/2+18,(GXColor)DARK_GREY); } else { FONT_writeCenter(msg,16,m->items[i].x,m->items[i].x+m->items[i].w,m->buttons[i].y+(m->buttons[i].h - 16)/2+16,(GXColor)DARK_GREY); } } } } /* Set menu elements depending on current system configuration */ static void ctrlmenu_raz(void) { int i,max = 0; gui_menu *m = &menu_ctrls; /* update players buttons */ for (i=0; ibuttons[i+2].data = &button_player_none_data; m->buttons[i+2].state &= ~BUTTON_ACTIVE; strcpy(m->items[i+2].comment,""); } else { m->buttons[i+2].data = &button_player_data; m->buttons[i+2].state |= BUTTON_ACTIVE; if ((cart.special & HW_J_CART) && (i > 4)) sprintf(m->items[i+2].comment,"Configure Player %d (J-CART) settings", max + 1); else sprintf(m->items[i+2].comment,"Configure Player %d settings", max + 1); max++; } } /* update buttons navigation */ if (input.dev[0] != NO_DEVICE) m->buttons[0].shift[3] = 2; else if (input.dev[4] != NO_DEVICE) m->buttons[0].shift[3] = 6; else if (input.dev[5] != NO_DEVICE) m->buttons[0].shift[3] = 7; else m->buttons[0].shift[3] = 0; if (input.dev[4] != NO_DEVICE) m->buttons[1].shift[3] = 5; else if (input.dev[5] != NO_DEVICE) m->buttons[1].shift[3] = 6; else if (input.dev[0] != NO_DEVICE) m->buttons[1].shift[3] = 1; else m->buttons[1].shift[3] = 0; if (input.dev[1] != NO_DEVICE) m->buttons[2].shift[1] = 1; else if (input.dev[4] != NO_DEVICE) m->buttons[2].shift[1] = 4; else if (input.dev[5] != NO_DEVICE) m->buttons[2].shift[1] = 5; else m->buttons[2].shift[1] = 0; if (input.dev[4] != NO_DEVICE) m->buttons[5].shift[1] = 1; else if (input.dev[5] != NO_DEVICE) m->buttons[5].shift[1] = 2; else m->buttons[5].shift[1] = 0; if (input.dev[3] != NO_DEVICE) m->buttons[6].shift[0] = 1; else if (input.dev[0] != NO_DEVICE) m->buttons[6].shift[0] = 4; else m->buttons[6].shift[0] = 0; if (input.dev[5] != NO_DEVICE) m->buttons[6].shift[1] = 1; else m->buttons[6].shift[1] = 0; if (input.dev[6] != NO_DEVICE) m->buttons[7].shift[1] = 1; else m->buttons[7].shift[1] = 0; if (input.dev[7] != NO_DEVICE) m->buttons[8].shift[1] = 1; else m->buttons[8].shift[1] = 0; if (input.dev[4] != NO_DEVICE) m->buttons[7].shift[0] = 1; else if (input.dev[3] != NO_DEVICE) m->buttons[7].shift[0] = 2; else if (input.dev[0] != NO_DEVICE) m->buttons[7].shift[0] = 5; else m->buttons[7].shift[0] = 0; } static void ctrlmenu(void) { int old_player = -1; int i = 0; int update = 0; gui_item *items = NULL; u8 *special = NULL; u32 exp, index = 0; /* System devices */ gui_item items_sys[2][14] = { { {NULL,Ctrl_none_png ,"","Select Port 1 device",110,130,48,72}, {NULL,Ctrl_gamepad_png ,"","Select Port 1 device",100,109,68,92}, {NULL,Ctrl_mouse_png ,"","Select Port 1 device", 97,113,64,88}, {NULL,Ctrl_menacer_png ,"","Select Port 1 device", 94,113,80,88}, {NULL,Ctrl_justifiers_png ,"","Select Port 1 device", 88,117,80,84}, {NULL,Ctrl_xe_1ap_png ,"","Select Port 1 device", 98,118,72,84}, {NULL,Ctrl_activator_png ,"","Select Port 1 device", 94,121,72,80}, {NULL,Ctrl_lightphaser_png ,"","Select Port 1 device", 89,109,88,92}, {NULL,Ctrl_paddle_png ,"","Select Port 1 device", 86,117,96,84}, {NULL,Ctrl_sportspad_png ,"","Select Port 1 device", 95,117,76,84}, {NULL,Ctrl_graphic_board_png ,"","Select Port 1 device", 90,105,88,96}, {NULL,Ctrl_mastertap_png ,"","Select Port 1 device", 96,104,76,96}, {NULL,Ctrl_teamplayer_png ,"","Select Port 1 device", 94,109,80,92}, {NULL,Ctrl_4wayplay_png ,"","Select Port 1 device", 98,110,72,92} }, { {NULL,Ctrl_none_png ,"","Select Port 2 device",110,300,48,72}, {NULL,Ctrl_gamepad_png ,"","Select Port 2 device",100,279,68,92}, {NULL,Ctrl_mouse_png ,"","Select Port 2 device", 97,283,64,88}, {NULL,Ctrl_menacer_png ,"","Select Port 2 device", 94,283,80,88}, {NULL,Ctrl_justifiers_png ,"","Select Port 2 device", 88,287,80,84}, {NULL,Ctrl_xe_1ap_png ,"","Select Port 2 device", 98,288,72,84}, {NULL,Ctrl_activator_png ,"","Select Port 2 device", 94,291,72,80}, {NULL,Ctrl_lightphaser_png ,"","Select Port 2 device", 89,279,88,92}, {NULL,Ctrl_paddle_png ,"","Select Port 2 device", 86,287,96,84}, {NULL,Ctrl_sportspad_png ,"","Select Port 2 device", 95,287,76,84}, {NULL,Ctrl_graphic_board_png ,"","Select Port 2 device", 90,275,88,96}, {NULL,Ctrl_mastertap_png ,"","Select Port 1 device", 96,274,76,96}, {NULL,Ctrl_teamplayer_png ,"","Select Port 2 device", 94,279,80,92}, {NULL,Ctrl_4wayplay_png ,"","Select Port 2 device", 98,280,72,92} } }; /* Specific controller options */ gui_item items_special[4][4] = { { /* Gamepad option */ {NULL,Ctrl_pad3b_png,"Pad\nType","Use 3-buttons Pad",528,180,44,28}, {NULL,Ctrl_pad6b_png,"Pad\nType","Use 6-buttons Pad",528,180,44,28}, {NULL,Ctrl_pad2b_png,"Pad\nType","Use 2-buttons Pad",528,180,44,28}, {NULL,Ctrl_pad_auto_png,"Pad\nType","Auto-detect Pad type",528,180,44,28}, }, { /* Mouse option */ {NULL,ctrl_option_off_png,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, {NULL,ctrl_option_on_png ,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, {NULL,NULL,"","",0,0,0,0}, {NULL,NULL,"","",0,0,0,0}, }, { /* Gun option */ {NULL,ctrl_option_off_png,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, {NULL,ctrl_option_on_png ,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, {NULL,NULL,"","",0,0,0,0}, {NULL,NULL,"","",0,0,0,0}, }, { /* no option */ {NULL,NULL,"No Option","",436,180,160,52}, {NULL,NULL,"","",0,0,0,0}, {NULL,NULL,"","",0,0,0,0}, {NULL,NULL,"","",0,0,0,0}, } }; /* Player Configuration device items */ #ifdef HW_RVL gui_item items_device[5] = { {NULL,ctrl_option_off_png ,"Input\nDevice","Select Input Controller",534,244,24,24}, {NULL,ctrl_gamecube_png ,"Input\nDevice","Select Input Controller",530,246,36,24}, {NULL,ctrl_wiimote_png ,"Input\nDevice","Select Input Controller",526,250,40,12}, {NULL,ctrl_nunchuk_png ,"Input\nDevice","Select Input Controller",532,242,32,32}, {NULL,ctrl_classic_png ,"Input\nDevice","Select Input Controller",526,242,40,32}, }; #else gui_item items_device[2] = { {NULL,ctrl_option_off_png ,"Input\nDevice","Select Input Controller",534,244,24,24}, {NULL,ctrl_gamecube_png ,"Input\nDevice","Select Input Controller",530,246,36,24} }; #endif /* initialize menu */ gui_menu *m = &menu_ctrls; GUI_InitMenu(m); /* initialize custom buttons */ button_player_data.texture[0] = gxTextureOpenPNG(button_player_data.image[0],0); button_player_data.texture[1] = gxTextureOpenPNG(button_player_data.image[1],0); button_player_none_data.texture[0] = gxTextureOpenPNG(button_player_none_data.image[0],0); /* initialize custom images */ for (i=0; i<14; i++) { items_sys[1][i].texture = items_sys[0][i].texture = gxTextureOpenPNG(items_sys[0][i].data,0); } items_special[0][0].texture = gxTextureOpenPNG(items_special[0][0].data,0); items_special[0][1].texture = gxTextureOpenPNG(items_special[0][1].data,0); items_special[0][2].texture = gxTextureOpenPNG(items_special[0][2].data,0); items_special[0][3].texture = gxTextureOpenPNG(items_special[0][3].data,0); items_special[2][0].texture = items_special[1][0].texture = gxTextureOpenPNG(items_special[1][0].data,0); items_special[2][1].texture = items_special[1][1].texture = gxTextureOpenPNG(items_special[1][1].data,0); items_device[0].texture = items_special[1][0].texture; items_device[1].texture = gxTextureOpenPNG(items_device[1].data,0); #ifdef HW_RVL items_device[2].texture = gxTextureOpenPNG(items_device[2].data,0); items_device[3].texture = gxTextureOpenPNG(items_device[3].data,0); items_device[4].texture = gxTextureOpenPNG(items_device[4].data,0); #endif /* restore current menu elements */ player = 0; ctrlmenu_raz(); memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); /* menu title slide effect */ m->selected = 0; GUI_SlideMenuTitle(m,strlen("Controller ")); while (update != -1) { /* draw menu */ GUI_DrawMenu(m); /* update menu */ update = GUI_UpdateMenu(m); if (update > 0) { switch (m->selected) { case 0: /* update port 1 system */ { /* fixed configurations */ if (system_hw) { if (cart.special & HW_TEREBI_OEKAKI) { GUI_WaitPrompt("Error","Terebi Oekaki detected !"); break; } else if (system_hw == SYSTEM_PICO) { GUI_WaitPrompt("Error","PICO hardware detected !"); break; } } /* next connected device */ input.system[0]++; /* allow only one connected mouse */ if ((input.system[0] == SYSTEM_MOUSE) && (input.system[1] == SYSTEM_MOUSE)) { input.system[0] += 3; } /* Menacer & Justifiers on Port B only */ if (input.system[0] == SYSTEM_MENACER) { input.system[0] += 2; } /* allow only one gun type */ if ((input.system[0] == SYSTEM_LIGHTPHASER) && ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER))) { input.system[0]++; } /* allow only one connected graphic board */ if ((input.system[0] == SYSTEM_GRAPHIC_BOARD) && (input.system[1] == SYSTEM_GRAPHIC_BOARD)) { input.system[0]++; } /* 4-wayplay uses both ports */ if (input.system[0] == SYSTEM_WAYPLAY) { input.system[1] = SYSTEM_WAYPLAY; } /* loop back */ if (input.system[0] > SYSTEM_WAYPLAY) { input.system[0] = NO_SYSTEM; input.system[1] = SYSTEM_GAMEPAD; } /* reset I/O ports */ io_init(); input_reset(); /* save current configuration */ old_system[0] = input.system[0]; old_system[1] = input.system[1]; /* update menu elements */ ctrlmenu_raz(); memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); if (m->bg_images[7].state & IMAGE_VISIBLE) { /* slide out configuration window */ GUI_DrawMenuFX(m, 20, 1); /* remove configuration window */ m->bg_images[7].state &= ~IMAGE_VISIBLE; /* disable configuration buttons */ m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); /* update directions */ m->buttons[2].shift[3] = 0; m->buttons[3].shift[3] = 0; m->buttons[4].shift[3] = 0; m->buttons[5].shift[3] = 0; m->buttons[6].shift[3] = 0; m->buttons[7].shift[3] = 0; m->buttons[8].shift[3] = 0; m->buttons[9].shift[3] = 0; /* update title */ sprintf(m->title,"Controller Settings"); } break; } case 1: /* update port 2 system */ { /* fixed configurations */ if (system_hw) { if (cart.special & HW_TEREBI_OEKAKI) { GUI_WaitPrompt("Error","Terebi Oekaki detected !"); break; } else if (system_hw == SYSTEM_PICO) { GUI_WaitPrompt("Error","PICO hardware detected !"); break; } } /* next connected device */ input.system[1]++; /* allow only one connected mouse */ if ((input.system[0] == SYSTEM_MOUSE) && (input.system[1] == SYSTEM_MOUSE)) { input.system[1]++; } /* allow only one gun type */ if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_MENACER)) { input.system[1]++; } /* allow only one gun type */ if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_JUSTIFIER)) { input.system[1]++; } /* allow only one connected graphic board */ if ((input.system[0] == SYSTEM_GRAPHIC_BOARD) && (input.system[1] == SYSTEM_GRAPHIC_BOARD)) { input.system[1]++; } /* 4-wayplay uses both ports */ if (input.system[1] == SYSTEM_WAYPLAY) { input.system[0] = SYSTEM_WAYPLAY; } /* loop back */ if (input.system[1] > SYSTEM_WAYPLAY) { input.system[1] = NO_SYSTEM; input.system[0] = SYSTEM_GAMEPAD; } /* reset I/O ports */ io_init(); input_reset(); /* save current configuration */ old_system[0] = input.system[0]; old_system[1] = input.system[1]; /* update menu elements */ ctrlmenu_raz(); memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); if (m->bg_images[7].state & IMAGE_VISIBLE) { /* slide out configuration window */ GUI_DrawMenuFX(m, 20, 1); /* remove configuration window */ m->bg_images[7].state &= ~IMAGE_VISIBLE; /* disable configuration buttons */ m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); /* update directions */ m->buttons[2].shift[3] = 0; m->buttons[3].shift[3] = 0; m->buttons[4].shift[3] = 0; m->buttons[5].shift[3] = 0; m->buttons[6].shift[3] = 0; m->buttons[7].shift[3] = 0; m->buttons[8].shift[3] = 0; m->buttons[9].shift[3] = 0; /* update title */ sprintf(m->title,"Controller Settings"); } break; } case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: { /* remove duplicate assigned inputs */ for (i=0; iselected - 2; /* update player index */ old_player = player; player = 0; for (i=0; ibg_images[7].state & IMAGE_VISIBLE) { /* if already displayed, do nothing */ if (old_player == player) break; /* slide out configuration window */ GUI_DrawMenuFX(m, 20, 1); } else { /* append configuration window */ m->bg_images[7].state |= IMAGE_VISIBLE; /* enable configuration buttons */ m->buttons[10].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[11].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[12].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); /* update directions */ m->buttons[2].shift[3] = 8; m->buttons[3].shift[3] = 7; m->buttons[4].shift[3] = 6; m->buttons[5].shift[3] = 5; m->buttons[6].shift[3] = 4; m->buttons[7].shift[3] = 3; m->buttons[8].shift[3] = 2; m->buttons[9].shift[3] = 1; } /* retrieve current player informations */ switch (input.dev[index]) { case DEVICE_PAD2B: case DEVICE_PAD3B: case DEVICE_PAD6B: { if (input.system[index/4] == SYSTEM_MASTERTAP) { /* force 2-buttons pad */ items = items_special[3]; special = NULL; } else { items = items_special[0]; special = &config.input[player].padtype; } break; } case DEVICE_MOUSE: { items = items_special[1]; special = &config.invert_mouse; break; } case DEVICE_LIGHTGUN: { items = items_special[2]; if ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER)) { /* Menacer & Justifiers affected to entries 4 & 5 */ special = &config.gun_cursor[index & 1]; } else { /* Lightphasers affected to entries 0 & 4 */ special = &config.gun_cursor[index / 4]; } break; } default: { items = items_special[3]; special = NULL; break; } } if (special) { memcpy(&m->items[10],&items[*special],sizeof(gui_item)); } else { memcpy(&m->items[10],&items[0],sizeof(gui_item)); } memcpy(&m->items[11],&items_device[config.input[player].device + 1],sizeof(gui_item)); /* slide in configuration window */ m->buttons[10].shift[2] = 10 - m->selected; m->buttons[11].shift[2] = 11 - m->selected; m->buttons[12].shift[2] = 12 - m->selected; m->selected = 10; GUI_DrawMenuFX(m, 20, 0); /* some devices require analog sticks */ if ((input.dev[index] == DEVICE_XE_1AP) && ((config.input[player].device == -1) || (config.input[player].device == 1))) { GUI_WaitPrompt("Warning","One Analog Stick required !"); } else if ((input.dev[index] == DEVICE_ACTIVATOR) && ((config.input[player].device != 0) && (config.input[player].device != 3))) { GUI_WaitPrompt("Warning","Two Analog Sticks required !"); } /* update title */ if ((cart.special & HW_J_CART) && (player > 1)) { sprintf(m->title,"Controller Settings (Player %d) (J-CART)",player+1); } else { sprintf(m->title,"Controller Settings (Player %d)",player+1); } break; } case 10: /* specific option */ { if (special) { /* specific case: controller type */ if (input.dev[index] < 0x03) { /* switch pad type */ *special = (*special + 1) & 0x03; /* reinitialize emulated device(s) */ io_init(); input_reset(); } else { /* switch option */ *special ^= 1; } /* update menu items */ memcpy(&m->items[10],&items[*special],sizeof(gui_item)); } break; } case 11: /* input controller selection */ { /* no input device */ if (config.input[player].device < 0) { /* always try gamecube controllers first */ config.input[player].device = 0; config.input[player].port = 0; } else { /* try next port */ config.input[player].port ++; } /* autodetect connected gamecube controllers */ if (config.input[player].device == 0) { /* find first connected controller */ exp = 0; while ((config.input[player].port < 4) && !exp) { VIDEO_WaitVSync (); exp = PAD_ScanPads() & (1<= 4) { #ifdef HW_RVL /* test wiimote */ config.input[player].port = 0; config.input[player].device = 1; #else /* no input controller left */ config.input[player].device = -1; config.input[player].port = player%4; #endif } } #ifdef HW_RVL /* autodetect connected wiimotes (without nunchuk) */ if (config.input[player].device == 1) { /* find first connected controller */ exp = 255; while ((config.input[player].port < 4) && (exp == 255)) { WPAD_Probe(config.input[player].port,&exp); /* check if this is a Wii U Pro Controller */ if (exp == WPAD_EXP_CLASSIC) { WPADData *data = WPAD_Data(config.input[player].port); exp = data->exp.classic.rjs.max.x; } /* try next port if no wimote available */ if (exp == 255) config.input[player].port ++; } /* no more wiimote */ if (config.input[player].port >= 4) { /* test wiimote+nunchuk */ config.input[player].port = 0; config.input[player].device = 2; } } /* autodetect connected wiimote+nunchuk */ if (config.input[player].device == 2) { /* test current port */ exp = 255; if (config.input[player].port < 4) { WPAD_Probe(config.input[player].port,&exp); } /* find first connected controller */ while ((config.input[player].port < 4) && (exp != WPAD_EXP_NUNCHUK)) { /* try next port */ config.input[player].port ++; if (config.input[player].port < 4) { exp = 255; WPAD_Probe(config.input[player].port,&exp); } } /* no more wiimote+nunchuk */ if (config.input[player].port >= 4) { /* test classic controllers */ config.input[player].port = 0; config.input[player].device = 3; } } /* autodetect connected classic controllers */ if (config.input[player].device == 3) { /* test current port */ exp = 255; if (config.input[player].port < 4) { WPAD_Probe(config.input[player].port,&exp); } /* find first connected controller */ while ((config.input[player].port<4) && (exp != WPAD_EXP_CLASSIC)) { /* try next port */ config.input[player].port ++; if (config.input[player].port < 4) { exp = 255; WPAD_Probe(config.input[player].port,&exp); } } if (config.input[player].port >= 4) { /* no input controller left */ config.input[player].device = -1; config.input[player].port = player%4; } } #endif /* update menu items */ memcpy(&m->items[11],&items_device[config.input[player].device + 1],sizeof(gui_item)); break; } case 12: /* Controller Keys Configuration */ { if (config.input[player].device >= 0) { GUI_MsgBoxOpen("Keys Configuration", "",0); if (!system_hw && special && (*special == 3)) { /* no auto-detected pad type, use 6-buttons key mapping as default */ gx_input_Config(config.input[player].port, config.input[player].device, DEVICE_PAD6B); } else { gx_input_Config(config.input[player].port, config.input[player].device, input.dev[index]); } GUI_MsgBoxClose(); } break; } } } /* Close Window */ else if (update < 0) { if (m->bg_images[7].state & IMAGE_VISIBLE) { /* slide out configuration window */ GUI_DrawMenuFX(m, 20, 1); /* disable configuration window */ m->bg_images[7].state &= ~IMAGE_VISIBLE; /* disable configuration buttons */ m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); /* clear directions */ m->buttons[2].shift[3] = 0; m->buttons[3].shift[3] = 0; m->buttons[4].shift[3] = 0; m->buttons[5].shift[3] = 0; m->buttons[6].shift[3] = 0; m->buttons[7].shift[3] = 0; m->buttons[8].shift[3] = 0; m->buttons[9].shift[3] = 0; /* update selector */ m->selected -= m->buttons[m->selected].shift[2]; /* restore title */ sprintf(m->title,"Controller Settings"); /* stay in menu */ update = 0; } else { /* check we have at least one connected input before leaving */ old_player = player; player = 0; for (i=0; ibg_images[7].state &= ~IMAGE_VISIBLE; /* disable configuration buttons */ m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); /* clear directions */ m->buttons[2].shift[3] = 0; m->buttons[3].shift[3] = 0; m->buttons[4].shift[3] = 0; m->buttons[5].shift[3] = 0; m->buttons[6].shift[3] = 0; m->buttons[7].shift[3] = 0; m->buttons[8].shift[3] = 0; m->buttons[9].shift[3] = 0; /* clear menu items */ memset(&m->items[0],0,sizeof(gui_item)); memset(&m->items[1],0,sizeof(gui_item)); memset(&m->items[10],0,sizeof(gui_item)); memset(&m->items[11],0,sizeof(gui_item)); /* clear player buttons */ m->buttons[2].data = NULL; m->buttons[3].data = NULL; m->buttons[4].data = NULL; m->buttons[5].data = NULL; m->buttons[6].data = NULL; m->buttons[7].data = NULL; m->buttons[8].data = NULL; m->buttons[9].data = NULL; /* delete menu */ GUI_DeleteMenu(m); /* delete custom buttons */ gxTextureClose(&button_player_data.texture[0]); gxTextureClose(&button_player_data.texture[1]); gxTextureClose(&button_player_none_data.texture[0]); /* delete custom images */ for (i=0; i<14; i++) { gxTextureClose(&items_sys[0][i].texture); } gxTextureClose(&items_special[0][0].texture); gxTextureClose(&items_special[0][1].texture); gxTextureClose(&items_special[0][2].texture); gxTextureClose(&items_special[0][3].texture); gxTextureClose(&items_special[1][0].texture); gxTextureClose(&items_special[1][1].texture); gxTextureClose(&items_device[1].texture); #ifdef HW_RVL gxTextureClose(&items_device[2].texture); gxTextureClose(&items_device[3].texture); gxTextureClose(&items_device[4].texture); #endif } /**************************************************************************** * Main Option menu * ****************************************************************************/ static void optionmenu(void) { int ret, quit = 0; gui_menu *m = &menu_options; GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); while (quit == 0) { ret = GUI_RunMenu(m); switch (ret) { case 0: GUI_DeleteMenu(m); systemmenu(); GUI_InitMenu(m); break; case 1: GUI_DeleteMenu(m); videomenu(); GUI_InitMenu(m); break; case 2: GUI_DeleteMenu(m); soundmenu(); GUI_InitMenu(m); break; case 3: GUI_DeleteMenu(m); ctrlmenu(); GUI_InitMenu(m); break; case 4: GUI_DeleteMenu(m); prefmenu(); GUI_InitMenu(m); break; case -1: quit = 1; break; } } config_save(); GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); } /**************************************************************************** * Save Manager menu * ****************************************************************************/ static t_slot slots[5]; static gx_texture *star; static void savemenu_cb(void) { int i; char msg[16]; if (sram.on) { FONT_write("Backup Memory",16,buttons_saves[0].x+16,buttons_saves[0].y+(buttons_saves[0].h-16)/2+16,buttons_saves[0].x+buttons_saves[0].w,(GXColor)DARK_GREY); if (slots[0].valid) { sprintf(msg,"%d/%02d/%02d",slots[0].day,slots[0].month,slots[0].year); FONT_alignRight(msg,12,buttons_saves[0].x+buttons_saves[0].w-16,buttons_saves[0].y+(buttons_saves[0].h-28)/2+12,(GXColor)DARK_GREY); sprintf(msg,"%02d:%02d",slots[0].hour,slots[0].min); FONT_alignRight(msg,12,buttons_saves[0].x+buttons_saves[0].w-16,buttons_saves[0].y+(buttons_saves[0].h-28)/2+28,(GXColor)DARK_GREY); } if (sram.crc != crc32(0, &sram.sram[0], 0x10000)) gxDrawTexture(star,22,buttons_saves[0].y+(buttons_saves[0].h-star->height)/2,star->width,star->height,255); } else { FONT_writeCenter("Backup Memory disabled",16,buttons_saves[0].x,buttons_saves[0].x+buttons_saves[0].w,buttons_saves[0].y+(buttons_saves[0].h-16)/2+16,(GXColor)DARK_GREY); } for (i=1; i<5; i++) { if (slots[i].valid) { sprintf(msg,"Slot %d",i); FONT_write(msg,16,buttons_saves[i].x+16,buttons_saves[i].y+(buttons_saves[i].h-16)/2+16,buttons_saves[i].x+buttons_saves[i].w,(GXColor)DARK_GREY); sprintf(msg,"%d/%02d/%02d",slots[i].day,slots[i].month,slots[i].year); FONT_alignRight(msg,12,buttons_saves[i].x+buttons_saves[i].w-16,buttons_saves[i].y+(buttons_saves[i].h-28)/2+12,(GXColor)DARK_GREY); sprintf(msg,"%02d:%02d",slots[i].hour,slots[i].min); FONT_alignRight(msg,12,buttons_saves[i].x+buttons_saves[i].w-16,buttons_saves[i].y+(buttons_saves[i].h-28)/2+28,(GXColor)DARK_GREY); } else { FONT_write("Empty Slot",16,buttons_saves[i].x+16,buttons_saves[i].y+(buttons_saves[i].h-16)/2+16,buttons_saves[i].x+buttons_saves[i].h,(GXColor)DARK_GREY); } if (i == config.s_default) gxDrawTexture(star,22,buttons_saves[i].y+(buttons_saves[i].h-star->height)/2,star->width,star->height,255); } } static int savemenu(void) { int i, update = 0; int ret = 0; int slot = -1; char filename[MAXPATHLEN]; gui_menu *m = &menu_saves; FILE *snap; star = gxTextureOpenPNG(Star_full_png,0); GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); m->bg_images[3].state &= ~IMAGE_SLIDE_TOP; m->bg_images[4].state &= ~IMAGE_SLIDE_BOTTOM; m->bg_images[5].state &= ~IMAGE_SLIDE_TOP; /* detect existing files */ for (i=0; i<5; i++) slot_autodetect(i, config.s_device, &slots[i]); /* SRAM disabled */ if (sram.on) { m->buttons[0].state |= BUTTON_ACTIVE; m->buttons[1].shift[0] = 1; } else { m->buttons[0].state &= ~BUTTON_ACTIVE; m->buttons[1].shift[0] = 0; if (m->selected == 0) m->selected = 1; } while (update != -1) { /* slot selection */ if ((m->selected < 5) && (slot != m->selected)) { /* update slot */ slot = m->selected; /* delete previous texture if any */ gxTextureClose(&bg_saves[0].texture); bg_saves[0].state &= ~IMAGE_VISIBLE; bg_saves[1].state |= IMAGE_VISIBLE; /* state slot */ if (!config.s_device && slot && slots[slot].valid) { /* open screenshot file */ sprintf (filename, "%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); snap = fopen(filename, "rb"); if (snap) { /* load texture from file */ bg_saves[0].texture = gxTextureOpenPNG(0,snap); if (bg_saves[0].texture) { /* set menu background */ bg_saves[0].w = bg_saves[0].texture->width * 2; if (config.aspect & 2) bg_saves[0].w = (bg_saves[0].w * 3) / 4; bg_saves[0].h = bg_saves[0].texture->height * 2; bg_saves[0].x = (vmode->fbWidth - bg_saves[0].w) / 2; bg_saves[0].y = (vmode->efbHeight - bg_saves[0].h) / 2; bg_saves[0].state |= IMAGE_VISIBLE; bg_saves[1].state &= ~IMAGE_VISIBLE; } fclose(snap); } } } /* draw menu */ GUI_DrawMenu(m); /* update menu */ update = GUI_UpdateMenu(m); if (update > 0) { switch (m->selected) { case 0: case 1: case 2: case 3: case 4: /* Slot selection */ { /* enable right window */ m->bg_images[7].state |= IMAGE_VISIBLE; m->buttons[5].state |= BUTTON_VISIBLE; m->buttons[6].state |= BUTTON_VISIBLE; m->buttons[7].state |= BUTTON_VISIBLE; m->buttons[8].state |= BUTTON_VISIBLE; /* only enable valid options */ if (slots[slot].valid) { m->buttons[5].state |= BUTTON_ACTIVE; m->buttons[7].state |= BUTTON_ACTIVE; m->buttons[6].shift[0] = 1; m->buttons[6].shift[1] = 1; m->buttons[8].shift[0] = 1; m->selected = 5; } else { m->buttons[5].state &= ~BUTTON_ACTIVE; m->buttons[7].state &= ~BUTTON_ACTIVE; m->buttons[6].shift[0] = 0; m->buttons[6].shift[1] = 2; m->buttons[8].shift[0] = (slot > 0) ? 2 : 0; m->selected = 8; } /* state slot 'only' button */ if (slot > 0) { m->buttons[6].state |= BUTTON_ACTIVE; m->buttons[5].shift[1] = 1; m->buttons[7].shift[0] = 1; } else { m->buttons[6].state &= ~BUTTON_ACTIVE; m->buttons[5].shift[1] = 2; m->buttons[7].shift[0] = 2; } /* disable left buttons */ m->buttons[0].state &= ~BUTTON_ACTIVE; m->buttons[1].state &= ~BUTTON_ACTIVE; m->buttons[2].state &= ~BUTTON_ACTIVE; m->buttons[3].state &= ~BUTTON_ACTIVE; m->buttons[4].state &= ~BUTTON_ACTIVE; /* keep current selection highlighted */ m->buttons[slot].state |= BUTTON_SELECTED; /* slide in window */ GUI_DrawMenuFX(m, 20, 0); break; } case 5: /* load file */ { if (slots[slot].valid) { ret = slot_load(slot,config.s_device); /* force exit */ if (ret > 0) { GUI_DrawMenuFX(m, 20, 1); m->buttons[slot].state &= ~BUTTON_SELECTED; m->bg_images[7].state &= ~IMAGE_VISIBLE; if (sram.on) m->buttons[0].state |= BUTTON_ACTIVE; m->buttons[1].state |= BUTTON_ACTIVE; m->buttons[2].state |= BUTTON_ACTIVE; m->buttons[3].state |= BUTTON_ACTIVE; m->buttons[4].state |= BUTTON_ACTIVE; m->buttons[5].state &= ~BUTTON_VISIBLE; m->buttons[6].state &= ~BUTTON_VISIBLE; m->buttons[7].state &= ~BUTTON_VISIBLE; m->buttons[8].state &= ~BUTTON_VISIBLE; m->selected = slot; update = -1; } } break; } case 6: /* set default slot */ { config.s_default = slot; config_save(); break; } case 7: /* delete file */ { if (slots[slot].valid) { if (GUI_WaitConfirm("Warning","Delete Save File ?")) { if (slot_delete(slot,config.s_device) >= 0) { /* hide screenshot */ gxTextureClose(&bg_saves[0].texture); bg_saves[0].state &= ~IMAGE_VISIBLE; bg_saves[1].state |= IMAGE_VISIBLE; slots[slot].valid = 0; update = -1; } } } break; } case 8: /* save file */ { ret = slot_save(slot,config.s_device); /* force exit */ if (ret > 0) { GUI_DrawMenuFX(m, 20, 1); m->buttons[slot].state &= ~BUTTON_SELECTED; m->bg_images[7].state &= ~IMAGE_VISIBLE; if (sram.on) m->buttons[0].state |= BUTTON_ACTIVE; m->buttons[1].state |= BUTTON_ACTIVE; m->buttons[2].state |= BUTTON_ACTIVE; m->buttons[3].state |= BUTTON_ACTIVE; m->buttons[4].state |= BUTTON_ACTIVE; m->buttons[5].state &= ~BUTTON_VISIBLE; m->buttons[6].state &= ~BUTTON_VISIBLE; m->buttons[7].state &= ~BUTTON_VISIBLE; m->buttons[8].state &= ~BUTTON_VISIBLE; m->selected = slot; update = -1; } break; } default: break; } } if (update < 0) { /* close right window */ if (m->bg_images[7].state & IMAGE_VISIBLE) { /* slide out window */ GUI_DrawMenuFX(m, 20, 1); /* clear current selection */ m->buttons[slot].state &= ~BUTTON_SELECTED; /* enable left buttons */ if (sram.on) m->buttons[0].state |= BUTTON_ACTIVE; m->buttons[1].state |= BUTTON_ACTIVE; m->buttons[2].state |= BUTTON_ACTIVE; m->buttons[3].state |= BUTTON_ACTIVE; m->buttons[4].state |= BUTTON_ACTIVE; /* disable right window */ m->bg_images[7].state &= ~IMAGE_VISIBLE; m->buttons[5].state &= ~BUTTON_VISIBLE; m->buttons[6].state &= ~BUTTON_VISIBLE; m->buttons[7].state &= ~BUTTON_VISIBLE; m->buttons[8].state &= ~BUTTON_VISIBLE; /* stay in menu */ m->selected = slot; update = 0; } } } /* leave menu */ m->bg_images[3].state |= IMAGE_SLIDE_TOP; m->bg_images[4].state |= IMAGE_SLIDE_BOTTOM; m->bg_images[5].state |= IMAGE_SLIDE_TOP; GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); gxTextureClose(&star); return ret; } /**************************************************************************** * Load Game menu * ****************************************************************************/ static int loadgamemenu () { int ret, filetype; gui_menu *m = &menu_load; GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); while (1) { ret = GUI_RunMenu(m); switch (ret) { /*** Button B ***/ case -1: GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); return 0; /*** Load from selected device */ default: { /* ROM File type */ filetype = ret - 1; /* Try to open current directory */ if (ret > 0) { ret = OpenDirectory(config.l_device, filetype); } else { ret = OpenDirectory(TYPE_RECENT, filetype); } if (ret) { GUI_DeleteMenu(m); if (FileSelector(filetype) > 0) { /* directly jump to game */ return 1; } GUI_InitMenu(m); } break; } } } return 0; } /*************************************************************************** * Show rom info screen ***************************************************************************/ static void showrominfo (void) { char items[15][64]; /* fill ROM infos */ sprintf (items[0], "Console Type: %s", rominfo.consoletype); sprintf (items[1], "Copyright: %s", rominfo.copyright); sprintf (items[2], "Company Name: %s", get_company()); sprintf (items[3], "Domestic Name:"); sprintf (items[4], "%s",rominfo.domestic); sprintf (items[5], "International Name:"); sprintf (items[6], "%s",rominfo.international); sprintf (items[7], "Type: %s (%s)",rominfo.ROMType, strcmp(rominfo.ROMType, "AI") ? "Game" : "Educational"); sprintf (items[8], "Product ID: %s", rominfo.product); sprintf (items[9], "Checksum: %04x (%04x) (%s)", rominfo.checksum, rominfo.realchecksum, (rominfo.checksum == rominfo.realchecksum) ? "GOOD" : "BAD"); sprintf (items[10], "Supports: "); if (rominfo.peripherals & (1 << 1)) { strcat(items[10],get_peripheral(1)); strcat(items[10],", "); } else if (rominfo.peripherals & (1 << 0)) { strcat(items[10],get_peripheral(0)); strcat(items[10],", "); } if (rominfo.peripherals & (1 << 7)) { strcat(items[10],get_peripheral(7)); strcat(items[10],", "); } if (rominfo.peripherals & (1 << 8)) { strcat(items[10],get_peripheral(8)); strcat(items[10],", "); } if (rominfo.peripherals & (1 << 11)) { strcat(items[10],get_peripheral(11)); strcat(items[10],", "); } if (rominfo.peripherals & (1 << 13)) { strcat(items[10],get_peripheral(13)); strcat(items[10],", "); } if (strlen(items[10]) > 10) items[10][strlen(items[10]) - 2] = 0; sprintf (items[11], "ROM end: $%06X", rominfo.romend); if (sram.custom) sprintf (items[12], "Serial EEPROM"); else if (sram.detected) sprintf (items[12], "SRAM Start: $%06X", sram.start); else sprintf (items[12], "No Backup Memory specified"); if (sram.custom == 1) sprintf (items[13], "Type: I2C (24Cxx)"); else if (sram.custom == 2) sprintf (items[13], "Type: SPI (25x512/95x512)"); else if (sram.custom == 3) sprintf (items[13], "Type: I2C (93C46)"); else if (sram.detected) sprintf (items[13], "SRAM End: $%06X", sram.end); else if (sram.on) sprintf (items[13], "SRAM enabled by default"); else sprintf (items[13], "SRAM disabled by default"); if (region_code == REGION_USA) sprintf (items[14], "Region Code: %s (USA)", rominfo.country); else if (region_code == REGION_EUROPE) sprintf (items[14], "Region Code: %s (EUR)", rominfo.country); else if (region_code == REGION_JAPAN_NTSC) sprintf (items[14], "Region Code: %s (JPN)", rominfo.country); else if (region_code == REGION_JAPAN_PAL) sprintf (items[14], "Region Code: %s (JPN-PAL)", rominfo.country); GUI_TextWindow(&menu_main, "ROM Header Info", items, 15, 15); } /*************************************************************************** * Show credits ***************************************************************************/ static void showcredits(void) { int offset = 0; gx_texture *texture = gxTextureOpenPNG(Bg_credits_png,0); s16 p = 0; while (!p) { gxClearScreen ((GXColor)BLACK); if (texture) gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); FONT_writeCenter("Genesis Plus Core", 24, 0, 640, 480 - offset, (GXColor)LIGHT_BLUE); FONT_writeCenter("improved emulation code, fixes & extra features by Eke-Eke", 18, 0, 640, 516 - offset, (GXColor)WHITE); FONT_writeCenter("original 1.3 version by Charles MacDonald", 18, 0, 640, 534 - offset, (GXColor)WHITE); FONT_writeCenter("original Z80 core by Juergen Buchmueller", 18, 0, 640, 552 - offset, (GXColor)WHITE); FONT_writeCenter("original 68k core (Musashi) by Karl Stenerud", 18, 0, 640, 570 - offset, (GXColor)WHITE); FONT_writeCenter("original YM2612/2413 cores by Jarek Burczynski, Tatsuyuki Satoh", 18, 0, 640, 588 - offset, (GXColor)WHITE); FONT_writeCenter("original SN76489 core by Maxim", 18, 0, 640, 606 - offset, (GXColor)WHITE); FONT_writeCenter("SVP core by Gravydas Ignotas (Notaz)", 18, 0, 640, 624 - offset, (GXColor)WHITE); FONT_writeCenter("Blip Buffer Library & NTSC Video Filter by Shay Green (Blargg)", 18, 0, 640, 642 - offset, (GXColor)WHITE); FONT_writeCenter("3-Band EQ implementation by Neil C", 18, 0, 640, 660 - offset, (GXColor)WHITE); FONT_writeCenter("Special thanks to ...", 20, 0, 640, 700 - offset, (GXColor)LIGHT_GREEN); FONT_writeCenter("Nemesis, Tasco Deluxe, Bart Trzynadlowski, Jorge Cwik, Haze,", 18, 0, 640, 736 - offset, (GXColor)WHITE); FONT_writeCenter("Stef Dallongeville, Notaz, AamirM, Steve Snake, Charles MacDonald", 18, 0, 640, 754 - offset, (GXColor)WHITE); FONT_writeCenter("Spritesmind & SMS Power forums members for their technical help", 18, 0, 640, 772 - offset, (GXColor)WHITE); FONT_writeCenter("Gamecube & Wii port", 24, 0, 640, 830 - offset, (GXColor)LIGHT_BLUE); FONT_writeCenter("porting code, GUI engine & design by Eke-Eke", 18, 0, 640, 866 - offset, (GXColor)WHITE); FONT_writeCenter("original Gamecube port by Softdev, Honkeykong & Markcube", 18, 0, 640, 884 - offset, (GXColor)WHITE); FONT_writeCenter("original icons, logo & button design by Low Lines", 18, 0, 640, 906 - offset, (GXColor)WHITE); FONT_writeCenter("credit illustration by Orioto (Deviant Art)", 18, 0, 640, 924 - offset, (GXColor)WHITE); FONT_writeCenter("memory card icon design by Brakken", 18, 0, 640, 942 - offset, (GXColor)WHITE); FONT_writeCenter("libogc by Shagkur & various other contibutors", 18, 0, 640, 960 - offset, (GXColor)WHITE); FONT_writeCenter("libfat by Chism", 18, 0, 640, 978 - offset, (GXColor)WHITE); FONT_writeCenter("wiiuse by Michael Laforest (Para)", 18, 0, 640, 996 - offset, (GXColor)WHITE); FONT_writeCenter("asndlib & OGG player by Francisco Muoz (Hermes)", 18, 0, 640, 1014 - offset, (GXColor)WHITE); FONT_writeCenter("zlib, libpng & libtremor by their respective authors", 18, 0, 640, 1032 - offset, (GXColor)WHITE); FONT_writeCenter("devkitPPC by Wintermute", 18, 0, 640, 1050 - offset, (GXColor)WHITE); FONT_writeCenter("Special thanks to ...", 20, 0, 640, 1090 - offset, (GXColor)LIGHT_GREEN); FONT_writeCenter("Softdev, Tmbinc, Costis, Emukiddid, Team Twiizer", 18, 0, 640, 1126 - offset, (GXColor)WHITE); FONT_writeCenter("Brakken & former Tehskeen members for their support", 18, 0, 640, 1144 - offset, (GXColor)WHITE); FONT_writeCenter("Anca, my wife, for her patience & various ideas", 18, 0, 640, 1162 - offset, (GXColor)WHITE); gxSetScreen(); p = m_input.keys; gxSetScreen(); p |= m_input.keys; offset ++; if (offset > 1144) offset = 0; } gxTextureClose(&texture); } static void exitmenu(void) { char title[64]; char infos[64]; char *items[3] = { "View Credits", #ifdef HW_RVL "Exit to System Menu", #else "Reset System", #endif "Return to Loader", }; #ifdef HW_RVL extern u8 __Arena2Lo[]; sprintf(title, "%s (IOS %d)", VERSION, IOS_GetVersion()); if ((u32)SYS_GetArena2Lo() > (u32)__Arena2Lo) sprintf(infos, "%d bytes free (MEM2)", (u32)SYS_GetArena2Size()); else sprintf(infos, "%d bytes free (MEM1)", (u32)SYS_GetArena1Size()); #else sprintf(title, "%s (GCN)", VERSION); sprintf(infos, "%d bytes free", (u32)SYS_GetArenaSize()); #endif /* check if loader stub exists */ int maxitems = reload ? 3 : 2; /* display option window */ switch (GUI_OptionWindow(&menu_main, title, infos, items, maxitems)) { case 0: /* credits */ GUI_DeleteMenu(&menu_main); showcredits(); GUI_InitMenu(&menu_main); break; case 1: /* reset */ #ifdef HW_RVL gxTextureClose(&w_pointer); #endif GUI_DeleteMenu(&menu_main); GUI_FadeOut(); shutdown(); #ifdef HW_RVL SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); #else SYS_ResetSystem(SYS_HOTRESET,0,0); #endif break; case 2: /* exit to loader */ #ifdef HW_RVL gxTextureClose(&w_pointer); #endif GUI_DeleteMenu(&menu_main); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_SHUTDOWN,0,0); __lwp_thread_stopmultitasking(*reload); break; default: break; } } /**************************************************************************** * Main Menu * ****************************************************************************/ static void mainmenu_cb(void) { char temp[4]; gui_menu *m = &menu_main; int status = areplay_get_status(); /* Action Replay Switch current status */ if (status == AR_SWITCH_TRAINER) strcpy(temp,"TM"); else if (status == AR_SWITCH_ON) strcpy(temp,"ON"); else strcpy(temp,"OFF"); /* Display informations */ if (m->selected == 6) { FONT_writeCenter("Action\nReplay", 14, m->items[6].x, m->items[6].x + 54, m->items[6].y + (m->items[6].h - 28)/2 + 14, (GXColor)DARK_GREY); FONT_writeCenter(temp, 11, m->items[6].x + 56 + 3, m->items[6].x + 78 + 2, m->items[6].y + (m->items[6].h - 11)/2 + 11, (GXColor)DARK_GREY); } else { FONT_writeCenter("Action\nReplay", 12, m->items[6].x + 4, m->items[6].x + 54, m->items[6].y + (m->items[6].h - 24)/2 + 12, (GXColor)DARK_GREY); FONT_writeCenter(temp, 10, m->items[6].x + 56, m->items[6].x + 78, m->items[6].y + (m->items[6].h - 10)/2 + 10, (GXColor)DARK_GREY); } } void mainmenu(void) { char filename[MAXPATHLEN]; int status, quit = 0; /* Autosave Backup RAM */ slot_autosave(0, config.s_device); #ifdef HW_RVL /* Detect shutdown request */ if (Shutdown) { GUI_FadeOut(); shutdown(); if (reload) { /* exit to loader if requested */ SYS_ResetSystem(SYS_SHUTDOWN,0,0); __lwp_thread_stopmultitasking(*reload); } else { /* shutdown system by default */ SYS_ResetSystem(SYS_POWEROFF, 0, 0); } } /* Wiimote pointer */ w_pointer = gxTextureOpenPNG(generic_point_png,0); #endif gui_menu *m = &menu_main; /* Update main menu */ if (!m->screenshot) { if (config.bg_overlay) { bg_main[1].state |= IMAGE_VISIBLE; bg_misc[1].state |= IMAGE_VISIBLE; bg_ctrls[1].state |= IMAGE_VISIBLE; bg_list[1].state |= IMAGE_VISIBLE; bg_saves[2].state |= IMAGE_VISIBLE; } else { bg_main[1].state &= ~IMAGE_VISIBLE; bg_misc[1].state &= ~IMAGE_VISIBLE; bg_ctrls[1].state &= ~IMAGE_VISIBLE; bg_list[1].state &= ~IMAGE_VISIBLE; bg_saves[2].state &= ~IMAGE_VISIBLE; } if (system_hw) { m->screenshot = 128; m->bg_images[0].state &= ~IMAGE_VISIBLE; m->items[0].y -= 90; m->items[1].y -= 90; m->items[2].y -= 90; m->buttons[0].y -= 90; m->buttons[1].y -= 90; m->buttons[2].y -= 90; m->buttons[0].shift[1] = 3; m->buttons[1].shift[1] = 3; m->buttons[2].shift[1] = 3; m->buttons[3].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[4].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[5].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[7].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[8].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); m->buttons[9].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); if (areplay_get_status() >= 0) { menu_main.buttons[6].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); menu_main.items[6].data = Button_sm_grey_png; menu_main.cb = mainmenu_cb; menu_main.buttons[3].shift[1] = 3; menu_main.buttons[7].shift[0] = 1; menu_main.buttons[8].shift[2] = 2; } } } GUI_InitMenu(m); GUI_DrawMenuFX(m,10,0); while (quit == 0) { switch (GUI_RunMenu(m)) { /*** Load Game Menu ***/ case 0: { GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); if (loadgamemenu()) { /* restart emulation */ reloadrom(); /* check current controller configuration */ if (!gx_input_FindDevices()) { GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); GUI_WaitPrompt("Error","Invalid Controllers Settings"); break; } /* exit to game and reinitialize emulation */ gxClearScreen((GXColor)BLACK); gxSetScreen(); quit = 1; break; } GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); break; } /*** Options Menu */ case 1: { GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); optionmenu(); GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); break; } /*** Exit Menu ***/ case 2: { exitmenu(); break; } /*** Save Manager ***/ case 3: { GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); if (savemenu()) { /* check current controller configuration */ if (!gx_input_FindDevices()) { GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); GUI_WaitPrompt("Error","Invalid Controllers Settings"); break; } /* exit to game */ quit = 1; break; } GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); break; } /*** Soft / Hard reset ***/ case 4: { /* check current controller configuration */ if (!gx_input_FindDevices()) { GUI_WaitPrompt("Error","Invalid Controllers Settings"); break; } /* reinitialize emulation */ GUI_DrawMenuFX(m,10,1); GUI_DeleteMenu(m); gxClearScreen((GXColor)BLACK); gxSetScreen(); if (system_hw & SYSTEM_MD) { /* Soft Reset */ gen_reset(0); } else if ((system_hw == SYSTEM_SMS) && (region_code != REGION_JAPAN_NTSC)) { /* assert RESET input (export Master System 1 only) */ io_reg[0x0D] &= ~IO_RESET_HI; } else { /* Hard Reset */ system_init(); system_reset(); /* restore SRAM */ slot_autoload(0,config.s_device); } /* exit to game */ quit = 1; break; } /*** Cheats menu ***/ case 5: { GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); CheatMenu(); GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); break; } /*** Action Replay switch ***/ case 6: { status = (areplay_get_status() + 1) % (AR_SWITCH_TRAINER + 1); areplay_set_status(status); status = areplay_get_status(); GUI_DeleteMenu(m); if (status == AR_SWITCH_TRAINER) m->items[6].data = Button_sm_blue_png; else if (status == AR_SWITCH_ON) m->items[6].data = Button_sm_yellow_png; else m->items[6].data = Button_sm_grey_png; GUI_InitMenu(m); break; } /*** Return to Game ***/ case 7: case -1: { if (system_hw) { /* check current controller configuration */ if (!gx_input_FindDevices()) { GUI_WaitPrompt("Error","Invalid Controllers Settings"); break; } /* exit to game */ GUI_DrawMenuFX(m,10,1); GUI_DeleteMenu(m); quit = 1; } break; } /*** Game Capture ***/ case 8: { /* PNG filename */ sprintf(filename,"%s/snaps/%s.png", DEFAULT_PATH, rom_filename); /* Save file and return */ gxSaveScreenshot(filename); break; } /*** ROM information screen ***/ case 9: { showrominfo(); break; } } } /*** Remove any still held buttons ***/ while (PAD_ButtonsHeld(0)) { VIDEO_WaitVSync(); PAD_ScanPads(); } #ifdef HW_RVL while (WPAD_ButtonsHeld(0)) { VIDEO_WaitVSync(); WPAD_ScanPads(); } gxTextureClose(&w_pointer); /* USB Mouse support */ if ((input.system[0] == SYSTEM_MOUSE) || (input.system[1] == SYSTEM_MOUSE)) { MOUSE_Init(); } else { MOUSE_Deinit(); } #endif } libretro/msvc/msvc-2010-360.bat000664 001750 001750 00000007767 12702465756 017061 0ustar00sergiosergio000000 000000 @echo off @echo Setting environment for using Microsoft Visual Studio 2010 x86 tools. @call :GetVSCommonToolsDir @if "%VS100COMNTOOLS%"=="" goto error_no_VS100COMNTOOLSDIR @call "%VS100COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit @if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR @if "%FrameworkDir32%"=="" goto error_no_FrameworkDIR32 @if "%FrameworkVersion32%"=="" goto error_no_FrameworkVer32 @if "%Framework35Version%"=="" goto error_no_Framework35Version @set FrameworkDir=%FrameworkDir32% @set FrameworkVersion=%FrameworkVersion32% @if not "%WindowsSdkDir%" == "" ( @set "PATH=%WindowsSdkDir%bin\NETFX 4.0 Tools;%WindowsSdkDir%bin;%PATH%" @set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%" @set "LIB=%WindowsSdkDir%lib;%LIB%" ) @rem @rem Root of Visual Studio IDE installed files. @rem @set DevEnvDir=%VSINSTALLDIR%Common7\IDE\ @rem PATH @rem ---- @if exist "%VSINSTALLDIR%Team Tools\Performance Tools" ( @set "PATH=%VSINSTALLDIR%Team Tools\Performance Tools;%PATH%" ) @if exist "%ProgramFiles%\HTML Help Workshop" set PATH=%ProgramFiles%\HTML Help Workshop;%PATH% @if exist "%ProgramFiles(x86)%\HTML Help Workshop" set PATH=%ProgramFiles(x86)%\HTML Help Workshop;%PATH% @if exist "%VCINSTALLDIR%VCPackages" set PATH=%VCINSTALLDIR%VCPackages;%PATH% @set PATH=%FrameworkDir%%Framework35Version%;%PATH% @set PATH=%FrameworkDir%%FrameworkVersion%;%PATH% @set PATH=%VSINSTALLDIR%Common7\Tools;%PATH% @if exist "%VCINSTALLDIR%BIN" set PATH=%VCINSTALLDIR%BIN;%PATH% @set PATH=%DevEnvDir%;%PATH% @if exist "%VSINSTALLDIR%VSTSDB\Deploy" ( @set "PATH=%VSINSTALLDIR%VSTSDB\Deploy;%PATH%" ) @if not "%FSHARPINSTALLDIR%" == "" ( @set "PATH=%FSHARPINSTALLDIR%;%PATH%" ) @rem INCLUDE @rem ------- @if exist "%VCINSTALLDIR%ATLMFC\INCLUDE" set INCLUDE=%VCINSTALLDIR%ATLMFC\INCLUDE;%INCLUDE% @if exist "%VCINSTALLDIR%INCLUDE" set INCLUDE=%VCINSTALLDIR%INCLUDE;%INCLUDE% @rem LIB @rem --- @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIB=%VCINSTALLDIR%ATLMFC\LIB;%LIB% @if exist "%VCINSTALLDIR%LIB" set LIB=%VCINSTALLDIR%LIB;%LIB% @rem LIBPATH @rem ------- @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIBPATH=%VCINSTALLDIR%ATLMFC\LIB;%LIBPATH% @if exist "%VCINSTALLDIR%LIB" set LIBPATH=%VCINSTALLDIR%LIB;%LIBPATH% @set LIBPATH=%FrameworkDir%%Framework35Version%;%LIBPATH% @set LIBPATH=%FrameworkDir%%FrameworkVersion%;%LIBPATH% @goto end @REM ----------------------------------------------------------------------- :GetVSCommonToolsDir @set VS100COMNTOOLS= @call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKCU > nul 2>&1 @exit /B 0 :GetVSCommonToolsDirHelper32 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO ( @if "%%i"=="10.0" ( @SET "VS100COMNTOOLS=%%k" ) ) @if "%VS100COMNTOOLS%"=="" exit /B 1 @SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\" @exit /B 0 :GetVSCommonToolsDirHelper64 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO ( @if "%%i"=="10.0" ( @SET "VS100COMNTOOLS=%%k" ) ) @if "%VS100COMNTOOLS%"=="" exit /B 1 @SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\" @exit /B 0 @REM ----------------------------------------------------------------------- :error_no_VS100COMNTOOLSDIR @echo ERROR: Cannot determine the location of the VS Common Tools folder. @goto end :error_no_VSINSTALLDIR @echo ERROR: Cannot determine the location of the VS installation. @goto end :error_no_FrameworkDIR32 @echo ERROR: Cannot determine the location of the .NET Framework 32bit installation. @goto end :error_no_FrameworkVer32 @echo ERROR: Cannot determine the version of the .NET Framework 32bit installation. @goto end :error_no_Framework35Version @echo ERROR: Cannot determine the .NET Framework 3.5 version. @goto end :end msbuild msvc-2010-360.sln /p:Configuration=Release_LTCG /target:clean msbuild msvc-2010-360.sln /p:Configuration=Release_LTCG exit gx/fileio/fileio.c000664 001750 001750 00000020214 12702465756 015217 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive into ROM buffer. * Returns loaded ROM size (zero if an error occured). * * Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "file_load.h" #include "gui.h" /* * Zip file header definition */ typedef struct { unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 unsigned short zipversion __attribute__ ((__packed__)); unsigned short zipflags __attribute__ ((__packed__)); unsigned short compressionMethod __attribute__ ((__packed__)); unsigned short lastmodtime __attribute__ ((__packed__)); unsigned short lastmoddate __attribute__ ((__packed__)); unsigned int crc32 __attribute__ ((__packed__)); unsigned int compressedSize __attribute__ ((__packed__)); unsigned int uncompressedSize __attribute__ ((__packed__)); unsigned short filenameLength __attribute__ ((__packed__)); unsigned short extraDataLength __attribute__ ((__packed__)); } PKZIPHEADER; /* * Zip files are stored little endian * Support functions for short and int types */ static inline u32 FLIP32 (u32 b) { unsigned int c; c = (b & 0xff000000) >> 24; c |= (b & 0xff0000) >> 8; c |= (b & 0xff00) << 8; c |= (b & 0xff) << 24; return c; } static inline u16 FLIP16 (u16 b) { u16 c; c = (b & 0xff00) >> 8; c |= (b & 0xff) << 8; return c; } int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size = 0; char in[CHUNKSIZE]; char msg[64]; char type[16]; /* Open file */ FILE *fd = fopen(filename, "rb"); /* Autodetect needed System ROM files */ if (filename == CD_BIOS_US) { sprintf(type,"CD BIOS (USA)"); } else if (filename == CD_BIOS_EU) { sprintf(type,"CD BIOS (PAL)"); } else if (filename == CD_BIOS_JP) { sprintf(type,"CD BIOS (JAP)"); } else if (filename == AR_ROM) { sprintf(type,"Action Replay"); } else if (filename == GG_ROM) { sprintf(type,"Game Genie"); } else if (filename == SK_ROM) { sprintf(type,"S&K (2MB ROM)"); } else if (filename == SK_UPMEM) { sprintf(type,"S2&K (256K ROM)"); } else if ((filename == MS_BIOS_US) || (filename == MS_BIOS_EU) || (filename == MS_BIOS_JP) || (filename == GG_BIOS) || (filename == MD_BIOS)) { /* Mega Drive / Genesis, Master System & Game Gear BIOS are optional so we disable error messages */ SILENT = 1; } else { sprintf(type,"file"); } if (!fd) { sprintf(msg,"Unable to open %s", type); GUI_WaitPrompt("Error", msg); SILENT = 0; return 0; } /* Read first chunk */ fread(in, CHUNKSIZE, 1, fd); /* Detect Zip file */ if (memcmp(in, "PK", 2) == 0) { /* Inflate buffer */ char out[CHUNKSIZE]; /* PKZip header pointer */ PKZIPHEADER *pkzip = (PKZIPHEADER *) in; /* Retrieve uncompressed ROM size */ size = FLIP32(pkzip->uncompressedSize); /* Check ROM size */ if (size > MAXROMSIZE) { fclose(fd); GUI_WaitPrompt("Error","File is too large"); SILENT = 0; return 0; } else if (size > maxsize) { size = maxsize; } sprintf (msg, "Unzipping %d bytes ...", size); GUI_MsgBoxUpdate("Information",msg); /* Initialize zip stream */ z_stream zs; memset (&zs, 0, sizeof (z_stream)); zs.zalloc = Z_NULL; zs.zfree = Z_NULL; zs.opaque = Z_NULL; zs.avail_in = 0; zs.next_in = Z_NULL; int res = inflateInit2(&zs, -MAX_WBITS); if (res != Z_OK) { fclose(fd); sprintf(msg,"Unable to unzip %s", type); GUI_WaitPrompt("Error",msg); SILENT = 0; return 0; } /* Compressed filename offset */ int offset = sizeof (PKZIPHEADER) + FLIP16(pkzip->filenameLength); if (extension) { memcpy(extension, &in[offset - 3], 3); extension[3] = 0; } /* Initial Zip buffer offset */ offset += FLIP16(pkzip->extraDataLength); zs.next_in = (Bytef *)&in[offset]; /* Initial Zip remaining chunk size */ zs.avail_in = CHUNKSIZE - offset; /* Initialize output size */ size = 0; /* Start unzipping file */ do { /* Inflate data until output buffer is empty */ do { zs.avail_out = CHUNKSIZE; zs.next_out = (Bytef *) out; res = inflate(&zs, Z_NO_FLUSH); if (res == Z_MEM_ERROR) { inflateEnd(&zs); fclose(fd); sprintf(msg,"Unable to unzip %s", type); GUI_WaitPrompt("Error",msg); SILENT = 0; return 0; } offset = CHUNKSIZE - zs.avail_out; if ((size + offset) > maxsize) { offset = maxsize - size; } if (offset) { memcpy(buffer, out, offset); buffer += offset; size += offset; } } while ((zs.avail_out == 0) && (size < maxsize)); /* Read next chunk of zipped data */ fread(in, CHUNKSIZE, 1, fd); zs.next_in = (Bytef *)&in[0]; zs.avail_in = CHUNKSIZE; } while ((res != Z_STREAM_END) && (size < maxsize)); inflateEnd (&zs); } else { /* Get file size */ fseek(fd, 0, SEEK_END); size = ftell(fd); fseek(fd, 0, SEEK_SET); /* Check ROM size */ if (size > MAXROMSIZE) { fclose(fd); GUI_WaitPrompt("Error","File is too large"); SILENT = 0; return 0; } else if (size > maxsize) { size = maxsize; } sprintf((char *)msg,"Loading %d bytes ...", size); GUI_MsgBoxUpdate("Information", (char *)msg); /* filename extension */ if (extension) { memcpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } /* Read into buffer */ int left = size; while (left > CHUNKSIZE) { fread(buffer, CHUNKSIZE, 1, fd); buffer += CHUNKSIZE; left -= CHUNKSIZE; } /* Read remaining bytes */ fread(buffer, left, 1, fd); } /* Close file */ fclose(fd); /* Return loaded ROM size */ SILENT = 0; return size; } psp2/menu.h000664 001750 001750 00000000140 12702465756 013714 0ustar00sergiosergio000000 000000 #ifndef _MENU_H #define _MENU_H void InitMenu(); void DisplayMenu(); void TrashMenu(); #endif gx/fileio/history.c000664 001750 001750 00000011412 12702465756 015451 0ustar00sergiosergio000000 000000 /* * history.c * * Generic ROM history list managment * * Copyright Eke-Eke (2008-2012), based on original code from Martin Disibio (2008) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "history.h" t_history history; /**************************************************************************** * history_add_file * * Adds the given file path to the top of the history list, shifting each * existing entry in the history down one place. If given file path is * already in the list then the existing entry is (in effect) moved to the * top instead. ****************************************************************************/ void history_add_file(char *filepath, char *filename, u8 filetype) { /* Create the new entry for this path. */ t_history_entry newentry; strncpy(newentry.filepath, filepath, MAXJOLIET - 1); strncpy(newentry.filename, filename, MAXJOLIET - 1); newentry.filepath[MAXJOLIET - 1] = '\0'; newentry.filename[MAXJOLIET - 1] = '\0'; newentry.filetype = filetype; t_history_entry oldentry; /* Old entry is the one being shuffled down a spot. */ t_history_entry currentry; /* Curr entry is the one that just replaced old path. */ /* Initially set curr entry to the new value. */ memcpy(¤try, &newentry, sizeof(t_history_entry)); int i; for(i=0; i < NUM_HISTORY_ENTRIES; i++) { /* Save off the next entry. */ memcpy(&oldentry, &history.entries[i], sizeof(t_history_entry)); /* Overwrite with the previous entry. */ memcpy(&history.entries[i], ¤try, sizeof(t_history_entry)); /* Switch the old entry to the curr entry now. */ memcpy(¤try, &oldentry, sizeof(t_history_entry)); /* If the entry in the list at this spot matches the new entry then do nothing and let this entry get deleted. */ if(strcmp(newentry.filepath, currentry.filepath) == 0 && strcmp(newentry.filename, currentry.filename) == 0) break; } /* now save to disk */ history_save(); } void history_save() { /* open file */ char fname[MAXPATHLEN]; sprintf (fname, "%s/history.ini", DEFAULT_PATH); FILE *fp = fopen(fname, "wb"); if (fp) { /* write file */ fwrite(&history, sizeof(history), 1, fp); fclose(fp); } } void history_load(void) { /* open file */ char fname[MAXPATHLEN]; sprintf (fname, "%s/history.ini", DEFAULT_PATH); FILE *fp = fopen(fname, "rb"); if (fp) { /* read file */ if (fread(&history, sizeof(history), 1, fp) != 1) { /* an error ocurred, better clear hoistory */ memset(&history, 0, sizeof(history)); } /* close file */ fclose(fp); } } void history_default(void) { int i; for(i=0; i < NUM_HISTORY_ENTRIES; i++) memset(&history.entries[i], 0, sizeof(t_history_entry)); /* restore history */ history_load(); } core/cart_hw/svp/imageformat.txt000664 001750 001750 00000017112 12702465756 020145 0ustar00sergiosergio000000 000000 vscroll: 1 (0); 209 (26) - alternates every 4 frames vram range for patterns: 0000-999f (low scr 0000-395f,72e0-999f; high 3980-999f) name table address: c000 seen DMAs (in order): [300002-3026c3]->[0020-26e1] len 4961 [3026c2-303943]->[26e0-3961] len 2369 [303942-306003]->[72e0-99a1] len 4961 --- [306002-3086c3]->[3980-6041] len 4961 [3086c2-309943]->[6040-72c1] len 2369 [309942-30c003]->[72e0-99a2] len 4961 tile arrangement: 000: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 001: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 002: 001 003 005 007 009 00b 00d 00f 011 013 015 017 019 01b 01d 01f 021 023 025 027 029 02b 02d 02f 031 033 035 037 039 03b 03d 03f 003: 002 004 006 008 00a 00c 00e 010 012 014 016 018 01a 01c 01e 020 022 024 026 028 02a 02c 02e 030 032 034 036 038 03a 03c 03e 040 004: 041 043 045 047 049 04b 04d 04f 051 053 055 057 059 05b 05d 05f 061 063 065 067 069 06b 06d 06f 071 073 075 077 079 07b 07d 07f 005: 042 044 046 048 04a 04c 04e 050 052 054 056 058 05a 05c 05e 060 062 064 066 068 06a 06c 06e 070 072 074 076 078 07a 07c 07e 080 006: 081 083 085 087 089 08b 08d 08f 091 093 095 097 099 09b 09d 09f 0a1 0a3 0a5 0a7 0a9 0ab 0ad 0af 0b1 0b3 0b5 0b7 0b9 0bb 0bd 0bf 007: 082 084 086 088 08a 08c 08e 090 092 094 096 098 09a 09c 09e 0a0 0a2 0a4 0a6 0a8 0aa 0ac 0ae 0b0 0b2 0b4 0b6 0b8 0ba 0bc 0be 0c0 008: 0c1 0c3 0c5 0c7 0c9 0cb 0cd 0cf 0d1 0d3 0d5 0d7 0d9 0db 0dd 0df 0e1 0e3 0e5 0e7 0e9 0eb 0ed 0ef 0f1 0f3 0f5 0f7 0f9 0fb 0fd 0ff 009: 0c2 0c4 0c6 0c8 0ca 0cc 0ce 0d0 0d2 0d4 0d6 0d8 0da 0dc 0de 0e0 0e2 0e4 0e6 0e8 0ea 0ec 0ee 0f0 0f2 0f4 0f6 0f8 0fa 0fc 0fe 100 010: 101 103 105 107 109 10b 10d 10f 111 113 115 117 119 11b 11d 11f 121 123 125 127 129 12b 12d 12f 131 133 135 137 139 13b 13d 13f 011: 102 104 106 108 10a 10c 10e 110 112 114 116 118 11a 11c 11e 120 122 124 126 128 12a 12c 12e 130 132 134 136 138 13a 13c 13e 140 012: 141 143 145 147 149 14b 14d 14f 151 153 155 157 159 15b 15d 15f 161 163 165 167 169 16b 16d 16f 171 173 175 177 179 17b 17d 17f 013: 142 144 146 148 14a 14c 14e 150 152 154 156 158 15a 15c 15e 160 162 164 166 168 16a 16c 16e 170 172 174 176 178 17a 17c 17e 180 014: 181 183 185 187 189 18b 18d 18f 191 193 195 197 199 19b 19d 19f 1a1 1a3 1a5 1a7 1a9 1ab 1ad 1af 1b1 1b3 1b5 1b7 1b9 1bb 1bd 1bf 015: 182 184 186 188 18a 18c 18e 190 192 194 196 198 19a 19c 19e 1a0 1a2 1a4 1a6 1a8 1aa 1ac 1ae 1b0 1b2 1b4 1b6 1b8 1ba 1bc 1be 1c0 016: 1c1 1c3 1c5 1c7 1c9 397 399 39b 39d 39f 3a1 3a3 3a5 3a7 3a9 3ab 3ad 3af 3b1 3b3 3b5 3b7 3b9 3bb 3bd 3bf 3c1 3c3 3c5 3c7 3c9 3cb 017: 1c2 1c4 1c6 1c8 1ca 398 39a 39c 39e 3a0 3a2 3a4 3a6 3a8 3aa 3ac 3ae 3b0 3b2 3b4 3b6 3b8 3ba 3bc 3be 3c0 3c2 3c4 3c6 3c8 3ca 3cc 018: 3cd 3cf 3d1 3d3 3d5 3d7 3d9 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f1 3f3 3f5 3f7 3f9 3fb 3fd 3ff 401 403 405 407 409 40b 019: 3ce 3d0 3d2 3d4 3d6 3d8 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 3f0 3f2 3f4 3f6 3f8 3fa 3fc 3fe 400 402 404 406 408 40a 40c 020: 40d 40f 411 413 415 417 419 41b 41d 41f 421 423 425 427 429 42b 42d 42f 431 433 435 437 439 43b 43d 43f 441 443 445 447 449 44b 021: 40e 410 412 414 416 418 41a 41c 41e 420 422 424 426 428 42a 42c 42e 430 432 434 436 438 43a 43c 43e 440 442 444 446 448 44a 44c 022: 44d 44f 451 453 455 457 459 45b 45d 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 483 485 487 489 48b 023: 44e 450 452 454 456 458 45a 45c 45e 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 482 484 486 488 48a 48c 024: 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c1 4c3 4c5 4c7 4c9 4cb 025: 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c2 4c4 4c6 4c8 4ca 4cc 026: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 027: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 028: 1cc 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1de 1e0 1e2 1e4 1e6 1e8 1ea 1ec 1ee 1f0 1f2 1f4 1f6 1f8 1fa 1fc 1fe 200 202 204 206 208 20a 029: 1cd 1cf 1d1 1d3 1d5 1d7 1d9 1db 1dd 1df 1e1 1e3 1e5 1e7 1e9 1eb 1ed 1ef 1f1 1f3 1f5 1f7 1f9 1fb 1fd 1ff 201 203 205 207 209 20b 030: 20c 20e 210 212 214 216 218 21a 21c 21e 220 222 224 226 228 22a 22c 22e 230 232 234 236 238 23a 23c 23e 240 242 244 246 248 24a 031: 20d 20f 211 213 215 217 219 21b 21d 21f 221 223 225 227 229 22b 22d 22f 231 233 235 237 239 23b 23d 23f 241 243 245 247 249 24b 032: 24c 24e 250 252 254 256 258 25a 25c 25e 260 262 264 266 268 26a 26c 26e 270 272 274 276 278 27a 27c 27e 280 282 284 286 288 28a 033: 24d 24f 251 253 255 257 259 25b 25d 25f 261 263 265 267 269 26b 26d 26f 271 273 275 277 279 27b 27d 27f 281 283 285 287 289 28b 034: 28c 28e 290 292 294 296 298 29a 29c 29e 2a0 2a2 2a4 2a6 2a8 2aa 2ac 2ae 2b0 2b2 2b4 2b6 2b8 2ba 2bc 2be 2c0 2c2 2c4 2c6 2c8 2ca 035: 28d 28f 291 293 295 297 299 29b 29d 29f 2a1 2a3 2a5 2a7 2a9 2ab 2ad 2af 2b1 2b3 2b5 2b7 2b9 2bb 2bd 2bf 2c1 2c3 2c5 2c7 2c9 2cb 036: 2cc 2ce 2d0 2d2 2d4 2d6 2d8 2da 2dc 2de 2e0 2e2 2e4 2e6 2e8 2ea 2ec 2ee 2f0 2f2 2f4 2f6 2f8 2fa 2fc 2fe 300 302 304 306 308 30a 037: 2cd 2cf 2d1 2d3 2d5 2d7 2d9 2db 2dd 2df 2e1 2e3 2e5 2e7 2e9 2eb 2ed 2ef 2f1 2f3 2f5 2f7 2f9 2fb 2fd 2ff 301 303 305 307 309 30b 038: 30c 30e 310 312 314 316 318 31a 31c 31e 320 322 324 326 328 32a 32c 32e 330 332 334 336 338 33a 33c 33e 340 342 344 346 348 34a 039: 30d 30f 311 313 315 317 319 31b 31d 31f 321 323 325 327 329 32b 32d 32f 331 333 335 337 339 33b 33d 33f 341 343 345 347 349 34b 040: 34c 34e 350 352 354 356 358 35a 35c 35e 360 362 364 366 368 36a 36c 36e 370 372 374 376 378 37a 37c 37e 380 382 384 386 388 38a 041: 34d 34f 351 353 355 357 359 35b 35d 35f 361 363 365 367 369 36b 36d 36f 371 373 375 377 379 37b 37d 37f 381 383 385 387 389 38b 042: 38c 38e 390 392 394 397 399 39b 39d 39f 3a1 3a3 3a5 3a7 3a9 3ab 3ad 3af 3b1 3b3 3b5 3b7 3b9 3bb 3bd 3bf 3c1 3c3 3c5 3c7 3c9 3cb 043: 38d 38f 391 393 395 398 39a 39c 39e 3a0 3a2 3a4 3a6 3a8 3aa 3ac 3ae 3b0 3b2 3b4 3b6 3b8 3ba 3bc 3be 3c0 3c2 3c4 3c6 3c8 3ca 3cc 044: 3cd 3cf 3d1 3d3 3d5 3d7 3d9 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f1 3f3 3f5 3f7 3f9 3fb 3fd 3ff 401 403 405 407 409 40b 045: 3ce 3d0 3d2 3d4 3d6 3d8 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 3f0 3f2 3f4 3f6 3f8 3fa 3fc 3fe 400 402 404 406 408 40a 40c 046: 40d 40f 411 413 415 417 419 41b 41d 41f 421 423 425 427 429 42b 42d 42f 431 433 435 437 439 43b 43d 43f 441 443 445 447 449 44b 047: 40e 410 412 414 416 418 41a 41c 41e 420 422 424 426 428 42a 42c 42e 430 432 434 436 438 43a 43c 43e 440 442 444 446 448 44a 44c 048: 44d 44f 451 453 455 457 459 45b 45d 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 483 485 487 489 48b 049: 44e 450 452 454 456 458 45a 45c 45e 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 482 484 486 488 48a 48c 050: 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c1 4c3 4c5 4c7 4c9 4cb 051: 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c2 4c4 4c6 4c8 4ca 4cc 052: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 053: 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 gx/gui/cheats.h000664 001750 001750 00000004330 12702465756 014542 0ustar00sergiosergio000000 000000 /* * cheats.c * * Genesis Plus GX Cheats menu * * Copyright Eke-Eke (2010-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _CHEATS_H #define _CHEATS_H #define CHEATS_UPDATE() ROMCheatUpdate() extern void CheatMenu(void); extern void CheatLoad(void); extern void RAMCheatUpdate(void); extern void ROMCheatUpdate(void); #endif psp2/menu.c000664 001750 001750 00000111446 12702465756 013723 0ustar00sergiosergio000000 000000 #include "menu.h" #include #include #include #include #include #include #include "emumain.h" #include "shared.h" #include "psplib/pl_file.h" #include "psplib/image.h" #include "psplib/ui.h" #include "psplib/pl_menu.h" #include "psplib/ctrl.h" #include "psplib/pl_util.h" #include "psplib/pl_psp.h" #include "psplib/pl_ini.h" #include "psplib/pl_rewind.h" #define TAB_QUICKLOAD 0 #define TAB_STATE 1 #define TAB_CONTROL 2 #define TAB_OPTION 3 #define TAB_SYSTEM 4 #define TAB_ABOUT 5 #define TAB_MAX TAB_SYSTEM #define OPTION_DISPLAY_MODE 0x01 #define OPTION_SYNC_FREQ 0x02 #define OPTION_FRAMESKIP 0x03 #define OPTION_VSYNC 0x04 #define OPTION_CLOCK_FREQ 0x05 #define OPTION_SHOW_FPS 0x06 #define OPTION_CONTROL_MODE 0x07 #define OPTION_ANIMATE 0x08 #define OPTION_AUTOFIRE 0x09 #define OPTION_REWIND_SAVE_RATE 0x0A #define OPTION_REWIND_REPLAY_DELAY 0x0B #define SYSTEM_SCRNSHOT 0x11 #define SYSTEM_RESET 0x12 #define SYSTEM_VERT_STRIP 0x13 #define SYSTEM_SOUND_ENGINE 0x14 #define SYSTEM_SOUND_BOOST 0x15 extern PspImage *Screen; extern pl_rewind Rewinder; EmulatorOptions Options; static int ControlsModified; static int TabIndex; static int ResumeEmulation; static PspImage *Background; static PspImage *NoSaveIcon; static const char *QuickloadFilter[] = { "BIN", "SMS", "GG", "ZIP", '\0' }, PresentSlotText[] = "\026\244\020 Save\t\026\001\020 Load\t\026\243\020 Delete", EmptySlotText[] = "\026\244\020 Save", ControlHelpText[] = "\026\250\020 Change mapping\t\026\243\020 Load defaults"; pl_file_path CurrentGame = "", GamePath, SaveStatePath, ScreenshotPath; #define SET_AS_CURRENT_GAME(filename) \ strncpy(CurrentGame, filename, sizeof(CurrentGame) - 1) #define CURRENT_GAME (CurrentGame) #define GAME_LOADED (CurrentGame[0] != '\0') #define WIDTH 256 #define HEIGHT 192 /* Tab labels */ static const char *TabLabel[] = { "Game", "Save/Load", "Controls", "Options", "System", "About" }; static void LoadOptions(); static int SaveOptions(); static void InitButtonConfig(); static int SaveButtonConfig(); static int LoadButtonConfig(); static void DisplayStateTab(); static PspImage* LoadStateIcon(const char *path); static int LoadState(const char *path); static PspImage* SaveState(const char *path, PspImage *icon); static int OnMenuItemChanged(const struct PspUiMenu *uimenu, pl_menu_item* item, const pl_menu_option* option); static int OnMenuOk(const void *uimenu, const void* sel_item); static int OnMenuButtonPress(const struct PspUiMenu *uimenu, pl_menu_item* sel_item, u32 button_mask); static int OnSplashButtonPress(const struct PspUiSplash *splash, u32 button_mask); static void OnSplashRender(const void *uiobject, const void *null); static int OnGenericCancel(const void *uiobject, const void *param); static void OnGenericRender(const void *uiobject, const void *item_obj); static int OnGenericButtonPress(const PspUiFileBrowser *browser, const char *path, u32 button_mask); static int OnSaveStateOk(const void *gallery, const void *item); static int OnSaveStateButtonPress(const PspUiGallery *gallery, pl_menu_item* item, u32 button_mask); static int OnQuickloadOk(const void *browser, const void *path); void OnSystemRender(const void *uiobject, const void *item_obj); /* Menu options */ PL_MENU_OPTIONS_BEGIN(ToggleOptions) PL_MENU_OPTION("Disabled", 0) PL_MENU_OPTION("Enabled", 1) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(ScreenSizeOptions) PL_MENU_OPTION("Actual size", DISPLAY_MODE_UNSCALED) PL_MENU_OPTION("4:3 scaled (2x)", DISPLAY_MODE_2X) PL_MENU_OPTION("4:3 scaled (3x)", DISPLAY_MODE_3X) PL_MENU_OPTION("4:3 scaled (fit height)", DISPLAY_MODE_FIT_HEIGHT) PL_MENU_OPTION("16:9 scaled (fit screen)", DISPLAY_MODE_FILL_SCREEN) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(FrameLimitOptions) PL_MENU_OPTION("Disabled", 0) PL_MENU_OPTION("60 fps (NTSC)", 60) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(FrameSkipOptions) PL_MENU_OPTION("No skipping", 0) PL_MENU_OPTION("Skip 1 frame", 1) PL_MENU_OPTION("Skip 2 frames", 2) PL_MENU_OPTION("Skip 3 frames", 3) PL_MENU_OPTION("Skip 4 frames", 4) PL_MENU_OPTION("Skip 5 frames", 5) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(PspClockFreqOptions) PL_MENU_OPTION("222 MHz", 222) PL_MENU_OPTION("266 MHz", 266) PL_MENU_OPTION("300 MHz", 300) PL_MENU_OPTION("333 MHz", 333) PL_MENU_OPTION("444 MHz", 444) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(AutofireOptions) PL_MENU_OPTION("Once every 3 frames", 2) PL_MENU_OPTION("Once every 10 frames", 9) PL_MENU_OPTION("Once every 30 frames", 29) PL_MENU_OPTION("Once every 60 frames", 59) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(ControlModeOptions) PL_MENU_OPTION("\026\242\020 cancels, \026\241\020 confirms (US)", 0) PL_MENU_OPTION("\026\241\020 cancels, \026\242\020 confirms (Japan)", 1) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(RewindSaveRateOptions) PL_MENU_OPTION("Smoother", 2) PL_MENU_OPTION("Longer", 5) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(RewindReplayDelayOptions) PL_MENU_OPTION("50 ms", 50) PL_MENU_OPTION("100 ms", 100) PL_MENU_OPTION("500 ms", 500) PL_MENU_OPTION("1 s", 1000) PL_MENU_OPTION("2 s", 2000) PL_MENU_OPTIONS_END PL_MENU_OPTIONS_BEGIN(ButtonMapOptions) /* Unmapped */ PL_MENU_OPTION("None", 0) /* Special */ PL_MENU_OPTION("Special: Open Menu", SPC|SPC_MENU) PL_MENU_OPTION("Special: Rewind", SPC|SPC_REWIND) /* Joystick */ PL_MENU_OPTION("Joystick Up", JOY|INPUT_UP) PL_MENU_OPTION("Joystick Down", JOY|INPUT_DOWN) PL_MENU_OPTION("Joystick Left", JOY|INPUT_LEFT) PL_MENU_OPTION("Joystick Right", JOY|INPUT_RIGHT) PL_MENU_OPTION("Joystick Button A", JOY|INPUT_A) PL_MENU_OPTION("Joystick Button B", JOY|INPUT_B) PL_MENU_OPTION("Joystick Button C", JOY|INPUT_C) PL_MENU_OPTION("Joystick Button I (autofire)", AFI|INPUT_BUTTON1) PL_MENU_OPTION("Joystick Button II (autofire)", AFI|INPUT_BUTTON2) /* Joystick */ PL_MENU_OPTION("Start (GG) / Pause (SMS)", JOY|INPUT_START) PL_MENU_OPTIONS_END /* Menu items */ PL_MENU_ITEMS_BEGIN(OptionMenuDef) PL_MENU_HEADER("Video") PL_MENU_ITEM("Screen size", OPTION_DISPLAY_MODE, ScreenSizeOptions, "\026\250\020 Change screen size") PL_MENU_HEADER("Input") PL_MENU_ITEM("Rate of autofire", OPTION_AUTOFIRE, AutofireOptions, "\026\250\020 Adjust rate of autofire") PL_MENU_HEADER("Performance") PL_MENU_ITEM("Frame limiter", OPTION_SYNC_FREQ, FrameLimitOptions, "\026\250\020 Change screen update frequency") PL_MENU_ITEM("Frame skipping", OPTION_FRAMESKIP, FrameSkipOptions, "\026\250\020 Change number of frames skipped per update") PL_MENU_ITEM("VSync", OPTION_VSYNC, ToggleOptions, "\026\250\020 Enable to reduce tearing; disable to increase speed") PL_MENU_ITEM("PSP clock frequency", OPTION_CLOCK_FREQ, PspClockFreqOptions, "\026\250\020 Larger values: faster emulation, faster battery depletion (default: 222MHz)") PL_MENU_ITEM("Show FPS counter", OPTION_SHOW_FPS, ToggleOptions, "\026\250\020 Show/hide the frames-per-second counter") /* PL_MENU_HEADER("Time rewind") PL_MENU_ITEM("Rewind recording mode", OPTION_REWIND_SAVE_RATE, RewindSaveRateOptions, "\026\250\020 Change rewind saving frequency") PL_MENU_ITEM("Rewind delay", OPTION_REWIND_REPLAY_DELAY, RewindReplayDelayOptions, "\026\250\020 Change delay between frames") */ PL_MENU_HEADER("Menu") PL_MENU_ITEM("Button mode", OPTION_CONTROL_MODE, ControlModeOptions, "\026\250\020 Change OK and Cancel button mapping") PL_MENU_ITEM("Animations", OPTION_ANIMATE, ToggleOptions, "\026\250\020 Enable/disable in-menu animations") PL_MENU_ITEMS_END PL_MENU_ITEMS_BEGIN(ControlMenuDef) PL_MENU_ITEM(PSP_CHAR_ANALUP, MAP_ANALOG_UP, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_ANALDOWN, MAP_ANALOG_DOWN, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_ANALLEFT, MAP_ANALOG_LEFT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_ANALRIGHT, MAP_ANALOG_RIGHT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_UP, MAP_BUTTON_UP, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_DOWN, MAP_BUTTON_DOWN, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_LEFT, MAP_BUTTON_LEFT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_RIGHT, MAP_BUTTON_RIGHT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_SQUARE, MAP_BUTTON_SQUARE, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_CROSS, MAP_BUTTON_CROSS, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_CIRCLE, MAP_BUTTON_CIRCLE, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_TRIANGLE, MAP_BUTTON_TRIANGLE, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_LTRIGGER, MAP_BUTTON_LTRIGGER, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_RTRIGGER, MAP_BUTTON_RTRIGGER, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_SELECT, MAP_BUTTON_SELECT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_START, MAP_BUTTON_START, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_LTRIGGER"+"PSP_CHAR_RTRIGGER, MAP_BUTTON_LRTRIGGERS, ButtonMapOptions, ControlHelpText) PL_MENU_ITEM(PSP_CHAR_START"+"PSP_CHAR_SELECT, MAP_BUTTON_STARTSELECT, ButtonMapOptions, ControlHelpText) PL_MENU_ITEMS_END PL_MENU_ITEMS_BEGIN(SystemMenuDef) PL_MENU_HEADER("Video") PL_MENU_ITEM("Vertical bar", SYSTEM_VERT_STRIP, ToggleOptions, "\026\250\020 Show/hide the leftmost vertical bar (SMS)") PL_MENU_HEADER("System") PL_MENU_ITEM("Reset", SYSTEM_RESET, NULL, "\026\001\020 Reset") PL_MENU_ITEM("Save screenshot", SYSTEM_SCRNSHOT, NULL, "\026\001\020 Save screenshot") PL_MENU_ITEMS_END PspUiSplash SplashScreen = { OnSplashRender, OnGenericCancel, OnSplashButtonPress, NULL }; PspUiGallery SaveStateGallery = { OnGenericRender, /* OnRender() */ OnSaveStateOk, /* OnOk() */ OnGenericCancel, /* OnCancel() */ OnSaveStateButtonPress, /* OnButtonPress() */ NULL /* Userdata */ }; PspUiMenu OptionUiMenu = { OnGenericRender, /* OnRender() */ OnMenuOk, /* OnOk() */ OnGenericCancel, /* OnCancel() */ OnMenuButtonPress, /* OnButtonPress() */ OnMenuItemChanged, /* OnItemChanged() */ }; PspUiMenu ControlUiMenu = { OnGenericRender, /* OnRender() */ OnMenuOk, /* OnOk() */ OnGenericCancel, /* OnCancel() */ OnMenuButtonPress, /* OnButtonPress() */ OnMenuItemChanged, /* OnItemChanged() */ }; PspUiFileBrowser QuickloadBrowser = { OnGenericRender, OnQuickloadOk, OnGenericCancel, OnGenericButtonPress, QuickloadFilter, 0 }; PspUiMenu SystemUiMenu = { OnSystemRender, /* OnRender() */ OnMenuOk, /* OnOk() */ OnGenericCancel, /* OnCancel() */ OnMenuButtonPress, /* OnButtonPress() */ OnMenuItemChanged, /* OnItemChanged() */ }; /* Game configuration (includes button maps) */ struct ButtonConfig ActiveConfig; /* Default configuration */ struct ButtonConfig DefaultConfig = { { JOY|INPUT_UP, /* Analog Up */ JOY|INPUT_DOWN, /* Analog Down */ JOY|INPUT_LEFT, /* Analog Left */ JOY|INPUT_RIGHT, /* Analog Right */ JOY|INPUT_UP, /* D-pad Up */ JOY|INPUT_DOWN, /* D-pad Down */ JOY|INPUT_LEFT, /* D-pad Left */ JOY|INPUT_RIGHT, /* D-pad Right */ JOY|INPUT_A,/* Square */ JOY|INPUT_B,/* Cross */ JOY|INPUT_C,/* Circle */ 0, /* Triangle */ 0, /* L Trigger */ 0, /* R Trigger */ 0, /* Select */ JOY|INPUT_START, /* Start */ SPC|SPC_MENU, /* L+R Triggers */ 0, /* Start+Select */ } }; /* Button masks */ const u64 ButtonMask[] = { PSP_CTRL_LTRIGGER | PSP_CTRL_RTRIGGER, PSP_CTRL_START | PSP_CTRL_SELECT, PSP_CTRL_ANALUP, PSP_CTRL_ANALDOWN, PSP_CTRL_ANALLEFT, PSP_CTRL_ANALRIGHT, PSP_CTRL_UP, PSP_CTRL_DOWN, PSP_CTRL_LEFT, PSP_CTRL_RIGHT, PSP_CTRL_SQUARE, PSP_CTRL_CROSS, PSP_CTRL_CIRCLE, PSP_CTRL_TRIANGLE, PSP_CTRL_LTRIGGER, PSP_CTRL_RTRIGGER, PSP_CTRL_SELECT, PSP_CTRL_START, 0 /* End */ }; /* Button map ID's */ const int ButtonMapId[] = { MAP_BUTTON_LRTRIGGERS, MAP_BUTTON_STARTSELECT, MAP_ANALOG_UP, MAP_ANALOG_DOWN, MAP_ANALOG_LEFT, MAP_ANALOG_RIGHT, MAP_BUTTON_UP, MAP_BUTTON_DOWN, MAP_BUTTON_LEFT, MAP_BUTTON_RIGHT, MAP_BUTTON_SQUARE, MAP_BUTTON_CROSS, MAP_BUTTON_CIRCLE, MAP_BUTTON_TRIANGLE, MAP_BUTTON_LTRIGGER, MAP_BUTTON_RTRIGGER, MAP_BUTTON_SELECT, MAP_BUTTON_START, -1 /* End */ }; void InitMenu() { /* Reset variables */ TabIndex = TAB_ABOUT; Background = NULL; /* Initialize paths */ sprintf(SaveStatePath, "%ssavedata/", pl_psp_get_app_directory()); sprintf(ScreenshotPath, "%sscreenshot/", pl_psp_get_app_directory()); sprintf(GamePath, "%s", pl_psp_get_app_directory()); if (!pl_file_exists(SaveStatePath)) pl_file_mkdir_recursive(SaveStatePath); /* Initialize options */ LoadOptions(); InitEmulator(); /* Load the background image */ pl_file_path background; snprintf(background, sizeof(background) - 1, "%sbackground.png", pl_psp_get_app_directory()); Background = pspImageLoadPng(background); //Background = pspImageLoadPng("background.png"); /* Init NoSaveState icon image */ NoSaveIcon = pspImageCreate(136, 114, PSP_IMAGE_16BPP); pspImageClear(NoSaveIcon, RGB(0x0c,0,0x3f)); /* Initialize state menu */ int i; pl_menu_item *item; for (i = 0; i < 10; i++) { item = pl_menu_append_item(&SaveStateGallery.Menu, i, NULL); pl_menu_set_item_help_text(item, EmptySlotText); } /* Initialize menus */ pl_menu_create(&SystemUiMenu.Menu, SystemMenuDef); pl_menu_create(&OptionUiMenu.Menu, OptionMenuDef); pl_menu_create(&ControlUiMenu.Menu, ControlMenuDef); /* Load default configuration */ LoadButtonConfig(); /* Initialize UI components */ UiMetric.Background = Background; UiMetric.Font = &PspStockFont; UiMetric.Left = 16; UiMetric.Top = 48; UiMetric.Right = 944; UiMetric.Bottom = 500; UiMetric.OkButton = (!Options.ControlMode) ? PSP_CTRL_CROSS : PSP_CTRL_CIRCLE; UiMetric.CancelButton = (!Options.ControlMode) ? PSP_CTRL_CIRCLE : PSP_CTRL_CROSS; UiMetric.ScrollbarColor = PSP_COLOR_GRAY; UiMetric.ScrollbarBgColor = 0x44ffffff; UiMetric.ScrollbarWidth = 10; UiMetric.TextColor = PSP_COLOR_GRAY; UiMetric.SelectedColor = PSP_COLOR_YELLOW; UiMetric.SelectedBgColor = COLOR(0xff,0xff,0xff,0x44); UiMetric.StatusBarColor = PSP_COLOR_WHITE; UiMetric.BrowserFileColor = PSP_COLOR_GRAY; UiMetric.BrowserDirectoryColor = PSP_COLOR_YELLOW; UiMetric.GalleryIconsPerRow = 5; UiMetric.GalleryIconMarginWidth = 8; UiMetric.MenuItemMargin = 20; UiMetric.MenuSelOptionBg = PSP_COLOR_BLACK; UiMetric.MenuOptionBoxColor = PSP_COLOR_GRAY; UiMetric.MenuOptionBoxBg = COLOR(0, 0, 33, 0xBB); UiMetric.MenuDecorColor = PSP_COLOR_YELLOW; UiMetric.DialogFogColor = COLOR(0, 0, 0, 88); UiMetric.TitlePadding = 4; UiMetric.TitleColor = PSP_COLOR_WHITE; UiMetric.MenuFps = 30; UiMetric.TabBgColor = COLOR(0x74,0x74,0xbe,0xff); UiMetric.BrowserScreenshotPath = ScreenshotPath; UiMetric.BrowserScreenshotDelay = 30; } void DisplayMenu() { int i; pl_menu_item *item; /* Menu loop */ do { ResumeEmulation = 0; /* Set normal clock frequency */ pl_psp_set_clock_freq(222); /* Set buttons to autorepeat */ pspCtrlSetPollingMode(PSP_CTRL_AUTOREPEAT); do { /* Display appropriate tab */ switch (TabIndex) { case TAB_STATE: DisplayStateTab(); break; case TAB_CONTROL: /* Load current button mappings */ for (item = ControlUiMenu.Menu.items, i = 0; item; item = item->next, i++) pl_menu_select_option_by_value(item, (void*)ActiveConfig.ButtonMap[i]); ControlsModified = 0; pspUiOpenMenu(&ControlUiMenu, NULL); if (ControlsModified) SaveButtonConfig(); break; case TAB_QUICKLOAD: pspUiOpenBrowser(&QuickloadBrowser, (GAME_LOADED) ? CURRENT_GAME : GamePath); break; case TAB_SYSTEM: item = pl_menu_find_item_by_id(&SystemUiMenu.Menu, SYSTEM_VERT_STRIP); pl_menu_select_option_by_value(item, (void*)Options.VertStrip); pspUiOpenMenu(&SystemUiMenu, NULL); break; case TAB_OPTION: /* Init menu options */ item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_DISPLAY_MODE); pl_menu_select_option_by_value(item, (void*)Options.DisplayMode); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_SYNC_FREQ); pl_menu_select_option_by_value(item, (void*)Options.UpdateFreq); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_FRAMESKIP); pl_menu_select_option_by_value(item, (void*)(int)Options.Frameskip); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_VSYNC); pl_menu_select_option_by_value(item, (void*)Options.VSync); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_CLOCK_FREQ); pl_menu_select_option_by_value(item, (void*)Options.ClockFreq); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_SHOW_FPS); pl_menu_select_option_by_value(item, (void*)Options.ShowFps); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_CONTROL_MODE); pl_menu_select_option_by_value(item, (void*)Options.ControlMode); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_ANIMATE); pl_menu_select_option_by_value(item, (void*)UiMetric.Animate); item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_AUTOFIRE); pl_menu_select_option_by_value(item, (void*)Options.AutoFire); if ((item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_REWIND_SAVE_RATE))) pl_menu_select_option_by_value(item, (void*)Options.RewindSaveRate); if ((item = pl_menu_find_item_by_id(&OptionUiMenu.Menu, OPTION_REWIND_REPLAY_DELAY))) pl_menu_select_option_by_value(item, (void*)Options.RewindReplayDelay); pspUiOpenMenu(&OptionUiMenu, NULL); break; case TAB_ABOUT: pspUiSplashScreen(&SplashScreen); break; } } while (!ExitPSP && !ResumeEmulation); if (!ExitPSP) { /* Set clock frequency during emulation */ pl_psp_set_clock_freq(Options.ClockFreq); /* Set buttons to normal mode */ pspCtrlSetPollingMode(PSP_CTRL_NORMAL); /* Resume emulation */ if (ResumeEmulation) { if (UiMetric.Animate) pspUiFadeout(); RunEmulator(); if (UiMetric.Animate) pspUiFadeout(); } } } while (!ExitPSP); } int OnGenericCancel(const void *uiobject, const void* param) { if (GAME_LOADED) ResumeEmulation = 1; return 1; } void OnSplashRender(const void *splash, const void *null) { int fh, i, x, y, height; const char *lines[] = { PSP_APP_NAME" version "PSP_APP_VER" ("__DATE__")", "\026https://github.com/frangarcj/Genesis-Plus-GX", " ", "2015 Frangarcj", "2006 eke-eke", "1998-2004 Charles MacDonald", NULL }; fh = pspFontGetLineHeight(UiMetric.Font); for (i = 0; lines[i]; i++); height = fh * (i - 1); /* Render lines */ for (i = 0, y = SCR_HEIGHT / 2 - height / 2; lines[i]; i++, y += fh) { x = SCR_WIDTH / 2 - pspFontGetTextWidth(UiMetric.Font, lines[i]) / 2; pspVideoPrint(UiMetric.Font, x, y, lines[i], PSP_COLOR_GRAY); } /* Render PSP status */ OnGenericRender(splash, null); } int OnSplashButtonPress(const struct PspUiSplash *splash, u32 button_mask) { return OnGenericButtonPress(NULL, NULL, button_mask); } /* Handles drawing of generic items */ void OnGenericRender(const void *uiobject, const void *item_obj) { /* Draw tabs */ int height = pspFontGetLineHeight(UiMetric.Font); int width; int i, x; for (i = 0, x = 5; i <= TAB_MAX; i++, x += width + 10) { width = -10; if (!GAME_LOADED && (i == TAB_STATE || i == TAB_SYSTEM)) continue; /* Determine width of text */ width = pspFontGetTextWidth(UiMetric.Font, TabLabel[i]); /* Draw background of active tab */ if (i == TabIndex) pspVideoFillRect(x - 5, 0, x + width + 5, height + 1, UiMetric.TabBgColor); /* Draw name of tab */ pspVideoPrint(UiMetric.Font, x, 0, TabLabel[i], PSP_COLOR_WHITE); } } int OnGenericButtonPress(const PspUiFileBrowser *browser, const char *path, u32 button_mask) { int tab_index; /* If L or R are pressed, switch tabs */ if (button_mask & PSP_CTRL_LTRIGGER) { TabIndex--; do { tab_index = TabIndex; if (!GAME_LOADED && (TabIndex == TAB_STATE || TabIndex == TAB_SYSTEM)) TabIndex--; if (TabIndex < 0) TabIndex = TAB_MAX; } while (tab_index != TabIndex); } else if (button_mask & PSP_CTRL_RTRIGGER) { TabIndex++; do { tab_index = TabIndex; if (!GAME_LOADED && (TabIndex == TAB_STATE || TabIndex == TAB_SYSTEM)) TabIndex++; if (TabIndex > TAB_MAX) TabIndex = 0; } while (tab_index != TabIndex); } else if ((button_mask & (PSP_CTRL_START | PSP_CTRL_SELECT)) == (PSP_CTRL_START | PSP_CTRL_SELECT)) { if (pl_util_save_vram_seq(ScreenshotPath, "ui")) pspUiAlert("Saved successfully"); else pspUiAlert("ERROR: Not saved"); return 0; } else return 0; return 1; } int OnMenuItemChanged(const struct PspUiMenu *uimenu, pl_menu_item* item, const pl_menu_option* option) { if (uimenu == &ControlUiMenu) { ControlsModified = 1; ActiveConfig.ButtonMap[item->id] = (unsigned int)option->value; } else { switch(item->id) { case SYSTEM_VERT_STRIP: Options.VertStrip = (int)option->value; break; case OPTION_DISPLAY_MODE: Options.DisplayMode = (int)option->value; break; case OPTION_SYNC_FREQ: Options.UpdateFreq = (int)option->value; break; case OPTION_FRAMESKIP: Options.Frameskip = (int)option->value; break; case OPTION_VSYNC: Options.VSync = (int)option->value; break; case OPTION_CLOCK_FREQ: Options.ClockFreq = (int)option->value; break; case OPTION_SHOW_FPS: Options.ShowFps = (int)option->value; break; case OPTION_CONTROL_MODE: Options.ControlMode = (int)option->value; UiMetric.OkButton = (!(int)option->value) ? PSP_CTRL_CROSS : PSP_CTRL_CIRCLE; UiMetric.CancelButton = (!(int)option->value) ? PSP_CTRL_CIRCLE : PSP_CTRL_CROSS; break; case OPTION_ANIMATE: UiMetric.Animate = (int)option->value; break; case OPTION_AUTOFIRE: Options.AutoFire = (int)option->value; break; case OPTION_REWIND_SAVE_RATE: Options.RewindSaveRate = (int)option->value; break; case OPTION_REWIND_REPLAY_DELAY: Options.RewindReplayDelay = (int)option->value; break; } SaveOptions(); } return 1; } int OnMenuOk(const void *uimenu, const void* sel_item) { if (uimenu == &ControlUiMenu) { /* Save to MS */ if (SaveButtonConfig()) pspUiAlert("Changes saved"); else pspUiAlert("ERROR: Changes not saved"); } else if (uimenu == &SystemUiMenu) { switch (((const pl_menu_item*)sel_item)->id) { case SYSTEM_RESET: /* Reset system */ if (pspUiConfirm("Reset the system?")) { ResumeEmulation = 1; system_reset(); pl_rewind_reset(&Rewinder); return 1; } break; case SYSTEM_SCRNSHOT: /* Save screenshot */ if (!pl_util_save_image_seq(ScreenshotPath, pl_file_get_filename(CURRENT_GAME), Screen)) pspUiAlert("ERROR: Screenshot not saved"); else pspUiAlert("Screenshot saved successfully"); break; } } return 0; } int OnMenuButtonPress(const struct PspUiMenu *uimenu, pl_menu_item* sel_item, u32 button_mask) { if (uimenu == &ControlUiMenu) { if (button_mask & PSP_CTRL_TRIANGLE) { pl_menu_item *item; int i; /* Load default mapping */ InitButtonConfig(); ControlsModified = 1; /* Modify the menu */ for (item = ControlUiMenu.Menu.items, i = 0; item; item = item->next, i++) pl_menu_select_option_by_value(item, (void*)DefaultConfig.ButtonMap[i]); return 0; } } return OnGenericButtonPress(NULL, NULL, button_mask); } int OnQuickloadOk(const void *browser, const void *path) { int first_time = 0; if (!GAME_LOADED) first_time = 1; if (!load_rom((char*)path)) { pspUiAlert("Error loading cartridge"); return 0; } SET_AS_CURRENT_GAME((char*)path); pl_file_get_parent_directory((const char*)path, GamePath, sizeof(GamePath)); /* Reset selected state */ SaveStateGallery.Menu.selected = NULL; if (first_time) { pspUiFlashMessage("Initializing for first-time use\nPlease wait..."); audio_init(SOUND_FREQUENCY, 0); system_init(); //error_init(); system_reset(); } else{ system_init(); system_reset(); audio_reset(); } pl_rewind_reset(&Rewinder); ResumeEmulation = 1; return 1; } int OnSaveStateOk(const void *gallery, const void *item) { if (!GAME_LOADED) return 0; char *path; const char *config_name = pl_file_get_filename(CURRENT_GAME); path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, ((const pl_menu_item*)item)->id); if (pl_file_exists(path) && pspUiConfirm("Load state?")) { if (LoadState(path)) { ResumeEmulation = 1; pl_rewind_reset(&Rewinder); pl_menu_find_item_by_id(&(((const PspUiGallery*)gallery)->Menu), ((const pl_menu_item*)item)->id); free(path); return 1; } pspUiAlert("ERROR: State failed to load"); } free(path); return 0; } int OnSaveStateButtonPress(const PspUiGallery *gallery, pl_menu_item *sel, u32 button_mask) { if (!GAME_LOADED) return 0; if (button_mask & PSP_CTRL_SQUARE || button_mask & PSP_CTRL_TRIANGLE) { char caption[32]; char *path; const char *config_name = pl_file_get_filename(CURRENT_GAME); path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, sel->id); do /* not a real loop; flow control construct */ { if (button_mask & PSP_CTRL_SQUARE) { if (pl_file_exists(path) && !pspUiConfirm("Overwrite existing state?")) break; pspUiFlashMessage("Saving, please wait ..."); PspImage *icon; if (!(icon = SaveState(path, Screen))) { pspUiAlert("ERROR: State not saved"); break; } SceIoStat stat; /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, help text */ sel->param = icon; pl_menu_set_item_help_text(sel, PresentSlotText); /* Get file modification time/date */ if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); pl_menu_set_item_caption(sel, caption); } else if (button_mask & PSP_CTRL_TRIANGLE) { if (!pl_file_exists(path) || !pspUiConfirm("Delete state?")) break; if (!pl_file_rm(path)) { pspUiAlert("ERROR: State not deleted"); break; } /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, caption */ sel->param = NoSaveIcon; pl_menu_set_item_help_text(sel, EmptySlotText); pl_menu_set_item_caption(sel, "Empty"); } } while (0); if (path) free(path); return 0; } return OnGenericButtonPress(NULL, NULL, button_mask); } /* Handles any special drawing for the system menu */ void OnSystemRender(const void *uiobject, const void *item_obj) { int w, h, x, y; w = Screen->Viewport.Width*1.5; h = Screen->Viewport.Height*1.5; x = SCR_WIDTH - w - 16; y = SCR_HEIGHT - h - 80; /* Draw a small representation of the screen */ pspVideoShadowRect(x, y, x + w - 1, y + h - 1, PSP_COLOR_BLACK, 3); pspVideoPutImage(Screen, x, y, w, h); pspVideoDrawRect(x, y, x + w - 1, y + h - 1, PSP_COLOR_GRAY); OnGenericRender(uiobject, item_obj); } static void DisplayStateTab() { if (!GAME_LOADED) { TabIndex++; return; } pl_menu_item *item, *sel; SceIoStat stat; char caption[32]; ScePspDateTime latest; const char *config_name = pl_file_get_filename(CURRENT_GAME); char *path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); char *game_name = strdup(config_name); char *dot = strrchr(game_name, '.'); if (dot) *dot='\0'; memset(&latest, 0, sizeof(latest)); /* Initialize icons */ sel = SaveStateGallery.Menu.items; for (item = SaveStateGallery.Menu.items; item; item = item->next) { sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, item->id); if (pl_file_exists(path)) { if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else { /* Determine the latest save state */ if (pl_util_date_compare(&latest, &stat.st_mtime) < 0) { sel = item; latest = stat.st_mtime; } sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); } pl_menu_set_item_caption(item, caption); item->param = LoadStateIcon(path); pl_menu_set_item_help_text(item, PresentSlotText); } else { pl_menu_set_item_caption(item, "Empty"); item->param = NoSaveIcon; pl_menu_set_item_help_text(item, EmptySlotText); } } free(path); /* Highlight the latest save state if none are selected */ if (SaveStateGallery.Menu.selected == NULL) SaveStateGallery.Menu.selected = sel; pspUiOpenGallery(&SaveStateGallery, game_name); free(game_name); /* Destroy any icons */ for (item = SaveStateGallery.Menu.items; item; item = item->next) if (item->param != NULL && item->param != NoSaveIcon) pspImageDestroy((PspImage*)item->param); } /* Initialize game configuration */ static void InitButtonConfig() { memcpy(&ActiveConfig, &DefaultConfig, sizeof(struct ButtonConfig)); } /* Load game configuration */ static int LoadButtonConfig() { pl_file_path path; snprintf(path, sizeof(path) - 1, "%sbuttons.cnf", pl_psp_get_app_directory()); /* Open file for reading */ FILE *file = fopen(path, "r"); /* If no configuration, load defaults */ if (!file) { InitButtonConfig(); return 1; } /* Read contents of struct */ int nread = fread(&ActiveConfig, sizeof(struct ButtonConfig), 1, file); fclose(file); if (nread != 1) { InitButtonConfig(); return 0; } return 1; } /* Save game configuration */ static int SaveButtonConfig() { pl_file_path path; snprintf(path, sizeof(path) - 1, "%sbuttons.cnf", pl_psp_get_app_directory()); /* Open file for writing */ FILE *file = fopen(path, "w"); if (!file) return 0; /* Write contents of struct */ int nwritten = fwrite(&ActiveConfig, sizeof(struct ButtonConfig), 1, file); fclose(file); return (nwritten == 1); } /* Load options */ void LoadOptions() { pl_file_path path; snprintf(path, sizeof(path) - 1, "%ssmsplus.ini", pl_psp_get_app_directory()); /* Initialize INI structure */ pl_ini_file init; pl_ini_load(&init, path); /* Load values */ Options.DisplayMode = pl_ini_get_int(&init, "Video", "Display Mode", DISPLAY_MODE_2X); Options.UpdateFreq = pl_ini_get_int(&init, "Video", "Update Frequency", 60); Options.Frameskip = pl_ini_get_int(&init, "Video", "Frameskip", 0); Options.VSync = pl_ini_get_int(&init, "Video", "VSync", 0); Options.ClockFreq = pl_ini_get_int(&init, "Video", "PSP Clock Frequency", 444); Options.ShowFps = pl_ini_get_int(&init, "Video", "Show FPS", 0); Options.ControlMode = pl_ini_get_int(&init, "Menu", "Control Mode", 0); UiMetric.Animate = pl_ini_get_int(&init, "Menu", "Animate", 1); Options.VertStrip = pl_ini_get_int(&init, "Game", "Vertical Strip", 1); Options.AutoFire = pl_ini_get_int(&init, "Input", "Autofire", 2); Options.RewindSaveRate = pl_ini_get_int(&init, "Enhancements", "Rewind Save Rate", 5); Options.RewindReplayDelay = pl_ini_get_int(&init, "Enhancements", "Rewind Replay Delay", 50); pl_ini_get_string(&init, "File", "Game Path", NULL, GamePath, sizeof(GamePath)); /* Clean up */ pl_ini_destroy(&init); } /* Save options */ static int SaveOptions() { pl_file_path path; snprintf(path, sizeof(path) - 1, "%ssmsplus.ini", pl_psp_get_app_directory()); /* Initialize INI structure */ pl_ini_file init; pl_ini_create(&init); /* Set values */ pl_ini_set_int(&init, "Video", "Display Mode", Options.DisplayMode); pl_ini_set_int(&init, "Video", "Update Frequency", Options.UpdateFreq); pl_ini_set_int(&init, "Video", "Frameskip", Options.Frameskip); pl_ini_set_int(&init, "Video", "VSync", Options.VSync); pl_ini_set_int(&init, "Video", "PSP Clock Frequency",Options.ClockFreq); pl_ini_set_int(&init, "Video", "Show FPS", Options.ShowFps); pl_ini_set_int(&init, "Menu", "Control Mode", Options.ControlMode); pl_ini_set_int(&init, "Menu", "Animate", UiMetric.Animate); pl_ini_set_int(&init, "Game", "Vertical Strip", Options.VertStrip); pl_ini_set_int(&init, "Input", "Autofire", Options.AutoFire); pl_ini_set_int(&init, "Enhancements", "Rewind Save Rate", Options.RewindSaveRate); pl_ini_set_int(&init, "Enhancements", "Rewind Replay Delay", Options.RewindReplayDelay); pl_ini_set_string(&init, "File", "Game Path", GamePath); /* Save INI file */ int status = pl_ini_save(&init, path); /* Clean up */ pl_ini_destroy(&init); return status; } /* Load state icon */ PspImage* LoadStateIcon(const char *path) { /* Open file for reading */ FILE *f = fopen(path, "r"); if (!f) return NULL; /* Load image */ PspImage *image = pspImageLoadPngFd(f); fclose(f); return image; } /* Load state */ int LoadState(const char *path) { /* Open file for reading */ FILE *f = fopen(path, "r"); if (!f) return 0; /* Load image into temporary object */ PspImage *image = pspImageLoadPngFd(f); pspImageDestroy(image); //system_load_state(f); fclose(f); return 1; } /* Save state */ PspImage* SaveState(const char *path, PspImage *icon) { /* Open file for writing */ FILE *f; if (!(f = fopen(path, "w"))) return NULL; /* Create thumbnail */ PspImage *thumb; thumb = (icon->Viewport.Width < 200) ? pspImageCreateCopy(icon) : pspImageCreateThumbnail(icon); if (!thumb) { fclose(f); return NULL; } /* Write the thumbnail */ if (!pspImageSavePngFd(f, thumb)) { pspImageDestroy(thumb); fclose(f); return NULL; } /* Save state */ //system_save_state(f); fclose(f); return thumb; } /* Release menu resources */ void TrashMenu() { TrashEmulator(); /* Save options */ SaveOptions(); /* Trash menus */ pl_menu_destroy(&SystemUiMenu.Menu); pl_menu_destroy(&OptionUiMenu.Menu); pl_menu_destroy(&ControlUiMenu.Menu); pl_menu_destroy(&SaveStateGallery.Menu); /* Trash images */ if (Background) pspImageDestroy(Background); if (NoSaveIcon) pspImageDestroy(NoSaveIcon); } /* Save or load SRAM */ void system_manage_sram(uint8 *sram, int slot, int mode) { FILE *fd; const char *config_name = pl_file_get_filename(CURRENT_GAME); char *path = (char*)malloc(sizeof(char) * (strlen(SaveStatePath) + strlen(config_name) + 8)); sprintf(path, "%s%s.srm", SaveStatePath, config_name); /*switch(mode) { case SRAM_SAVE: if(sms.save) { fd = fopen(path, "w"); if(fd) { fwrite(sram, 0x8000, 1, fd); fclose(fd); } } break; case SRAM_LOAD: fd = fopen(path, "r"); if(fd) { sms.save = 1; fread(sram, 0x8000, 1, fd); fclose(fd); } else {*/ /* No SRAM file, so initialize memory */ /* memset(sram, 0x00, 0x8000); } break; } */ free(path); } gx/images/Button_digit_over.png000664 001750 001750 00000004345 12702465756 020005 0ustar00sergiosergio000000 000000 PNG  IHDR((msBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time07/14/10pcVH9IDATx[lT3c vjA: NZ;Q"RUU$j5yi}EZO9z)J?}066v`׮]Noo/7xY5σLWb*4+vn3Ĥ⷇7pW¾)#G^={8s(ssyX rӤvZyI^y.Ϟ'n.Jïuvl(p( β~mĈ+F%X I`"OGg";|{h\׽/7==e֭>FW[kU^ɃѓQ)l-t:(Awq݈-]qث377%755ղyf>_ZH&Jf< 1G 0Xu,,FT}9yNfgg[ B"٘.MK)Dզ>TayUOP AB*Ԅ1!kxUjh IɸnsԓJᤈ" 7!1DZH cLh(jFq';Nqy!/D(!AJj` aVevIr hdTD'7(g%JQDJT 4(dWɵɪhB=""A)82=ȍMk4kmi"5դym_m3 v]r5ZDI,2rnBbuII?WJ!BΚMY_9`͚nTHj54Rd.]rl/DzcL )]Kn36IHǝ/!XZJjnWFBy0FtZ\0S8cZB'+h)\jn5Я0:eR:L,w.W #QR H+DT&T-5w!͘VJE(q6+uZ!!1ZZ&[mא3߂X%cѨ^Yĥ$.*BqF1Az/ L=u&&i\s+Ƃm u?&F)(#P-k-&zX;N!lk&{2D WI.9 $b{V*(KyaTq?L़4lL\@;>̦ nH  #pWxArOʐ7b3=tvvSNg׸ù ߯.Րb'GXٴ0"]`lv.\u2(&<Zϵ9?se.bsY$001y'[xz>O}=Pz1Ƙ4mmm9388??zٻw/{8ByzJrO2*%خi_Ž]"mPTLWW׋B%S,,,J%JiK%ZߵwJ) \.s92MMMAX|X,?}yT*OLOOzlnn?=&84IENDB`gx/gui/cheats.c000664 001750 001750 00000133276 12702465756 014551 0ustar00sergiosergio000000 000000 /* * cheats.c * * Genesis Plus GX Cheats menu * * Copyright Eke-Eke (2010-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "file_load.h" #include "cheats.h" #include "font.h" #include "gui.h" #define BG_COLOR_1 {0x49,0x49,0x49,0xff} #define BG_COLOR_2 {0x66,0x66,0x66,0xff} #define MAX_CHEATS (350) #define MAX_DESC_LENGTH (63) #ifdef HW_RVL extern const u8 Key_Minus_wii_png[]; extern const u8 Key_Plus_wii_png[]; #else extern const u8 Key_R_gcn_png[]; extern const u8 Key_L_gcn_png[]; #endif extern const u8 Key_DPAD_png[]; typedef struct { char code[12]; char text[MAX_DESC_LENGTH]; u8 enable; u16 data; u16 old; u32 address; u8 *prev; } CHEATENTRY; static int string_offset = 0; static int selection = 0; static int offset = 0; static int type = 0; static int maxcheats = 0; static int maxROMcheats = 0; static int maxRAMcheats = 0; static CHEATENTRY cheatlist[MAX_CHEATS]; static u8 cheatIndexes[MAX_CHEATS]; static void cheatmenu_cb(void); static gui_image star; static gui_image bar_over; static gui_image key_switch; static gui_image key_enable; static gui_image key_delete; /*****************************************************************************/ /* GUI Buttons data */ /*****************************************************************************/ static butn_data arrow_up_data = { {NULL,NULL}, {Button_up_png,Button_up_over_png} }; static butn_data arrow_down_data = { {NULL,NULL}, {Button_down_png,Button_down_over_png} }; static butn_data button_digit_data = { {NULL,NULL}, {Button_digit_png,Button_digit_over_png} }; /*****************************************************************************/ /* GUI Arrows button */ /*****************************************************************************/ static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; /*****************************************************************************/ /* GUI helpers */ /*****************************************************************************/ static gui_item action_cancel = { NULL,Key_B_png,"","Exit",10,422,28,28 }; static gui_item action_select = { NULL,Key_A_png,"","Edit Entry",602,422,28,28 }; /*****************************************************************************/ /* GUI Background images */ /*****************************************************************************/ static gui_image bg_cheats[7] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255}, {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,152}, {NULL,Frame_s1_png,IMAGE_SLIDE_RIGHT,411,109,372,296,76}, }; /*****************************************************************************/ /* Menu Items description */ /*****************************************************************************/ static gui_item items_cheats[30] = { {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"","Edit Entry",0,0,0,0}, {NULL,NULL,"0","Add Character" ,440,136,40,40}, {NULL,NULL,"1","Add Character" ,486,136,40,40}, {NULL,NULL,"2","Add Character" ,532,136,40,40}, {NULL,NULL,"3","Add Character" ,578,136,40,40}, {NULL,NULL,"4","Add Character" ,440,182,40,40}, {NULL,NULL,"5","Add Character" ,486,182,40,40}, {NULL,NULL,"6","Add Character" ,532,182,40,40}, {NULL,NULL,"7","Add Character" ,578,182,40,40}, {NULL,NULL,"8","Add Character" ,440,228,40,40}, {NULL,NULL,"9","Add Character" ,486,228,40,40}, {NULL,NULL,"A","Add Character" ,532,228,40,40}, {NULL,NULL,"B","Add Character" ,578,228,40,40}, {NULL,NULL,"C","Add Character" ,440,274,40,40}, {NULL,NULL,"D","Add Character" ,486,274,40,40}, {NULL,NULL,"E","Add Character" ,532,274,40,40}, {NULL,NULL,"F","Add Character" ,578,274,40,40}, {NULL,NULL,"del","Backspace" ,440,338,40,40}, {NULL,NULL,":","Add Separator" ,486,338,40,40}, {NULL,NULL,"+","Next Characters",532,338,40,40}, {NULL,NULL,"ok","Save Entry" ,578,338,40,40} }; /*****************************************************************************/ /* Menu Buttons description */ /*****************************************************************************/ static gui_butn buttons_cheats[30] = { {NULL, BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,108,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,134,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,160,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,186,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,212,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,238,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,264,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,290,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,316,358,26}, {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,342,358,26}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,0,1},440,136,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,1},486,136,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,1},532,136,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,0},578,136,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,182,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,182,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,182,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,182,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,228,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,228,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,228,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,228,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,274,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,274,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,274,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,274,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,0,1},440,338,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,1},486,338,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,1},532,338,40,40}, {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,0},578,338,40,40} }; /*****************************************************************************/ /* Menu description */ /*****************************************************************************/ static gui_menu menu_cheats = { "Cheats Manager", 0,0, 30,30,7,0, items_cheats, buttons_cheats, bg_cheats, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, cheatmenu_cb }; static char ggvalidchars[] = "ABCDEFGHJKLMNPRSTVWXYZ0123456789"; static char arvalidchars[] = "0123456789ABCDEF"; static u32 decode_cheat(char *string, int index) { char *p; int i,n; u32 len = 0; u32 address = 0; u16 data = 0; u8 ref = 0; /* 16-bit Game Genie code (ABCD-EFGH) */ if ((strlen(string) >= 9) && (string[4] == '-')) { /* 16-bit system only */ if ((system_hw & SYSTEM_PBC) != SYSTEM_MD) { return 0; } for (i = 0; i < 8; i++) { if (i == 4) string++; p = strchr (ggvalidchars, *string++); if (p == NULL) return 0; n = p - ggvalidchars; switch (i) { case 0: data |= n << 3; break; case 1: data |= n >> 2; address |= (n & 3) << 14; break; case 2: address |= n << 9; break; case 3: address |= (n & 0xF) << 20 | (n >> 4) << 8; break; case 4: data |= (n & 1) << 12; address |= (n >> 1) << 16; break; case 5: data |= (n & 1) << 15 | (n >> 1) << 8; break; case 6: data |= (n >> 3) << 13; address |= (n & 7) << 5; break; case 7: address |= n; break; } } /* code length */ len = 9; } /* 8-bit Game Genie code (DDA-AAA-XXX) */ else if ((strlen(string) >= 11) && (string[3] == '-') && (string[7] == '-')) { /* 8-bit system only */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { return 0; } /* decode 8-bit data */ for (i=0; i<2; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((1 - i) * 4)); } /* decode 16-bit address (low 12-bits) */ for (i=0; i<3; i++) { if (i==1) string++; /* skip separator */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((2 - i) * 4)); } /* decode 16-bit address (high 4-bits) */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; n ^= 0xF; /* bits inversion */ address |= (n << 12); /* RAM address are also supported */ if (address >= 0xC000) { /* convert to 24-bit Work RAM address */ address = 0xFF0000 | (address & 0x1FFF); } /* decode reference 8-bit data */ for (i=0; i<2; i++) { string++; /* skip separator and 2nd digit */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; ref |= (n << ((1 - i) * 4)); } ref = (ref >> 2) | ((ref & 0x03) << 6); /* 2-bit right rotation */ ref ^= 0xBA; /* XOR */ /* update old data value */ cheatlist[index].old = ref; /* code length */ len = 11; } /* Action Replay code */ else if (string[6] == ':') { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit code (AAAAAA:DDDD) */ if (strlen(string) < 11) return 0; /* decode 24-bit address */ for (i=0; i<6; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((5 - i) * 4)); } /* decode 16-bit data */ string++; for (i=0; i<4; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((3 - i) * 4)); } /* code length */ len = 11; } else { /* 8-bit code (xxAAAA:DD) */ if (strlen(string) < 9) return 0; /* decode 16-bit address */ string+=2; for (i=0; i<4; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((3 - i) * 4)); } /* ROM addresses are not supported */ if (address < 0xC000) return 0; /* convert to 24-bit Work RAM address */ address = 0xFF0000 | (address & 0x1FFF); /* decode 8-bit data */ string++; for (i=0; i<2; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((1 - i) * 4)); } /* code length */ len = 9; } } /* Valid code found ? */ if (len) { /* update cheat address & data values */ cheatlist[index].address = address; cheatlist[index].data = data; } /* return code length (0 = invalid) */ return len; } static void apply_cheats(void) { u8 *ptr; /* clear ROM&RAM patches counter */ maxROMcheats = maxRAMcheats = 0; int i; for (i = 0; i < maxcheats; i++) { if (cheatlist[i].enable) { if (cheatlist[i].address < cart.romsize) { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* patch ROM data */ cheatlist[i].old = *(u16 *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)); *(u16 *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)) = cheatlist[i].data; } else { /* add ROM patch */ maxROMcheats++; cheatIndexes[MAX_CHEATS - maxROMcheats] = i; /* get current banked ROM address */ ptr = &z80_readmap[(cheatlist[i].address) >> 10][cheatlist[i].address & 0x03FF]; /* check if reference matches original ROM data */ if (((u8)cheatlist[i].old) == *ptr) { /* patch data */ *ptr = cheatlist[i].data; /* save patched ROM address */ cheatlist[i].prev = ptr; } else { /* no patched ROM address yet */ cheatlist[i].prev = NULL; } } } else if (cheatlist[i].address >= 0xFF0000) { /* add RAM patch */ cheatIndexes[maxRAMcheats++] = i; } } } } static void clear_cheats(void) { int i = maxcheats; /* disable cheats in reversed order in case the same address is used by multiple patches */ while (i > 0) { if (cheatlist[i-1].enable) { if (cheatlist[i-1].address < cart.romsize) { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* restore original ROM data */ *(u16 *)(cart.rom + (cheatlist[i-1].address & 0xFFFFFE)) = cheatlist[i-1].old; } else { /* check if previous banked ROM address has been patched */ if (cheatlist[i-1].prev != NULL) { /* restore original data */ *cheatlist[i-1].prev = cheatlist[i-1].old; /* no more patched ROM address */ cheatlist[i-1].prev = NULL; } } } } i--; } } static void switch_chars(void) { int i; gui_menu *m = &menu_cheats; if (m->items[10].text[0] == '0') { m->items[10].text[0] = 'G'; m->items[11].text[0] = 'H'; m->items[12].text[0] = 'J'; m->items[13].text[0] = 'K'; m->items[14].text[0] = 'L'; m->items[15].text[0] = 'M'; m->items[16].text[0] = 'N'; m->items[17].text[0] = 'P'; m->items[18].text[0] = 'R'; m->items[19].text[0] = 'S'; m->items[20].text[0] = 'T'; m->items[21].text[0] = 'V'; m->items[22].text[0] = 'W'; m->items[23].text[0] = 'X'; m->items[24].text[0] = 'Y'; m->items[25].text[0] = 'Z'; } else if (m->items[10].text[0] == 'G') { m->items[10].text[0] = '0'; m->items[11].text[0] = '1'; m->items[12].text[0] = '2'; m->items[13].text[0] = '3'; m->items[14].text[0] = '4'; m->items[15].text[0] = '5'; m->items[16].text[0] = '6'; m->items[17].text[0] = '7'; m->items[18].text[0] = '8'; m->items[19].text[0] = '9'; m->items[20].text[0] = 'A'; m->items[21].text[0] = 'B'; m->items[22].text[0] = 'C'; m->items[23].text[0] = 'D'; m->items[24].text[0] = 'E'; m->items[25].text[0] = 'F'; } else if (m->items[10].text[0] == 'A') { m->items[10].text[0] = 'Q'; m->items[11].text[0] = 'R'; m->items[12].text[0] = 'S'; m->items[13].text[0] = 'T'; m->items[14].text[0] = 'U'; m->items[15].text[0] = 'V'; m->items[16].text[0] = 'W'; m->items[17].text[0] = 'X'; m->items[18].text[0] = 'Y'; m->items[19].text[0] = 'Z'; m->items[20].text[0] = '0'; m->items[21].text[0] = '1'; m->items[22].text[0] = '2'; m->items[23].text[0] = '3'; m->items[24].text[0] = '4'; m->items[25].text[0] = '5'; } else if (m->items[10].text[0] == 'Q') { m->items[10].text[0] = '6'; m->items[11].text[0] = '7'; m->items[12].text[0] = '8'; m->items[13].text[0] = '9'; /* hide unused buttons */ for (i=14; i<26; i++) { m->buttons[i].state &= ~BUTTON_VISIBLE; } m->buttons[10].shift[1] = 16; m->buttons[11].shift[1] = 16; m->buttons[12].shift[1] = 16; m->buttons[13].shift[1] = 16; m->buttons[26].shift[0] = 16; m->buttons[27].shift[0] = 16; m->buttons[28].shift[0] = 16; m->buttons[29].shift[0] = 16; } else if (m->items[10].text[0] == '6') { m->items[10].text[0] = 'A'; m->items[11].text[0] = 'B'; m->items[12].text[0] = 'C'; m->items[13].text[0] = 'D'; m->items[14].text[0] = 'E'; m->items[15].text[0] = 'F'; m->items[16].text[0] = 'G'; m->items[17].text[0] = 'H'; m->items[18].text[0] = 'I'; m->items[19].text[0] = 'J'; m->items[20].text[0] = 'K'; m->items[21].text[0] = 'L'; m->items[22].text[0] = 'M'; m->items[23].text[0] = 'N'; m->items[24].text[0] = 'O'; m->items[25].text[0] = 'P'; /* show previously unused buttons */ for (i=14; i<26; i++) { m->buttons[i].state |= BUTTON_VISIBLE; } m->buttons[10].shift[1] = 4; m->buttons[11].shift[1] = 4; m->buttons[12].shift[1] = 4; m->buttons[13].shift[1] = 4; m->buttons[26].shift[0] = 4; m->buttons[27].shift[0] = 4; m->buttons[28].shift[0] = 4; m->buttons[29].shift[0] = 4; } } static void cheatmenu_cb(void) { int i; int yoffset = 108; char temp[MAX_DESC_LENGTH]; /* Draw browser array */ gxDrawRectangle(15, 108, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 134, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 160, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 186, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 212, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 238, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 264, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 290, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 316, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 342, 358, 26, 127, (GXColor)BG_COLOR_2); /* Draw Cheat list */ for (i=0; ((offset + i) < maxcheats) && (i < 10); i++) { if (i == selection) { /* selection bar */ gxDrawTexture(bar_over.texture,16,yoffset+1,356,24,255); /* cheat description need to be specifically handled */ if (type) { /* check if text is being edited */ if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE) { /* adjust offset so that last characters are visible */ string_offset += FONT_writeCenter(cheatlist[offset + i].text+string_offset,16,40,366,yoffset+21,(GXColor)WHITE); } else { /* scroll text (speed = 1/10 frame) */ if ((string_offset/10) >= strlen(cheatlist[offset + i].text)) { string_offset = 0; } if (string_offset) { sprintf(temp,"%s ",cheatlist[offset + i].text+string_offset/10); strncat(temp, cheatlist[offset + i].text, string_offset/10); } else { strcpy(temp, cheatlist[offset + i].text); } if (FONT_writeCenter(temp,16,40,366,yoffset+21,(GXColor)WHITE)) { /* scroll text if string does not fit */ string_offset ++; } } } else { FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE); } } else { if (type) { FONT_writeCenter(cheatlist[offset + i].text,16,40,366,yoffset+21,(GXColor)WHITE); } else { FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE); } } /* draw cheat enable mark */ if (cheatlist[offset + i].enable) { gxDrawTexture(star.texture,20,yoffset+5,16,16,255); } yoffset += 26; } /* New Entry */ if (i < 10) { if (i == selection) { /* selection bar */ gxDrawTexture(bar_over.texture,16,yoffset+1,356,24,255); /* check if new code is being edited */ if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE) { FONT_writeCenter(cheatlist[offset + selection].code,18,40,366,yoffset+22,(GXColor)WHITE); } else { FONT_writeCenter("New Code",18,40,366,yoffset+22,(GXColor)WHITE); } } else { FONT_writeCenter("New Code",18,40,366,yoffset+22,(GXColor)WHITE); } } /* Extra helpers */ if (maxcheats && !(menu_cheats.bg_images[6].state & IMAGE_VISIBLE)) { /* switch between cheat code & description preview */ #ifdef HW_RVL gxDrawTexture(key_switch.texture,268,424,24,24,255); FONT_write(type ? "View\nCode":"View\nText",16,300,436,640,(GXColor)WHITE); #else gxDrawTexture(key_switch.texture,272,424,24,24,255); FONT_write(type ? "View\nCode":"View\nText",16,304,436,640,(GXColor)WHITE); #endif /* delete & enable cheats */ if ((offset + selection) < maxcheats) { #ifdef HW_RVL gxDrawTexture(key_enable.texture,152,424,24,24,255); gxDrawTexture(key_delete.texture,372,424,24,24,255); FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,184,436,640,(GXColor)WHITE); FONT_write("Delete\nCheat",16,404,436,640,(GXColor)WHITE); #else gxDrawTexture(key_enable.texture,136,426,44,20,255); gxDrawTexture(key_delete.texture,368,426,44,20,255); FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,188,436,640,(GXColor)WHITE); FONT_write("Delete\nCheat",16,420,436,640,(GXColor)WHITE); #endif } } } /**************************************************************************** * CheatMenu * * Manage cheats for the currently loaded game * ****************************************************************************/ void CheatMenu(void) { int i, update = 0; int digit_cnt = 0; int max = 0; char temp[256]; char *str = NULL; gui_menu *m = &menu_cheats; /* clear existing ROM patches */ clear_cheats(); /* reset scrolling */ string_offset = 0; /* background overlay */ if (config.bg_overlay) { bg_cheats[1].state |= IMAGE_VISIBLE; } else { bg_cheats[1].state &= ~IMAGE_VISIBLE; } /* additional textures */ star.texture = gxTextureOpenPNG(Star_full_png,0); bar_over.texture = gxTextureOpenPNG(Overlay_bar_png,0); key_switch.texture = gxTextureOpenPNG(Key_DPAD_png,0); #ifdef HW_RVL key_enable.texture = gxTextureOpenPNG(Key_Plus_wii_png,0); key_delete.texture = gxTextureOpenPNG(Key_Minus_wii_png,0); #else key_enable.texture = gxTextureOpenPNG(Key_L_gcn_png,0); key_delete.texture = gxTextureOpenPNG(Key_R_gcn_png,0); #endif /* selected item */ m->selected = selection; /* slide-in menu */ GUI_InitMenu(m); GUI_DrawMenuFX(m,30,0); /* lock background elements */ m->bg_images[2].state &= ~IMAGE_SLIDE_TOP; m->bg_images[3].state &= ~IMAGE_SLIDE_BOTTOM; m->bg_images[4].state &= ~IMAGE_SLIDE_TOP; while (update != -1) { /* update arrows buttons */ if (offset > 0) m->arrows[0]->state |= BUTTON_VISIBLE; else m->arrows[0]->state &= ~BUTTON_VISIBLE; if (((offset + 10) < (maxcheats + 1)) && ((offset + 10) < MAX_CHEATS)) m->arrows[1]->state |= BUTTON_VISIBLE; else m->arrows[1]->state &= ~BUTTON_VISIBLE; /* draw menu */ GUI_DrawMenu(m); /* check if browsing cheats list */ if (!(m->bg_images[6].state & IMAGE_VISIBLE)) { /* restore scrolling list settings */ m->offset = offset; m->max_items = (maxcheats < MAX_CHEATS) ? (maxcheats + 1) : MAX_CHEATS; m->max_buttons = 10; m->helpers[1] = NULL; /* check if arrow button is high-lighted */ if (m->selected >= 30) { /* adjust selected button index */ m->selected -= 20; } } #ifdef HW_RVL if (Shutdown) { /* close additional textures */ gxTextureClose(&star.texture); gxTextureClose(&bar_over.texture); gxTextureClose(&key_switch.texture); gxTextureClose(&key_enable.texture); gxTextureClose(&key_delete.texture); /* restore default GUI settings */ m->max_items = m->max_buttons = 30; m->helpers[1] = &action_select; } #endif /* update menu */ update = GUI_UpdateMenu(m); /* check if browsing cheats list */ if (!(m->bg_images[6].state & IMAGE_VISIBLE)) { if (m->selected < 10) { /* update selected cheat */ if (selection != m->selected) { selection = m->selected; string_offset = 0; } } else { /* arrow button is selected */ m->selected += 20; } /* save cheats list offset */ if (offset != m->offset) { offset = m->offset; string_offset = 0; } /* restore default GUI settings */ m->offset = 0; m->max_items = m->max_buttons = 30; m->helpers[1] = &action_select; } /* handle pressed buttons */ if (update > 0) { switch (m->selected) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: /* Edit cheat */ { if (type && ((selection + offset) != maxcheats)) { /* cheat description */ str = cheatlist[offset + selection].text; strcpy(temp, str); max = MAX_DESC_LENGTH - 2; digit_cnt = strlen(str); if (digit_cnt <= max) { str[digit_cnt] = '*'; str[digit_cnt+1] = 0; } /* init specific characters */ m->items[10].text[0] = '6'; m->items[27].text[0] = ' '; strcpy(m->items[27].comment,"Add White Space"); switch_chars(); } else { /* cheat code */ str = cheatlist[offset + selection].code; strcpy(temp, str); if ((offset + selection) == maxcheats) { /* initialize code */ max = 0; digit_cnt = 0; str[0] = '*'; str[1] = 0; } else { /* code type */ if (str[6] == ':') { /* Action Replay code */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit code */ max = 10; } else { /* 8-bit code */ max = 8; } } else if (str[4] == '-') { /* 16-bit Game Genie code */ max = 8; } else { /* 8-bit Game Genie code */ max = 10; } /* set cursor to end of code */ digit_cnt = max + 1; } /* init specific characters */ m->items[10].text[0] = 'G'; m->items[27].text[0] = ':'; strcpy(m->items[27].comment,"Add Code Separator"); switch_chars(); } /* show digit buttons */ for (i=10; i<30; i++) m->buttons[i].state |= BUTTON_VISIBLE; /* show right window */ m->bg_images[6].state |= IMAGE_VISIBLE; /* disable left buttons */ for (i=0; i<10; i++) m->buttons[i].state &= ~BUTTON_ACTIVE; /* disable arrow buttons */ m->arrows[0]->state &= ~BUTTON_ACTIVE; m->arrows[1]->state &= ~BUTTON_ACTIVE; /* slide in right window */ GUI_DrawMenuFX(m,20,0); /* update helper */ strcpy(action_cancel.comment,"Cancel"); /* select first digit */ m->selected = 10; /* reset scrolling */ string_offset = 0; break; } case 26: /* Backspace */ { if (digit_cnt > 0) { /* delete last character */ str[digit_cnt--] = 0; /* code separator is being deleted */ if ((str[digit_cnt] == ':') || (str[digit_cnt] == '-')) { /* reset detected code type (except 8-bit Game Genie code using 2 separators) */ if (((system_hw & SYSTEM_PBC) == SYSTEM_MD) || (digit_cnt != 7)) { max = 0; } } /* edit mark */ str[digit_cnt] = '*'; /* update scroll value if necessary */ if (string_offset > 0) string_offset--; } break; } case 27: { if (type && ((offset + selection) != maxcheats)) { /* SPACE character */ if (digit_cnt <= max) { str[digit_cnt++] = ' '; str[digit_cnt] = 0; if (digit_cnt <= max) { str[digit_cnt] = '*'; str[digit_cnt+1] = 0; } } } else { /* Separator character */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit codes */ if (digit_cnt == 4) { /* Game Genie code */ max = 8; str[4] = '-'; } else if ((digit_cnt == 6) && (max != 8)) { /* Action Replay code */ max = 10; str[6] = ':'; } else { break; } } else { /* 8-bit codes */ if (digit_cnt == 3) { /* Game Genie code */ max = 10; str[3] = '-'; } else if ((digit_cnt == 7) && (max == 10)) { /* Game Genie code (last part) */ str[7] = '-'; } else if ((digit_cnt == 6) && (max != 10)) { /* Action Replay code */ max = 8; str[6] = ':'; } else { break; } } digit_cnt++; str[digit_cnt] = '*'; str[digit_cnt+1] = 0; } break; } case 28: /* Next character set */ { GUI_DrawMenuFX(m,40,1); switch_chars(); GUI_DrawMenuFX(m,40,0); break; } case 29: /* Validate entry */ { /* finalize cheat description */ if (type && ((offset + selection) != maxcheats)) { str[digit_cnt] = 0; update = -1; } /* finalize cheat code edition */ else if (max && (digit_cnt > max)) { /* check if cheat code is valid */ if (decode_cheat(cheatlist[offset + selection].code, offset + selection)) { /* new cheat ? */ if ((offset + selection) == maxcheats) { /* increase cheat count */ maxcheats++; /* enable cheat by default */ cheatlist[offset + selection].enable = 1; /* no description by default */ strcpy(cheatlist[offset + selection].text,"No Description"); } /* return to cheat selection */ update = -1; } else { GUI_WaitPrompt("Error", "Invalid Cheat Code"); } } break; } default: /* Add Character */ { /* force code separator if none has been set yet */ if ((max == 0) && (digit_cnt == 6)) break; /* force 8-bit Game Genie code last separator */ if (((system_hw & SYSTEM_PBC) != SYSTEM_MD) && (max == 10) && (digit_cnt == 7)) break; /* add character */ if ((digit_cnt <= max) || (max == 0)) { str[digit_cnt++] = m->items[m->selected].text[0]; str[digit_cnt] = 0; if ((digit_cnt <= max) || (max == 0)) { str[digit_cnt] = '*'; str[digit_cnt+1] = 0; } if (string_offset > 0) string_offset ++; } break; } } } else if (update < 0) { /* cancel */ if (m->bg_images[6].state & IMAGE_VISIBLE) { /* Restore old entry */ strcpy(str, temp); } } else { /* check other buttons pressed while browsing cheats list */ if (maxcheats && !(m->bg_images[6].state & IMAGE_VISIBLE)) { if ((m_input.keys & PAD_BUTTON_LEFT) || (m_input.keys & PAD_BUTTON_RIGHT)) { /* Switch between cheat code & description */ type ^= 1; /* reset scrolling */ string_offset = 0; } else if ((offset + selection) < maxcheats) { /* Delete selected cheat code*/ if (m_input.keys & PAD_TRIGGER_R) { if (GUI_WaitConfirm("Warning","Delete Cheat Entry ?")) { /* shift cheat list up to selected entry */ for (i = offset + selection + 1; i < maxcheats; i++) { strcpy(cheatlist[i-1].text,cheatlist[i].text); strcpy(cheatlist[i-1].code,cheatlist[i].code); cheatlist[i-1].address = cheatlist[i].address; cheatlist[i-1].data = cheatlist[i].data; cheatlist[i-1].enable = cheatlist[i].enable; } /* clear last cheat */ cheatlist[maxcheats-1].text[0] = 0; cheatlist[maxcheats-1].code[0] = 0; cheatlist[maxcheats-1].address = 0; cheatlist[maxcheats-1].data = 0; cheatlist[maxcheats-1].enable = 0; /* adjust scrolling list */ if (maxcheats < 10) { /* disable next button */ m->buttons[maxcheats].state &= ~BUTTON_ACTIVE; m->buttons[maxcheats-1].shift[1] = 0; } else { /* scroll down cheat list if there is less than 10 visible entries */ if ((maxcheats < (offset + 10)) && (maxcheats < MAX_CHEATS)) { offset--; } } /* decrease cheat count */ maxcheats--; /* reset scrolling */ string_offset = 0; } } else if (m_input.keys & PAD_TRIGGER_L) { /* Enable/Disable selected cheat code */ cheatlist[offset + selection].enable ^= 1; } } } } if (update < 0) { if (m->bg_images[6].state & IMAGE_VISIBLE) { /* slide out right window */ GUI_DrawMenuFX(m,20,1); /* hide digit buttons */ for (i=10; i<30; i++) m->buttons[i].state &= ~BUTTON_VISIBLE; /* hide right window */ m->bg_images[6].state &= ~IMAGE_VISIBLE; /* enable left buttons */ for (i=0; i<10; i++) { if (i < maxcheats) { menu_cheats.buttons[i].state |= BUTTON_ACTIVE; menu_cheats.buttons[i].shift[1] = 1; } else if (i == maxcheats) { menu_cheats.buttons[i].state |= BUTTON_ACTIVE; menu_cheats.buttons[i].shift[1] = 0; } else { menu_cheats.buttons[i].state &= ~BUTTON_ACTIVE; menu_cheats.buttons[i].shift[1] = 0; } } /* enable arrow buttons */ m->arrows[0]->state |= BUTTON_ACTIVE; m->arrows[1]->state |= BUTTON_ACTIVE; /* restore helper */ strcpy(action_cancel.comment,"Back"); /* select current cheat */ m->selected = selection; /* stay in menu */ update = 0; } } } /* apply ROM patches */ apply_cheats(); /* save cheats to file */ sprintf(temp, "%s/cheats/%s.pat", DEFAULT_PATH, rom_filename); if (maxcheats) { /* open file */ FILE *f = fopen(temp, "w"); /* write cheats */ if (f) { for (i=0; ibg_images[2].state |= IMAGE_SLIDE_TOP; m->bg_images[3].state |= IMAGE_SLIDE_BOTTOM; m->bg_images[4].state |= IMAGE_SLIDE_TOP; /* leave menu */ GUI_DrawMenuFX(m,30,1); GUI_DeleteMenu(m); /* close additional textures */ gxTextureClose(&star.texture); gxTextureClose(&bar_over.texture); gxTextureClose(&key_switch.texture); gxTextureClose(&key_enable.texture); gxTextureClose(&key_delete.texture); } /**************************************************************************** * CheatLoad * * Load cheats from associated .pat file, called when loading a new game * ROM patches are automatically applied. * RAM patches are applied once per frame. * ****************************************************************************/ void CheatLoad(void) { int len; int cnt = 0; char temp[256]; /* reset cheat count */ maxcheats = 0; /* make cheat filename */ sprintf(temp, "%s/cheats/%s.pat", DEFAULT_PATH, rom_filename); /* open file */ FILE *f = fopen(temp, "r"); if (f) { /* clear string */ memset(temp, 0, 256); /* read cheats from file (one line per cheat) */ while (fgets(temp, 256, f) && (maxcheats < MAX_CHEATS) && (cnt < MAX_CHEATS)) { /* remove CR & EOL chars */ if ((temp[strlen(temp) - 2] == 0x0d) || (temp[strlen(temp) - 2] == 0x0a)) temp[strlen(temp) - 2] = 0; else temp[strlen(temp) - 1] = 0; /* check cheat validty */ len = decode_cheat(temp, maxcheats); if (len) { /* copy cheat code */ strncpy(cheatlist[maxcheats].code, temp, len); cheatlist[maxcheats].code[len] = 0; len++; /* jump TAB and SPACE characters */ while ((temp[len] == 0x20) || (temp[len] == 0x09)) len++; /* copy cheat description */ strncpy(cheatlist[maxcheats].text, &temp[len], MAX_DESC_LENGTH - 1); cheatlist[maxcheats].text[MAX_DESC_LENGTH - 1] = 0; /* increment cheat count */ maxcheats++; } else if (!strcmp(temp,"ON") && config.autocheat) { /* enable flag */ cheatlist[cnt++].enable = 1; } else if (!strcmp(temp,"OFF") && config.autocheat) { /* disable flag */ cheatlist[cnt++].enable = 0; } } /* by default, disable cheats that were not flagged */ while (cnt < maxcheats) cheatlist[cnt++].enable = 0; /* close file */ fclose(f); } /* apply ROM patches */ apply_cheats(); /* adjust menu buttons */ for (cnt=0; cnt<10; cnt++) { if (cnt < maxcheats) { menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE; menu_cheats.buttons[cnt].shift[1] = 1; } else if (cnt == maxcheats) { menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE; menu_cheats.buttons[cnt].shift[1] = 0; } else { menu_cheats.buttons[cnt].shift[1] = 0; menu_cheats.buttons[cnt].state &= ~BUTTON_ACTIVE; } } /* reset menu */ selection = offset = 0; } /**************************************************************************** * RAMCheatUpdate * * Apply RAM patches (this should be called once per frame) * ****************************************************************************/ void RAMCheatUpdate(void) { int index, cnt = maxRAMcheats; while (cnt) { /* get cheat index */ index = cheatIndexes[--cnt]; /* apply RAM patch */ if (cheatlist[index].data & 0xFF00) { /* word patch */ *(u16 *)(work_ram + (cheatlist[index].address & 0xFFFE)) = cheatlist[index].data; } else { /* byte patch */ work_ram[cheatlist[index].address & 0xFFFF] = cheatlist[index].data; } } } /**************************************************************************** * ROMCheatUpdate * * Apply ROM patches (this should be called each time banking is changed) * ****************************************************************************/ void ROMCheatUpdate(void) { int index, cnt = maxROMcheats; u8 *ptr; while (cnt) { /* get cheat index */ index = cheatIndexes[MAX_CHEATS - cnt]; /* check if previous banked ROM address was patched */ if (cheatlist[index].prev != NULL) { /* restore original data */ *cheatlist[index].prev = cheatlist[index].old; /* no more patched ROM address */ cheatlist[index].prev = NULL; } /* get current banked ROM address */ ptr = &z80_readmap[(cheatlist[index].address) >> 10][cheatlist[index].address & 0x03FF]; /* check if reference matches original ROM data */ if (((u8)cheatlist[index].old) == *ptr) { /* patch data */ *ptr = cheatlist[index].data; /* save patched ROM address */ cheatlist[index].prev = ptr; } /* next ROM patch */ cnt--; } } gx/images/Button_save_over.png000664 001750 001750 00000011012 12702465756 017630 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/02/101 ^IDATxytu?ut:#nLс(xmtQq tg|̬Ό̀xʌ8DQYAnH?:UTGUuWu^~-DQgSUFy@:8(U;PU `.0j~F:.H):%" ~S 3)3dy<+kWDr`(*Y*5״4nDزQRYꥼOy%^AC"D{g MP[*-i>$drDKyO+PUձb{6.V5hKTHigtψ&lRSn1@+EQgj+]ejPIa/DQR!%w0Z?ozuE ̧ k=Yx#ژQtў49DDQD"``0,HK 2)q D>ޞ+k?ײU(rZմe|'3axʡ"$َ(DѸ- aB@@ @8R7_Ҝ}~3һ)9z R{~o9qMIIIAe4M#DD"acӿ3 B~^/>n~q.Z>ܚW{L>~EQ9k@UU|~vSg8DIm|ڽc$%%h4joPfdx<^..sdF;2x|i9.w?ܦ(3TUJ`O?@X[wR IKKCEC8 ͟.xm83앙\%˝T1`vT"&SV>jǞn}w2<Gn~999 hMӌX?M cR4A 55o0F]Efy'46ixRuzM;߾y&# Mc} 0D0i,#I2-)xQn8E㎷/UU}ǽwܫ?nj ;Pϰa9l6 H}"iC熂EAߞ r+>ǽw0oH@UUGYpm+ǢeX_̬l$I2B.YV4C&ZA%~mGN&a@ZdY& RBwQ.#_ZS,TWWi 8+X}KOO7->(dGaO1uwO[vr`k,nBlw(( 3f --Ͳ0oVߙi53[(l۟j<杽UUc_#0fçD M}3C:8ѣG3sL  ,B( 20MWWTqPV74!b\o9N: q@AM2RΝˊ+hnn]d&i mfzm)# >)Ec\|%'8 B8NHKK#333nӿ6lr "o*J/P|s(xb?n'(<^?DuPM,3gb fϞwA8fΜ9h֠ t W^ȱS"~aT߸ Ğkg$Io檫2ÅB!c-[F4eΜ9 xz0].̴\Z4f1ec&gP]hQR@@|92E@Hw4?Hџ i|>ۇ x<d0dɒ%ACs:PԷc13 ѯO$QCk(%~?o&+W$YV .43<3(]a"21${ "md8"\(g wLWW/fÆ c'J'D ȏYS)qpJG͘wѝ^OґHCxIV`^ gʜ=O*+D4G);#~8c'S MosМ,X`h[2m6^|E\.azP~0<2 Z}mdUV[|b1 JtW0}K./iYCAoH$Bf@hluPVpRsΪ-[LolicfC&&^MW^/45̕JP5eb4 |v_+'߰ #:!<06i '),ٔr,n2@5=$\v**'G2:dfI{SU m,Zi믿NVV~!z,4MrO$-ɴ ` MUB;2%+6ʀ8^siFɟ?AwH78!0WNjсn~(Q=6d|x[.52(rJT% ;=$y5Mª&S(#fcQ9 uPdL&^ކY%%3)6u[cOP븡Ľ T4FШi-SFV7̪OK@r2q7@V32 *;Qxꁁᯭ-b֌ 5q5sBa-1-VPэ뵜>8[2dV_;y|IUq钆"$Id|0k(ہyM=7k3(E$34d ۘNvxc]!7Mx7ФEwA^ `-7BA~IiO )k3{~e) +b8~_| ;rX @!"X<[Ӆ5EQ/\ίd,H#Ĥdtas{{$6fb0a sǒ$NfNq0rt](+0E=WN*쉽vRO=E ^? Rܾi!5Z {d 0oSyrGqS|mő=CUcrxli"l\}d:ID^o mey ۓ A&n#?C+\yRb}V2mXiN|(Ťcy.X1W1uR Pׯtr] ۴)㺘3#qU! 5O'{yLbC; 0 ~.SE]b zz{sbk{> S\d8g6lvr'kGvJ0a\sWnJ?Z{G2sǮ!OG3]Nu WنiCVw"KC߫#WX5""b)CNQzػ;#;eJru:+V(9 yZuonf7U& F gi8(-lIENDB`core/tremor/mdct_lookup.h000664 001750 001750 00000100321 12702465756 016646 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: sin,cos lookup tables ********************************************************************/ #include "os_types.h" /* {sin(2*i*PI/4096), cos(2*i*PI/4096)}, with i = 0 to 512 */ static LOOKUP_T sincos_lookup0[1026] = { X(0x00000000), X(0x7fffffff), X(0x003243f5), X(0x7ffff621), X(0x006487e3), X(0x7fffd886), X(0x0096cbc1), X(0x7fffa72c), X(0x00c90f88), X(0x7fff6216), X(0x00fb5330), X(0x7fff0943), X(0x012d96b1), X(0x7ffe9cb2), X(0x015fda03), X(0x7ffe1c65), X(0x01921d20), X(0x7ffd885a), X(0x01c45ffe), X(0x7ffce093), X(0x01f6a297), X(0x7ffc250f), X(0x0228e4e2), X(0x7ffb55ce), X(0x025b26d7), X(0x7ffa72d1), X(0x028d6870), X(0x7ff97c18), X(0x02bfa9a4), X(0x7ff871a2), X(0x02f1ea6c), X(0x7ff75370), X(0x03242abf), X(0x7ff62182), X(0x03566a96), X(0x7ff4dbd9), X(0x0388a9ea), X(0x7ff38274), X(0x03bae8b2), X(0x7ff21553), X(0x03ed26e6), X(0x7ff09478), X(0x041f6480), X(0x7feeffe1), X(0x0451a177), X(0x7fed5791), X(0x0483ddc3), X(0x7feb9b85), X(0x04b6195d), X(0x7fe9cbc0), X(0x04e8543e), X(0x7fe7e841), X(0x051a8e5c), X(0x7fe5f108), X(0x054cc7b1), X(0x7fe3e616), X(0x057f0035), X(0x7fe1c76b), X(0x05b137df), X(0x7fdf9508), X(0x05e36ea9), X(0x7fdd4eec), X(0x0615a48b), X(0x7fdaf519), X(0x0647d97c), X(0x7fd8878e), X(0x067a0d76), X(0x7fd6064c), X(0x06ac406f), X(0x7fd37153), X(0x06de7262), X(0x7fd0c8a3), X(0x0710a345), X(0x7fce0c3e), X(0x0742d311), X(0x7fcb3c23), X(0x077501be), X(0x7fc85854), X(0x07a72f45), X(0x7fc560cf), X(0x07d95b9e), X(0x7fc25596), X(0x080b86c2), X(0x7fbf36aa), X(0x083db0a7), X(0x7fbc040a), X(0x086fd947), X(0x7fb8bdb8), X(0x08a2009a), X(0x7fb563b3), X(0x08d42699), X(0x7fb1f5fc), X(0x09064b3a), X(0x7fae7495), X(0x09386e78), X(0x7faadf7c), X(0x096a9049), X(0x7fa736b4), X(0x099cb0a7), X(0x7fa37a3c), X(0x09cecf89), X(0x7f9faa15), X(0x0a00ece8), X(0x7f9bc640), X(0x0a3308bd), X(0x7f97cebd), X(0x0a6522fe), X(0x7f93c38c), X(0x0a973ba5), X(0x7f8fa4b0), X(0x0ac952aa), X(0x7f8b7227), X(0x0afb6805), X(0x7f872bf3), X(0x0b2d7baf), X(0x7f82d214), X(0x0b5f8d9f), X(0x7f7e648c), X(0x0b919dcf), X(0x7f79e35a), X(0x0bc3ac35), X(0x7f754e80), X(0x0bf5b8cb), X(0x7f70a5fe), X(0x0c27c389), X(0x7f6be9d4), X(0x0c59cc68), X(0x7f671a05), X(0x0c8bd35e), X(0x7f62368f), X(0x0cbdd865), X(0x7f5d3f75), X(0x0cefdb76), X(0x7f5834b7), X(0x0d21dc87), X(0x7f531655), X(0x0d53db92), X(0x7f4de451), X(0x0d85d88f), X(0x7f489eaa), X(0x0db7d376), X(0x7f434563), X(0x0de9cc40), X(0x7f3dd87c), X(0x0e1bc2e4), X(0x7f3857f6), X(0x0e4db75b), X(0x7f32c3d1), X(0x0e7fa99e), X(0x7f2d1c0e), X(0x0eb199a4), X(0x7f2760af), X(0x0ee38766), X(0x7f2191b4), X(0x0f1572dc), X(0x7f1baf1e), X(0x0f475bff), X(0x7f15b8ee), X(0x0f7942c7), X(0x7f0faf25), X(0x0fab272b), X(0x7f0991c4), X(0x0fdd0926), X(0x7f0360cb), X(0x100ee8ad), X(0x7efd1c3c), X(0x1040c5bb), X(0x7ef6c418), X(0x1072a048), X(0x7ef05860), X(0x10a4784b), X(0x7ee9d914), X(0x10d64dbd), X(0x7ee34636), X(0x11082096), X(0x7edc9fc6), X(0x1139f0cf), X(0x7ed5e5c6), X(0x116bbe60), X(0x7ecf1837), X(0x119d8941), X(0x7ec8371a), X(0x11cf516a), X(0x7ec14270), X(0x120116d5), X(0x7eba3a39), X(0x1232d979), X(0x7eb31e78), X(0x1264994e), X(0x7eabef2c), X(0x1296564d), X(0x7ea4ac58), X(0x12c8106f), X(0x7e9d55fc), X(0x12f9c7aa), X(0x7e95ec1a), X(0x132b7bf9), X(0x7e8e6eb2), X(0x135d2d53), X(0x7e86ddc6), X(0x138edbb1), X(0x7e7f3957), X(0x13c0870a), X(0x7e778166), X(0x13f22f58), X(0x7e6fb5f4), X(0x1423d492), X(0x7e67d703), X(0x145576b1), X(0x7e5fe493), X(0x148715ae), X(0x7e57dea7), X(0x14b8b17f), X(0x7e4fc53e), X(0x14ea4a1f), X(0x7e47985b), X(0x151bdf86), X(0x7e3f57ff), X(0x154d71aa), X(0x7e37042a), X(0x157f0086), X(0x7e2e9cdf), X(0x15b08c12), X(0x7e26221f), X(0x15e21445), X(0x7e1d93ea), X(0x16139918), X(0x7e14f242), X(0x16451a83), X(0x7e0c3d29), X(0x1676987f), X(0x7e0374a0), X(0x16a81305), X(0x7dfa98a8), X(0x16d98a0c), X(0x7df1a942), X(0x170afd8d), X(0x7de8a670), X(0x173c6d80), X(0x7ddf9034), X(0x176dd9de), X(0x7dd6668f), X(0x179f429f), X(0x7dcd2981), X(0x17d0a7bc), X(0x7dc3d90d), X(0x1802092c), X(0x7dba7534), X(0x183366e9), X(0x7db0fdf8), X(0x1864c0ea), X(0x7da77359), X(0x18961728), X(0x7d9dd55a), X(0x18c7699b), X(0x7d9423fc), X(0x18f8b83c), X(0x7d8a5f40), X(0x192a0304), X(0x7d808728), X(0x195b49ea), X(0x7d769bb5), X(0x198c8ce7), X(0x7d6c9ce9), X(0x19bdcbf3), X(0x7d628ac6), X(0x19ef0707), X(0x7d58654d), X(0x1a203e1b), X(0x7d4e2c7f), X(0x1a517128), X(0x7d43e05e), X(0x1a82a026), X(0x7d3980ec), X(0x1ab3cb0d), X(0x7d2f0e2b), X(0x1ae4f1d6), X(0x7d24881b), X(0x1b161479), X(0x7d19eebf), X(0x1b4732ef), X(0x7d0f4218), X(0x1b784d30), X(0x7d048228), X(0x1ba96335), X(0x7cf9aef0), X(0x1bda74f6), X(0x7ceec873), X(0x1c0b826a), X(0x7ce3ceb2), X(0x1c3c8b8c), X(0x7cd8c1ae), X(0x1c6d9053), X(0x7ccda169), X(0x1c9e90b8), X(0x7cc26de5), X(0x1ccf8cb3), X(0x7cb72724), X(0x1d00843d), X(0x7cabcd28), X(0x1d31774d), X(0x7ca05ff1), X(0x1d6265dd), X(0x7c94df83), X(0x1d934fe5), X(0x7c894bde), X(0x1dc4355e), X(0x7c7da505), X(0x1df5163f), X(0x7c71eaf9), X(0x1e25f282), X(0x7c661dbc), X(0x1e56ca1e), X(0x7c5a3d50), X(0x1e879d0d), X(0x7c4e49b7), X(0x1eb86b46), X(0x7c4242f2), X(0x1ee934c3), X(0x7c362904), X(0x1f19f97b), X(0x7c29fbee), X(0x1f4ab968), X(0x7c1dbbb3), X(0x1f7b7481), X(0x7c116853), X(0x1fac2abf), X(0x7c0501d2), X(0x1fdcdc1b), X(0x7bf88830), X(0x200d888d), X(0x7bebfb70), X(0x203e300d), X(0x7bdf5b94), X(0x206ed295), X(0x7bd2a89e), X(0x209f701c), X(0x7bc5e290), X(0x20d0089c), X(0x7bb9096b), X(0x21009c0c), X(0x7bac1d31), X(0x21312a65), X(0x7b9f1de6), X(0x2161b3a0), X(0x7b920b89), X(0x219237b5), X(0x7b84e61f), X(0x21c2b69c), X(0x7b77ada8), X(0x21f3304f), X(0x7b6a6227), X(0x2223a4c5), X(0x7b5d039e), X(0x225413f8), X(0x7b4f920e), X(0x22847de0), X(0x7b420d7a), X(0x22b4e274), X(0x7b3475e5), X(0x22e541af), X(0x7b26cb4f), X(0x23159b88), X(0x7b190dbc), X(0x2345eff8), X(0x7b0b3d2c), X(0x23763ef7), X(0x7afd59a4), X(0x23a6887f), X(0x7aef6323), X(0x23d6cc87), X(0x7ae159ae), X(0x24070b08), X(0x7ad33d45), X(0x243743fa), X(0x7ac50dec), X(0x24677758), X(0x7ab6cba4), X(0x2497a517), X(0x7aa8766f), X(0x24c7cd33), X(0x7a9a0e50), X(0x24f7efa2), X(0x7a8b9348), X(0x25280c5e), X(0x7a7d055b), X(0x2558235f), X(0x7a6e648a), X(0x2588349d), X(0x7a5fb0d8), X(0x25b84012), X(0x7a50ea47), X(0x25e845b6), X(0x7a4210d8), X(0x26184581), X(0x7a332490), X(0x26483f6c), X(0x7a24256f), X(0x26783370), X(0x7a151378), X(0x26a82186), X(0x7a05eead), X(0x26d809a5), X(0x79f6b711), X(0x2707ebc7), X(0x79e76ca7), X(0x2737c7e3), X(0x79d80f6f), X(0x27679df4), X(0x79c89f6e), X(0x27976df1), X(0x79b91ca4), X(0x27c737d3), X(0x79a98715), X(0x27f6fb92), X(0x7999dec4), X(0x2826b928), X(0x798a23b1), X(0x2856708d), X(0x797a55e0), X(0x288621b9), X(0x796a7554), X(0x28b5cca5), X(0x795a820e), X(0x28e5714b), X(0x794a7c12), X(0x29150fa1), X(0x793a6361), X(0x2944a7a2), X(0x792a37fe), X(0x29743946), X(0x7919f9ec), X(0x29a3c485), X(0x7909a92d), X(0x29d34958), X(0x78f945c3), X(0x2a02c7b8), X(0x78e8cfb2), X(0x2a323f9e), X(0x78d846fb), X(0x2a61b101), X(0x78c7aba2), X(0x2a911bdc), X(0x78b6fda8), X(0x2ac08026), X(0x78a63d11), X(0x2aefddd8), X(0x789569df), X(0x2b1f34eb), X(0x78848414), X(0x2b4e8558), X(0x78738bb3), X(0x2b7dcf17), X(0x786280bf), X(0x2bad1221), X(0x7851633b), X(0x2bdc4e6f), X(0x78403329), X(0x2c0b83fa), X(0x782ef08b), X(0x2c3ab2b9), X(0x781d9b65), X(0x2c69daa6), X(0x780c33b8), X(0x2c98fbba), X(0x77fab989), X(0x2cc815ee), X(0x77e92cd9), X(0x2cf72939), X(0x77d78daa), X(0x2d263596), X(0x77c5dc01), X(0x2d553afc), X(0x77b417df), X(0x2d843964), X(0x77a24148), X(0x2db330c7), X(0x7790583e), X(0x2de2211e), X(0x777e5cc3), X(0x2e110a62), X(0x776c4edb), X(0x2e3fec8b), X(0x775a2e89), X(0x2e6ec792), X(0x7747fbce), X(0x2e9d9b70), X(0x7735b6af), X(0x2ecc681e), X(0x77235f2d), X(0x2efb2d95), X(0x7710f54c), X(0x2f29ebcc), X(0x76fe790e), X(0x2f58a2be), X(0x76ebea77), X(0x2f875262), X(0x76d94989), X(0x2fb5fab2), X(0x76c69647), X(0x2fe49ba7), X(0x76b3d0b4), X(0x30133539), X(0x76a0f8d2), X(0x3041c761), X(0x768e0ea6), X(0x30705217), X(0x767b1231), X(0x309ed556), X(0x76680376), X(0x30cd5115), X(0x7654e279), X(0x30fbc54d), X(0x7641af3d), X(0x312a31f8), X(0x762e69c4), X(0x3158970e), X(0x761b1211), X(0x3186f487), X(0x7607a828), X(0x31b54a5e), X(0x75f42c0b), X(0x31e39889), X(0x75e09dbd), X(0x3211df04), X(0x75ccfd42), X(0x32401dc6), X(0x75b94a9c), X(0x326e54c7), X(0x75a585cf), X(0x329c8402), X(0x7591aedd), X(0x32caab6f), X(0x757dc5ca), X(0x32f8cb07), X(0x7569ca99), X(0x3326e2c3), X(0x7555bd4c), X(0x3354f29b), X(0x75419de7), X(0x3382fa88), X(0x752d6c6c), X(0x33b0fa84), X(0x751928e0), X(0x33def287), X(0x7504d345), X(0x340ce28b), X(0x74f06b9e), X(0x343aca87), X(0x74dbf1ef), X(0x3468aa76), X(0x74c7663a), X(0x34968250), X(0x74b2c884), X(0x34c4520d), X(0x749e18cd), X(0x34f219a8), X(0x7489571c), X(0x351fd918), X(0x74748371), X(0x354d9057), X(0x745f9dd1), X(0x357b3f5d), X(0x744aa63f), X(0x35a8e625), X(0x74359cbd), X(0x35d684a6), X(0x74208150), X(0x36041ad9), X(0x740b53fb), X(0x3631a8b8), X(0x73f614c0), X(0x365f2e3b), X(0x73e0c3a3), X(0x368cab5c), X(0x73cb60a8), X(0x36ba2014), X(0x73b5ebd1), X(0x36e78c5b), X(0x73a06522), X(0x3714f02a), X(0x738acc9e), X(0x37424b7b), X(0x73752249), X(0x376f9e46), X(0x735f6626), X(0x379ce885), X(0x73499838), X(0x37ca2a30), X(0x7333b883), X(0x37f76341), X(0x731dc70a), X(0x382493b0), X(0x7307c3d0), X(0x3851bb77), X(0x72f1aed9), X(0x387eda8e), X(0x72db8828), X(0x38abf0ef), X(0x72c54fc1), X(0x38d8fe93), X(0x72af05a7), X(0x39060373), X(0x7298a9dd), X(0x3932ff87), X(0x72823c67), X(0x395ff2c9), X(0x726bbd48), X(0x398cdd32), X(0x72552c85), X(0x39b9bebc), X(0x723e8a20), X(0x39e6975e), X(0x7227d61c), X(0x3a136712), X(0x7211107e), X(0x3a402dd2), X(0x71fa3949), X(0x3a6ceb96), X(0x71e35080), X(0x3a99a057), X(0x71cc5626), X(0x3ac64c0f), X(0x71b54a41), X(0x3af2eeb7), X(0x719e2cd2), X(0x3b1f8848), X(0x7186fdde), X(0x3b4c18ba), X(0x716fbd68), X(0x3b78a007), X(0x71586b74), X(0x3ba51e29), X(0x71410805), X(0x3bd19318), X(0x7129931f), X(0x3bfdfecd), X(0x71120cc5), X(0x3c2a6142), X(0x70fa74fc), X(0x3c56ba70), X(0x70e2cbc6), X(0x3c830a50), X(0x70cb1128), X(0x3caf50da), X(0x70b34525), X(0x3cdb8e09), X(0x709b67c0), X(0x3d07c1d6), X(0x708378ff), X(0x3d33ec39), X(0x706b78e3), X(0x3d600d2c), X(0x70536771), X(0x3d8c24a8), X(0x703b44ad), X(0x3db832a6), X(0x7023109a), X(0x3de4371f), X(0x700acb3c), X(0x3e10320d), X(0x6ff27497), X(0x3e3c2369), X(0x6fda0cae), X(0x3e680b2c), X(0x6fc19385), X(0x3e93e950), X(0x6fa90921), X(0x3ebfbdcd), X(0x6f906d84), X(0x3eeb889c), X(0x6f77c0b3), X(0x3f1749b8), X(0x6f5f02b2), X(0x3f430119), X(0x6f463383), X(0x3f6eaeb8), X(0x6f2d532c), X(0x3f9a5290), X(0x6f1461b0), X(0x3fc5ec98), X(0x6efb5f12), X(0x3ff17cca), X(0x6ee24b57), X(0x401d0321), X(0x6ec92683), X(0x40487f94), X(0x6eaff099), X(0x4073f21d), X(0x6e96a99d), X(0x409f5ab6), X(0x6e7d5193), X(0x40cab958), X(0x6e63e87f), X(0x40f60dfb), X(0x6e4a6e66), X(0x4121589b), X(0x6e30e34a), X(0x414c992f), X(0x6e174730), X(0x4177cfb1), X(0x6dfd9a1c), X(0x41a2fc1a), X(0x6de3dc11), X(0x41ce1e65), X(0x6dca0d14), X(0x41f93689), X(0x6db02d29), X(0x42244481), X(0x6d963c54), X(0x424f4845), X(0x6d7c3a98), X(0x427a41d0), X(0x6d6227fa), X(0x42a5311b), X(0x6d48047e), X(0x42d0161e), X(0x6d2dd027), X(0x42faf0d4), X(0x6d138afb), X(0x4325c135), X(0x6cf934fc), X(0x4350873c), X(0x6cdece2f), X(0x437b42e1), X(0x6cc45698), X(0x43a5f41e), X(0x6ca9ce3b), X(0x43d09aed), X(0x6c8f351c), X(0x43fb3746), X(0x6c748b3f), X(0x4425c923), X(0x6c59d0a9), X(0x4450507e), X(0x6c3f055d), X(0x447acd50), X(0x6c242960), X(0x44a53f93), X(0x6c093cb6), X(0x44cfa740), X(0x6bee3f62), X(0x44fa0450), X(0x6bd3316a), X(0x452456bd), X(0x6bb812d1), X(0x454e9e80), X(0x6b9ce39b), X(0x4578db93), X(0x6b81a3cd), X(0x45a30df0), X(0x6b66536b), X(0x45cd358f), X(0x6b4af279), X(0x45f7526b), X(0x6b2f80fb), X(0x4621647d), X(0x6b13fef5), X(0x464b6bbe), X(0x6af86c6c), X(0x46756828), X(0x6adcc964), X(0x469f59b4), X(0x6ac115e2), X(0x46c9405c), X(0x6aa551e9), X(0x46f31c1a), X(0x6a897d7d), X(0x471cece7), X(0x6a6d98a4), X(0x4746b2bc), X(0x6a51a361), X(0x47706d93), X(0x6a359db9), X(0x479a1d67), X(0x6a1987b0), X(0x47c3c22f), X(0x69fd614a), X(0x47ed5be6), X(0x69e12a8c), X(0x4816ea86), X(0x69c4e37a), X(0x48406e08), X(0x69a88c19), X(0x4869e665), X(0x698c246c), X(0x48935397), X(0x696fac78), X(0x48bcb599), X(0x69532442), X(0x48e60c62), X(0x69368bce), X(0x490f57ee), X(0x6919e320), X(0x49389836), X(0x68fd2a3d), X(0x4961cd33), X(0x68e06129), X(0x498af6df), X(0x68c387e9), X(0x49b41533), X(0x68a69e81), X(0x49dd282a), X(0x6889a4f6), X(0x4a062fbd), X(0x686c9b4b), X(0x4a2f2be6), X(0x684f8186), X(0x4a581c9e), X(0x683257ab), X(0x4a8101de), X(0x68151dbe), X(0x4aa9dba2), X(0x67f7d3c5), X(0x4ad2a9e2), X(0x67da79c3), X(0x4afb6c98), X(0x67bd0fbd), X(0x4b2423be), X(0x679f95b7), X(0x4b4ccf4d), X(0x67820bb7), X(0x4b756f40), X(0x676471c0), X(0x4b9e0390), X(0x6746c7d8), X(0x4bc68c36), X(0x67290e02), X(0x4bef092d), X(0x670b4444), X(0x4c177a6e), X(0x66ed6aa1), X(0x4c3fdff4), X(0x66cf8120), X(0x4c6839b7), X(0x66b187c3), X(0x4c9087b1), X(0x66937e91), X(0x4cb8c9dd), X(0x6675658c), X(0x4ce10034), X(0x66573cbb), X(0x4d092ab0), X(0x66390422), X(0x4d31494b), X(0x661abbc5), X(0x4d595bfe), X(0x65fc63a9), X(0x4d8162c4), X(0x65ddfbd3), X(0x4da95d96), X(0x65bf8447), X(0x4dd14c6e), X(0x65a0fd0b), X(0x4df92f46), X(0x65826622), X(0x4e210617), X(0x6563bf92), X(0x4e48d0dd), X(0x6545095f), X(0x4e708f8f), X(0x6526438f), X(0x4e984229), X(0x65076e25), X(0x4ebfe8a5), X(0x64e88926), X(0x4ee782fb), X(0x64c99498), X(0x4f0f1126), X(0x64aa907f), X(0x4f369320), X(0x648b7ce0), X(0x4f5e08e3), X(0x646c59bf), X(0x4f857269), X(0x644d2722), X(0x4faccfab), X(0x642de50d), X(0x4fd420a4), X(0x640e9386), X(0x4ffb654d), X(0x63ef3290), X(0x50229da1), X(0x63cfc231), X(0x5049c999), X(0x63b0426d), X(0x5070e92f), X(0x6390b34a), X(0x5097fc5e), X(0x637114cc), X(0x50bf031f), X(0x635166f9), X(0x50e5fd6d), X(0x6331a9d4), X(0x510ceb40), X(0x6311dd64), X(0x5133cc94), X(0x62f201ac), X(0x515aa162), X(0x62d216b3), X(0x518169a5), X(0x62b21c7b), X(0x51a82555), X(0x6292130c), X(0x51ced46e), X(0x6271fa69), X(0x51f576ea), X(0x6251d298), X(0x521c0cc2), X(0x62319b9d), X(0x524295f0), X(0x6211557e), X(0x5269126e), X(0x61f1003f), X(0x528f8238), X(0x61d09be5), X(0x52b5e546), X(0x61b02876), X(0x52dc3b92), X(0x618fa5f7), X(0x53028518), X(0x616f146c), X(0x5328c1d0), X(0x614e73da), X(0x534ef1b5), X(0x612dc447), X(0x537514c2), X(0x610d05b7), X(0x539b2af0), X(0x60ec3830), X(0x53c13439), X(0x60cb5bb7), X(0x53e73097), X(0x60aa7050), X(0x540d2005), X(0x60897601), X(0x5433027d), X(0x60686ccf), X(0x5458d7f9), X(0x604754bf), X(0x547ea073), X(0x60262dd6), X(0x54a45be6), X(0x6004f819), X(0x54ca0a4b), X(0x5fe3b38d), X(0x54efab9c), X(0x5fc26038), X(0x55153fd4), X(0x5fa0fe1f), X(0x553ac6ee), X(0x5f7f8d46), X(0x556040e2), X(0x5f5e0db3), X(0x5585adad), X(0x5f3c7f6b), X(0x55ab0d46), X(0x5f1ae274), X(0x55d05faa), X(0x5ef936d1), X(0x55f5a4d2), X(0x5ed77c8a), X(0x561adcb9), X(0x5eb5b3a2), X(0x56400758), X(0x5e93dc1f), X(0x566524aa), X(0x5e71f606), X(0x568a34a9), X(0x5e50015d), X(0x56af3750), X(0x5e2dfe29), X(0x56d42c99), X(0x5e0bec6e), X(0x56f9147e), X(0x5de9cc33), X(0x571deefa), X(0x5dc79d7c), X(0x5742bc06), X(0x5da5604f), X(0x57677b9d), X(0x5d8314b1), X(0x578c2dba), X(0x5d60baa7), X(0x57b0d256), X(0x5d3e5237), X(0x57d5696d), X(0x5d1bdb65), X(0x57f9f2f8), X(0x5cf95638), X(0x581e6ef1), X(0x5cd6c2b5), X(0x5842dd54), X(0x5cb420e0), X(0x58673e1b), X(0x5c9170bf), X(0x588b9140), X(0x5c6eb258), X(0x58afd6bd), X(0x5c4be5b0), X(0x58d40e8c), X(0x5c290acc), X(0x58f838a9), X(0x5c0621b2), X(0x591c550e), X(0x5be32a67), X(0x594063b5), X(0x5bc024f0), X(0x59646498), X(0x5b9d1154), X(0x598857b2), X(0x5b79ef96), X(0x59ac3cfd), X(0x5b56bfbd), X(0x59d01475), X(0x5b3381ce), X(0x59f3de12), X(0x5b1035cf), X(0x5a1799d1), X(0x5aecdbc5), X(0x5a3b47ab), X(0x5ac973b5), X(0x5a5ee79a), X(0x5aa5fda5), X(0x5a82799a), X(0x5a82799a) }; /* {sin((2*i+1)*PI/4096), cos((2*i+1)*PI/4096)}, with i = 0 to 511 */ static LOOKUP_T sincos_lookup1[1024] = { X(0x001921fb), X(0x7ffffd88), X(0x004b65ee), X(0x7fffe9cb), X(0x007da9d4), X(0x7fffc251), X(0x00afeda8), X(0x7fff8719), X(0x00e23160), X(0x7fff3824), X(0x011474f6), X(0x7ffed572), X(0x0146b860), X(0x7ffe5f03), X(0x0178fb99), X(0x7ffdd4d7), X(0x01ab3e97), X(0x7ffd36ee), X(0x01dd8154), X(0x7ffc8549), X(0x020fc3c6), X(0x7ffbbfe6), X(0x024205e8), X(0x7ffae6c7), X(0x027447b0), X(0x7ff9f9ec), X(0x02a68917), X(0x7ff8f954), X(0x02d8ca16), X(0x7ff7e500), X(0x030b0aa4), X(0x7ff6bcf0), X(0x033d4abb), X(0x7ff58125), X(0x036f8a51), X(0x7ff4319d), X(0x03a1c960), X(0x7ff2ce5b), X(0x03d407df), X(0x7ff1575d), X(0x040645c7), X(0x7fefcca4), X(0x04388310), X(0x7fee2e30), X(0x046abfb3), X(0x7fec7c02), X(0x049cfba7), X(0x7feab61a), X(0x04cf36e5), X(0x7fe8dc78), X(0x05017165), X(0x7fe6ef1c), X(0x0533ab20), X(0x7fe4ee06), X(0x0565e40d), X(0x7fe2d938), X(0x05981c26), X(0x7fe0b0b1), X(0x05ca5361), X(0x7fde7471), X(0x05fc89b8), X(0x7fdc247a), X(0x062ebf22), X(0x7fd9c0ca), X(0x0660f398), X(0x7fd74964), X(0x06932713), X(0x7fd4be46), X(0x06c5598a), X(0x7fd21f72), X(0x06f78af6), X(0x7fcf6ce8), X(0x0729bb4e), X(0x7fcca6a7), X(0x075bea8c), X(0x7fc9ccb2), X(0x078e18a7), X(0x7fc6df08), X(0x07c04598), X(0x7fc3dda9), X(0x07f27157), X(0x7fc0c896), X(0x08249bdd), X(0x7fbd9fd0), X(0x0856c520), X(0x7fba6357), X(0x0888ed1b), X(0x7fb7132b), X(0x08bb13c5), X(0x7fb3af4e), X(0x08ed3916), X(0x7fb037bf), X(0x091f5d06), X(0x7facac7f), X(0x09517f8f), X(0x7fa90d8e), X(0x0983a0a7), X(0x7fa55aee), X(0x09b5c048), X(0x7fa1949e), X(0x09e7de6a), X(0x7f9dbaa0), X(0x0a19fb04), X(0x7f99ccf4), X(0x0a4c1610), X(0x7f95cb9a), X(0x0a7e2f85), X(0x7f91b694), X(0x0ab0475c), X(0x7f8d8de1), X(0x0ae25d8d), X(0x7f895182), X(0x0b147211), X(0x7f850179), X(0x0b4684df), X(0x7f809dc5), X(0x0b7895f0), X(0x7f7c2668), X(0x0baaa53b), X(0x7f779b62), X(0x0bdcb2bb), X(0x7f72fcb4), X(0x0c0ebe66), X(0x7f6e4a5e), X(0x0c40c835), X(0x7f698461), X(0x0c72d020), X(0x7f64aabf), X(0x0ca4d620), X(0x7f5fbd77), X(0x0cd6da2d), X(0x7f5abc8a), X(0x0d08dc3f), X(0x7f55a7fa), X(0x0d3adc4e), X(0x7f507fc7), X(0x0d6cda53), X(0x7f4b43f2), X(0x0d9ed646), X(0x7f45f47b), X(0x0dd0d01f), X(0x7f409164), X(0x0e02c7d7), X(0x7f3b1aad), X(0x0e34bd66), X(0x7f359057), X(0x0e66b0c3), X(0x7f2ff263), X(0x0e98a1e9), X(0x7f2a40d2), X(0x0eca90ce), X(0x7f247ba5), X(0x0efc7d6b), X(0x7f1ea2dc), X(0x0f2e67b8), X(0x7f18b679), X(0x0f604faf), X(0x7f12b67c), X(0x0f923546), X(0x7f0ca2e7), X(0x0fc41876), X(0x7f067bba), X(0x0ff5f938), X(0x7f0040f6), X(0x1027d784), X(0x7ef9f29d), X(0x1059b352), X(0x7ef390ae), X(0x108b8c9b), X(0x7eed1b2c), X(0x10bd6356), X(0x7ee69217), X(0x10ef377d), X(0x7edff570), X(0x11210907), X(0x7ed94538), X(0x1152d7ed), X(0x7ed28171), X(0x1184a427), X(0x7ecbaa1a), X(0x11b66dad), X(0x7ec4bf36), X(0x11e83478), X(0x7ebdc0c6), X(0x1219f880), X(0x7eb6aeca), X(0x124bb9be), X(0x7eaf8943), X(0x127d7829), X(0x7ea85033), X(0x12af33ba), X(0x7ea1039b), X(0x12e0ec6a), X(0x7e99a37c), X(0x1312a230), X(0x7e922fd6), X(0x13445505), X(0x7e8aa8ac), X(0x137604e2), X(0x7e830dff), X(0x13a7b1bf), X(0x7e7b5fce), X(0x13d95b93), X(0x7e739e1d), X(0x140b0258), X(0x7e6bc8eb), X(0x143ca605), X(0x7e63e03b), X(0x146e4694), X(0x7e5be40c), X(0x149fe3fc), X(0x7e53d462), X(0x14d17e36), X(0x7e4bb13c), X(0x1503153a), X(0x7e437a9c), X(0x1534a901), X(0x7e3b3083), X(0x15663982), X(0x7e32d2f4), X(0x1597c6b7), X(0x7e2a61ed), X(0x15c95097), X(0x7e21dd73), X(0x15fad71b), X(0x7e194584), X(0x162c5a3b), X(0x7e109a24), X(0x165dd9f0), X(0x7e07db52), X(0x168f5632), X(0x7dff0911), X(0x16c0cef9), X(0x7df62362), X(0x16f2443e), X(0x7ded2a47), X(0x1723b5f9), X(0x7de41dc0), X(0x17552422), X(0x7ddafdce), X(0x17868eb3), X(0x7dd1ca75), X(0x17b7f5a3), X(0x7dc883b4), X(0x17e958ea), X(0x7dbf298d), X(0x181ab881), X(0x7db5bc02), X(0x184c1461), X(0x7dac3b15), X(0x187d6c82), X(0x7da2a6c6), X(0x18aec0db), X(0x7d98ff17), X(0x18e01167), X(0x7d8f4409), X(0x19115e1c), X(0x7d85759f), X(0x1942a6f3), X(0x7d7b93da), X(0x1973ebe6), X(0x7d719eba), X(0x19a52ceb), X(0x7d679642), X(0x19d669fc), X(0x7d5d7a74), X(0x1a07a311), X(0x7d534b50), X(0x1a38d823), X(0x7d4908d9), X(0x1a6a0929), X(0x7d3eb30f), X(0x1a9b361d), X(0x7d3449f5), X(0x1acc5ef6), X(0x7d29cd8c), X(0x1afd83ad), X(0x7d1f3dd6), X(0x1b2ea43a), X(0x7d149ad5), X(0x1b5fc097), X(0x7d09e489), X(0x1b90d8bb), X(0x7cff1af5), X(0x1bc1ec9e), X(0x7cf43e1a), X(0x1bf2fc3a), X(0x7ce94dfb), X(0x1c240786), X(0x7cde4a98), X(0x1c550e7c), X(0x7cd333f3), X(0x1c861113), X(0x7cc80a0f), X(0x1cb70f43), X(0x7cbcccec), X(0x1ce80906), X(0x7cb17c8d), X(0x1d18fe54), X(0x7ca618f3), X(0x1d49ef26), X(0x7c9aa221), X(0x1d7adb73), X(0x7c8f1817), X(0x1dabc334), X(0x7c837ad8), X(0x1ddca662), X(0x7c77ca65), X(0x1e0d84f5), X(0x7c6c06c0), X(0x1e3e5ee5), X(0x7c602fec), X(0x1e6f342c), X(0x7c5445e9), X(0x1ea004c1), X(0x7c4848ba), X(0x1ed0d09d), X(0x7c3c3860), X(0x1f0197b8), X(0x7c3014de), X(0x1f325a0b), X(0x7c23de35), X(0x1f63178f), X(0x7c179467), X(0x1f93d03c), X(0x7c0b3777), X(0x1fc4840a), X(0x7bfec765), X(0x1ff532f2), X(0x7bf24434), X(0x2025dcec), X(0x7be5ade6), X(0x205681f1), X(0x7bd9047c), X(0x208721f9), X(0x7bcc47fa), X(0x20b7bcfe), X(0x7bbf7860), X(0x20e852f6), X(0x7bb295b0), X(0x2118e3dc), X(0x7ba59fee), X(0x21496fa7), X(0x7b989719), X(0x2179f64f), X(0x7b8b7b36), X(0x21aa77cf), X(0x7b7e4c45), X(0x21daf41d), X(0x7b710a49), X(0x220b6b32), X(0x7b63b543), X(0x223bdd08), X(0x7b564d36), X(0x226c4996), X(0x7b48d225), X(0x229cb0d5), X(0x7b3b4410), X(0x22cd12bd), X(0x7b2da2fa), X(0x22fd6f48), X(0x7b1feee5), X(0x232dc66d), X(0x7b1227d3), X(0x235e1826), X(0x7b044dc7), X(0x238e646a), X(0x7af660c2), X(0x23beab33), X(0x7ae860c7), X(0x23eeec78), X(0x7ada4dd8), X(0x241f2833), X(0x7acc27f7), X(0x244f5e5c), X(0x7abdef25), X(0x247f8eec), X(0x7aafa367), X(0x24afb9da), X(0x7aa144bc), X(0x24dfdf20), X(0x7a92d329), X(0x250ffeb7), X(0x7a844eae), X(0x25401896), X(0x7a75b74f), X(0x25702cb7), X(0x7a670d0d), X(0x25a03b11), X(0x7a584feb), X(0x25d0439f), X(0x7a497feb), X(0x26004657), X(0x7a3a9d0f), X(0x26304333), X(0x7a2ba75a), X(0x26603a2c), X(0x7a1c9ece), X(0x26902b39), X(0x7a0d836d), X(0x26c01655), X(0x79fe5539), X(0x26effb76), X(0x79ef1436), X(0x271fda96), X(0x79dfc064), X(0x274fb3ae), X(0x79d059c8), X(0x277f86b5), X(0x79c0e062), X(0x27af53a6), X(0x79b15435), X(0x27df1a77), X(0x79a1b545), X(0x280edb23), X(0x79920392), X(0x283e95a1), X(0x79823f20), X(0x286e49ea), X(0x797267f2), X(0x289df7f8), X(0x79627e08), X(0x28cd9fc1), X(0x79528167), X(0x28fd4140), X(0x79427210), X(0x292cdc6d), X(0x79325006), X(0x295c7140), X(0x79221b4b), X(0x298bffb2), X(0x7911d3e2), X(0x29bb87bc), X(0x790179cd), X(0x29eb0957), X(0x78f10d0f), X(0x2a1a847b), X(0x78e08dab), X(0x2a49f920), X(0x78cffba3), X(0x2a796740), X(0x78bf56f9), X(0x2aa8ced3), X(0x78ae9fb0), X(0x2ad82fd2), X(0x789dd5cb), X(0x2b078a36), X(0x788cf94c), X(0x2b36ddf7), X(0x787c0a36), X(0x2b662b0e), X(0x786b088c), X(0x2b957173), X(0x7859f44f), X(0x2bc4b120), X(0x7848cd83), X(0x2bf3ea0d), X(0x7837942b), X(0x2c231c33), X(0x78264849), X(0x2c52478a), X(0x7814e9df), X(0x2c816c0c), X(0x780378f1), X(0x2cb089b1), X(0x77f1f581), X(0x2cdfa071), X(0x77e05f91), X(0x2d0eb046), X(0x77ceb725), X(0x2d3db928), X(0x77bcfc3f), X(0x2d6cbb10), X(0x77ab2ee2), X(0x2d9bb5f6), X(0x77994f11), X(0x2dcaa9d5), X(0x77875cce), X(0x2df996a3), X(0x7775581d), X(0x2e287c5a), X(0x776340ff), X(0x2e575af3), X(0x77511778), X(0x2e863267), X(0x773edb8b), X(0x2eb502ae), X(0x772c8d3a), X(0x2ee3cbc1), X(0x771a2c88), X(0x2f128d99), X(0x7707b979), X(0x2f41482e), X(0x76f5340e), X(0x2f6ffb7a), X(0x76e29c4b), X(0x2f9ea775), X(0x76cff232), X(0x2fcd4c19), X(0x76bd35c7), X(0x2ffbe95d), X(0x76aa670d), X(0x302a7f3a), X(0x76978605), X(0x30590dab), X(0x768492b4), X(0x308794a6), X(0x76718d1c), X(0x30b61426), X(0x765e7540), X(0x30e48c22), X(0x764b4b23), X(0x3112fc95), X(0x76380ec8), X(0x31416576), X(0x7624c031), X(0x316fc6be), X(0x76115f63), X(0x319e2067), X(0x75fdec60), X(0x31cc7269), X(0x75ea672a), X(0x31fabcbd), X(0x75d6cfc5), X(0x3228ff5c), X(0x75c32634), X(0x32573a3f), X(0x75af6a7b), X(0x32856d5e), X(0x759b9c9b), X(0x32b398b3), X(0x7587bc98), X(0x32e1bc36), X(0x7573ca75), X(0x330fd7e1), X(0x755fc635), X(0x333debab), X(0x754bafdc), X(0x336bf78f), X(0x7537876c), X(0x3399fb85), X(0x75234ce8), X(0x33c7f785), X(0x750f0054), X(0x33f5eb89), X(0x74faa1b3), X(0x3423d78a), X(0x74e63108), X(0x3451bb81), X(0x74d1ae55), X(0x347f9766), X(0x74bd199f), X(0x34ad6b32), X(0x74a872e8), X(0x34db36df), X(0x7493ba34), X(0x3508fa66), X(0x747eef85), X(0x3536b5be), X(0x746a12df), X(0x356468e2), X(0x74552446), X(0x359213c9), X(0x744023bc), X(0x35bfb66e), X(0x742b1144), X(0x35ed50c9), X(0x7415ece2), X(0x361ae2d3), X(0x7400b69a), X(0x36486c86), X(0x73eb6e6e), X(0x3675edd9), X(0x73d61461), X(0x36a366c6), X(0x73c0a878), X(0x36d0d746), X(0x73ab2ab4), X(0x36fe3f52), X(0x73959b1b), X(0x372b9ee3), X(0x737ff9ae), X(0x3758f5f2), X(0x736a4671), X(0x37864477), X(0x73548168), X(0x37b38a6d), X(0x733eaa96), X(0x37e0c7cc), X(0x7328c1ff), X(0x380dfc8d), X(0x7312c7a5), X(0x383b28a9), X(0x72fcbb8c), X(0x38684c19), X(0x72e69db7), X(0x389566d6), X(0x72d06e2b), X(0x38c278d9), X(0x72ba2cea), X(0x38ef821c), X(0x72a3d9f7), X(0x391c8297), X(0x728d7557), X(0x39497a43), X(0x7276ff0d), X(0x39766919), X(0x7260771b), X(0x39a34f13), X(0x7249dd86), X(0x39d02c2a), X(0x72333251), X(0x39fd0056), X(0x721c7580), X(0x3a29cb91), X(0x7205a716), X(0x3a568dd4), X(0x71eec716), X(0x3a834717), X(0x71d7d585), X(0x3aaff755), X(0x71c0d265), X(0x3adc9e86), X(0x71a9bdba), X(0x3b093ca3), X(0x71929789), X(0x3b35d1a5), X(0x717b5fd3), X(0x3b625d86), X(0x7164169d), X(0x3b8ee03e), X(0x714cbbeb), X(0x3bbb59c7), X(0x71354fc0), X(0x3be7ca1a), X(0x711dd220), X(0x3c143130), X(0x7106430e), X(0x3c408f03), X(0x70eea28e), X(0x3c6ce38a), X(0x70d6f0a4), X(0x3c992ec0), X(0x70bf2d53), X(0x3cc5709e), X(0x70a7589f), X(0x3cf1a91c), X(0x708f728b), X(0x3d1dd835), X(0x70777b1c), X(0x3d49fde1), X(0x705f7255), X(0x3d761a19), X(0x70475839), X(0x3da22cd7), X(0x702f2ccd), X(0x3dce3614), X(0x7016f014), X(0x3dfa35c8), X(0x6ffea212), X(0x3e262bee), X(0x6fe642ca), X(0x3e52187f), X(0x6fcdd241), X(0x3e7dfb73), X(0x6fb5507a), X(0x3ea9d4c3), X(0x6f9cbd79), X(0x3ed5a46b), X(0x6f841942), X(0x3f016a61), X(0x6f6b63d8), X(0x3f2d26a0), X(0x6f529d40), X(0x3f58d921), X(0x6f39c57d), X(0x3f8481dd), X(0x6f20dc92), X(0x3fb020ce), X(0x6f07e285), X(0x3fdbb5ec), X(0x6eeed758), X(0x40074132), X(0x6ed5bb10), X(0x4032c297), X(0x6ebc8db0), X(0x405e3a16), X(0x6ea34f3d), X(0x4089a7a8), X(0x6e89ffb9), X(0x40b50b46), X(0x6e709f2a), X(0x40e064ea), X(0x6e572d93), X(0x410bb48c), X(0x6e3daaf8), X(0x4136fa27), X(0x6e24175c), X(0x416235b2), X(0x6e0a72c5), X(0x418d6729), X(0x6df0bd35), X(0x41b88e84), X(0x6dd6f6b1), X(0x41e3abbc), X(0x6dbd1f3c), X(0x420ebecb), X(0x6da336dc), X(0x4239c7aa), X(0x6d893d93), X(0x4264c653), X(0x6d6f3365), X(0x428fbabe), X(0x6d551858), X(0x42baa4e6), X(0x6d3aec6e), X(0x42e584c3), X(0x6d20afac), X(0x43105a50), X(0x6d066215), X(0x433b2585), X(0x6cec03af), X(0x4365e65b), X(0x6cd1947c), X(0x43909ccd), X(0x6cb71482), X(0x43bb48d4), X(0x6c9c83c3), X(0x43e5ea68), X(0x6c81e245), X(0x44108184), X(0x6c67300b), X(0x443b0e21), X(0x6c4c6d1a), X(0x44659039), X(0x6c319975), X(0x449007c4), X(0x6c16b521), X(0x44ba74bd), X(0x6bfbc021), X(0x44e4d71c), X(0x6be0ba7b), X(0x450f2edb), X(0x6bc5a431), X(0x45397bf4), X(0x6baa7d49), X(0x4563be60), X(0x6b8f45c7), X(0x458df619), X(0x6b73fdae), X(0x45b82318), X(0x6b58a503), X(0x45e24556), X(0x6b3d3bcb), X(0x460c5cce), X(0x6b21c208), X(0x46366978), X(0x6b0637c1), X(0x46606b4e), X(0x6aea9cf8), X(0x468a624a), X(0x6acef1b2), X(0x46b44e65), X(0x6ab335f4), X(0x46de2f99), X(0x6a9769c1), X(0x470805df), X(0x6a7b8d1e), X(0x4731d131), X(0x6a5fa010), X(0x475b9188), X(0x6a43a29a), X(0x478546de), X(0x6a2794c1), X(0x47aef12c), X(0x6a0b7689), X(0x47d8906d), X(0x69ef47f6), X(0x48022499), X(0x69d3090e), X(0x482badab), X(0x69b6b9d3), X(0x48552b9b), X(0x699a5a4c), X(0x487e9e64), X(0x697dea7b), X(0x48a805ff), X(0x69616a65), X(0x48d16265), X(0x6944da10), X(0x48fab391), X(0x6928397e), X(0x4923f97b), X(0x690b88b5), X(0x494d341e), X(0x68eec7b9), X(0x49766373), X(0x68d1f68f), X(0x499f8774), X(0x68b5153a), X(0x49c8a01b), X(0x689823bf), X(0x49f1ad61), X(0x687b2224), X(0x4a1aaf3f), X(0x685e106c), X(0x4a43a5b0), X(0x6840ee9b), X(0x4a6c90ad), X(0x6823bcb7), X(0x4a957030), X(0x68067ac3), X(0x4abe4433), X(0x67e928c5), X(0x4ae70caf), X(0x67cbc6c0), X(0x4b0fc99d), X(0x67ae54ba), X(0x4b387af9), X(0x6790d2b6), X(0x4b6120bb), X(0x677340ba), X(0x4b89badd), X(0x67559eca), X(0x4bb24958), X(0x6737ecea), X(0x4bdacc28), X(0x671a2b20), X(0x4c034345), X(0x66fc596f), X(0x4c2baea9), X(0x66de77dc), X(0x4c540e4e), X(0x66c0866d), X(0x4c7c622d), X(0x66a28524), X(0x4ca4aa41), X(0x66847408), X(0x4ccce684), X(0x6666531d), X(0x4cf516ee), X(0x66482267), X(0x4d1d3b7a), X(0x6629e1ec), X(0x4d455422), X(0x660b91af), X(0x4d6d60df), X(0x65ed31b5), X(0x4d9561ac), X(0x65cec204), X(0x4dbd5682), X(0x65b0429f), X(0x4de53f5a), X(0x6591b38c), X(0x4e0d1c30), X(0x657314cf), X(0x4e34ecfc), X(0x6554666d), X(0x4e5cb1b9), X(0x6535a86b), X(0x4e846a60), X(0x6516dacd), X(0x4eac16eb), X(0x64f7fd98), X(0x4ed3b755), X(0x64d910d1), X(0x4efb4b96), X(0x64ba147d), X(0x4f22d3aa), X(0x649b08a0), X(0x4f4a4f89), X(0x647bed3f), X(0x4f71bf2e), X(0x645cc260), X(0x4f992293), X(0x643d8806), X(0x4fc079b1), X(0x641e3e38), X(0x4fe7c483), X(0x63fee4f8), X(0x500f0302), X(0x63df7c4d), X(0x50363529), X(0x63c0043b), X(0x505d5af1), X(0x63a07cc7), X(0x50847454), X(0x6380e5f6), X(0x50ab814d), X(0x63613fcd), X(0x50d281d5), X(0x63418a50), X(0x50f975e6), X(0x6321c585), X(0x51205d7b), X(0x6301f171), X(0x5147388c), X(0x62e20e17), X(0x516e0715), X(0x62c21b7e), X(0x5194c910), X(0x62a219aa), X(0x51bb7e75), X(0x628208a1), X(0x51e22740), X(0x6261e866), X(0x5208c36a), X(0x6241b8ff), X(0x522f52ee), X(0x62217a72), X(0x5255d5c5), X(0x62012cc2), X(0x527c4bea), X(0x61e0cff5), X(0x52a2b556), X(0x61c06410), X(0x52c91204), X(0x619fe918), X(0x52ef61ee), X(0x617f5f12), X(0x5315a50e), X(0x615ec603), X(0x533bdb5d), X(0x613e1df0), X(0x536204d7), X(0x611d66de), X(0x53882175), X(0x60fca0d2), X(0x53ae3131), X(0x60dbcbd1), X(0x53d43406), X(0x60bae7e1), X(0x53fa29ed), X(0x6099f505), X(0x542012e1), X(0x6078f344), X(0x5445eedb), X(0x6057e2a2), X(0x546bbdd7), X(0x6036c325), X(0x54917fce), X(0x601594d1), X(0x54b734ba), X(0x5ff457ad), X(0x54dcdc96), X(0x5fd30bbc), X(0x5502775c), X(0x5fb1b104), X(0x55280505), X(0x5f90478a), X(0x554d858d), X(0x5f6ecf53), X(0x5572f8ed), X(0x5f4d4865), X(0x55985f20), X(0x5f2bb2c5), X(0x55bdb81f), X(0x5f0a0e77), X(0x55e303e6), X(0x5ee85b82), X(0x5608426e), X(0x5ec699e9), X(0x562d73b2), X(0x5ea4c9b3), X(0x565297ab), X(0x5e82eae5), X(0x5677ae54), X(0x5e60fd84), X(0x569cb7a8), X(0x5e3f0194), X(0x56c1b3a1), X(0x5e1cf71c), X(0x56e6a239), X(0x5dfade20), X(0x570b8369), X(0x5dd8b6a7), X(0x5730572e), X(0x5db680b4), X(0x57551d80), X(0x5d943c4e), X(0x5779d65b), X(0x5d71e979), X(0x579e81b8), X(0x5d4f883b), X(0x57c31f92), X(0x5d2d189a), X(0x57e7afe4), X(0x5d0a9a9a), X(0x580c32a7), X(0x5ce80e41), X(0x5830a7d6), X(0x5cc57394), X(0x58550f6c), X(0x5ca2ca99), X(0x58796962), X(0x5c801354), X(0x589db5b3), X(0x5c5d4dcc), X(0x58c1f45b), X(0x5c3a7a05), X(0x58e62552), X(0x5c179806), X(0x590a4893), X(0x5bf4a7d2), X(0x592e5e19), X(0x5bd1a971), X(0x595265df), X(0x5bae9ce7), X(0x59765fde), X(0x5b8b8239), X(0x599a4c12), X(0x5b68596d), X(0x59be2a74), X(0x5b452288), X(0x59e1faff), X(0x5b21dd90), X(0x5a05bdae), X(0x5afe8a8b), X(0x5a29727b), X(0x5adb297d), X(0x5a4d1960), X(0x5ab7ba6c), X(0x5a70b258), X(0x5a943d5e), }; gx/images/Button_save.png000664 001750 001750 00000010777 12702465756 016616 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/02/101 SIDATxytUU]^vN @A Ax\`y3039yOgވyʸ1qAeTt@(} $}TwW?:UTw#yu=UuW]׹(%\`60(2 ā8lޖeŔGTZ|ϑ6׷{!47#J$<+B&ǁzE`,ˇ.TTEj޶_  YX'o~rJ91D 4hOC:"ʫ&3z%e!c/,PQw>زm4M#r:#_8gZP!N^Mgݧ8nf\3Y#:~Y(vl6NNïR/Wt&eX heY=[PQK'NL[US3_]!y5܍EEA * %7wTz3&=Gۖ+kr>e*2xms}E F^E٤H3Pn2Z7AN(zRDQTU%FM5` 9շu 1?'wsՔdYz <|&^DwP{V,^tq`~:W"l8ox̄+0w|>222]4[i bI=6 5MCn7z,w@ç8T]M Xr`] ?vx̑_3qӘy[(le7B¤jU4$IB'~ p$ïz=sc*׆S=y 7d(q8U[x!kAC8i? A9?yh83ŀ]Uj6ru!''azC4hLJF]Apw#UאS6e+^_*2t .YngWk=W.F O=Gvv6$pjƣܮ{ڹ;p8^ooȔEt7JTepaشߚEWr%9iUUM-Zc*@]2 ;p7߾~Jt7H;Ip.<x<$g S!i,UƸ$tW(MXnJ^5poS6yIj|3~v)**" ܜv~;X ӢU Tt H2]-x XS[|7-̙3phlؕ+W: ,jA wjp#sɝVfg麎dԩgr0D""ynO=TZ@@|P"='EH  3 4p8̾}D"TU% |rTU55gA;Y7. u@蛖DQLrfE"^z%x z{{ èJ .]jG}>83ӦQGj"\( f4LWWO?4[l!$k 1AW hIT=93@w18G! &M!ÇYt){1>0 &oqvO59; "HqrLJD$cXxq|>,Ybj2cq̮D"&Mu%T.a5Kmk`P41qlՕ~M@^}Qadҥ"?<999_~n4Mz(m mN]t\ E ');MF?j-x<b1֮];Be[ 뚦/dkȲ)ʲMR~hb&S8.sva.i7HW4j`ʸ0rF" "tS/ՁWLVmKB)+qf q@pԽT4)`8$Ǘ7Lo[f̾_%73/"}`ej7@v32*7APWN|3fNF9.u",@(MozQxeV\QtP;k| xx (No髗;D`H7>rhA؝g1f}-Zl+'؟&>H&aZ~>($ \ fcQVe%ſ-gZǑ-{"3XbB-T- ȤOK|Jo>'vi$2}]:8{KOh @aՌD~ 6xo{4~OpOcHq,/K(rpU5#p?xhѳq̈́LmUhǁudg1fx/6pkF} oA%&~N}!vS;,~#*XV`,_`m KYe1Pͧg>Aq8\YIuez%&X}ѻAr[:cPv {j}CƳ螟ˊ#U>`!57hs: JLX/ov( Y*`ޚvgn޸5C~ 0?CnhMвw-O~p&f+Ų,wcmfoN8>K~64-7O0VՕ!`?Xn, $iսuS% \)pȤG^+h!1_leSg_ IENDB`core/input_hw/xe_1ap.h000664 001750 001750 00000004672 12702465756 016044 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * XE-1AP analog controller support * * Copyright (C) 2011-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _XE_1APH_ #define _XE_1APH_ /* Function prototypes */ extern void xe_1ap_reset(int index); extern unsigned char xe_1ap_1_read(void); extern unsigned char xe_1ap_2_read(void); extern void xe_1ap_1_write(unsigned char data, unsigned char mask); extern void xe_1ap_2_write(unsigned char data, unsigned char mask); #endif core/tremor/framing.c000664 001750 001750 00000072512 12702465756 015756 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: decode Ogg streams back into raw packets note: The CRC code is directly derived from public domain code by Ross Williams (ross@guest.adelaide.edu.au). See docs/framing.html for details. ********************************************************************/ #include #include #include "ogg.h" #include "misc.h" /* A complete description of Ogg framing exists in docs/framing.html */ /* basic, centralized Ogg memory management based on linked lists of references to refcounted memory buffers. References and buffers are both recycled. Buffers are passed around and consumed in reference form. */ static ogg_buffer_state *ogg_buffer_create(void){ ogg_buffer_state *bs=_ogg_calloc(1,sizeof(*bs)); return bs; } /* destruction is 'lazy'; there may be memory references outstanding, and yanking the buffer state out from underneath would be antisocial. Dealloc what is currently unused and have _release_one watch for the stragglers to come in. When they do, finish destruction. */ /* call the helper while holding lock */ static void _ogg_buffer_destroy(ogg_buffer_state *bs){ ogg_buffer *bt; ogg_reference *rt; if(bs->shutdown){ bt=bs->unused_buffers; rt=bs->unused_references; while(bt){ ogg_buffer *b=bt; bt=b->ptr.next; if(b->data)_ogg_free(b->data); _ogg_free(b); } bs->unused_buffers=0; while(rt){ ogg_reference *r=rt; rt=r->next; _ogg_free(r); } bs->unused_references=0; if(!bs->outstanding) _ogg_free(bs); } } static void ogg_buffer_destroy(ogg_buffer_state *bs){ bs->shutdown=1; _ogg_buffer_destroy(bs); } static ogg_buffer *_fetch_buffer(ogg_buffer_state *bs,long bytes){ ogg_buffer *ob; bs->outstanding++; /* do we have an unused buffer sitting in the pool? */ if(bs->unused_buffers){ ob=bs->unused_buffers; bs->unused_buffers=ob->ptr.next; /* if the unused buffer is too small, grow it */ if(ob->sizedata=_ogg_realloc(ob->data,bytes); ob->size=bytes; } }else{ /* allocate a new buffer */ ob=_ogg_malloc(sizeof(*ob)); ob->data=_ogg_malloc(bytes<16?16:bytes); ob->size=bytes; } ob->refcount=1; ob->ptr.owner=bs; return ob; } static ogg_reference *_fetch_ref(ogg_buffer_state *bs){ ogg_reference *or; bs->outstanding++; /* do we have an unused reference sitting in the pool? */ if(bs->unused_references){ or=bs->unused_references; bs->unused_references=or->next; }else{ /* allocate a new reference */ or=_ogg_malloc(sizeof(*or)); } or->begin=0; or->length=0; or->next=0; return or; } /* fetch a reference pointing to a fresh, initially continguous buffer of at least [bytes] length */ static ogg_reference *ogg_buffer_alloc(ogg_buffer_state *bs,long bytes){ ogg_buffer *ob=_fetch_buffer(bs,bytes); ogg_reference *or=_fetch_ref(bs); or->buffer=ob; return or; } /* enlarge the data buffer in the current link */ static void ogg_buffer_realloc(ogg_reference *or,long bytes){ ogg_buffer *ob=or->buffer; /* if the unused buffer is too small, grow it */ if(ob->sizedata=_ogg_realloc(ob->data,bytes); ob->size=bytes; } } static void _ogg_buffer_mark_one(ogg_reference *or){ or->buffer->refcount++; } /* increase the refcount of the buffers to which the reference points */ static void ogg_buffer_mark(ogg_reference *or){ while(or){ _ogg_buffer_mark_one(or); or=or->next; } } /* duplicate a reference (pointing to the same actual buffer memory) and increment buffer refcount. If the desired segment begins out of range, NULL is returned; if the desired segment is simply zero length, a zero length ref is returned. Partial range overlap returns the overlap of the ranges */ static ogg_reference *ogg_buffer_sub(ogg_reference *or,long begin,long length){ ogg_reference *ret=0,*head=0; /* walk past any preceeding fragments we don't want */ while(or && begin>=or->length){ begin-=or->length; or=or->next; } /* duplicate the reference chain; increment refcounts */ while(or && length){ ogg_reference *temp=_fetch_ref(or->buffer->ptr.owner); if(head) head->next=temp; else ret=temp; head=temp; head->buffer=or->buffer; head->begin=or->begin+begin; head->length=length; if(head->length>or->length-begin) head->length=or->length-begin; begin=0; length-=head->length; or=or->next; } ogg_buffer_mark(ret); return ret; } ogg_reference *ogg_buffer_dup(ogg_reference *or){ ogg_reference *ret=0,*head=0; /* duplicate the reference chain; increment refcounts */ while(or){ ogg_reference *temp=_fetch_ref(or->buffer->ptr.owner); if(head) head->next=temp; else ret=temp; head=temp; head->buffer=or->buffer; head->begin=or->begin; head->length=or->length; or=or->next; } ogg_buffer_mark(ret); return ret; } /* split a reference into two references; 'return' is a reference to the buffer preceeding pos and 'head'/'tail' are the buffer past the split. If pos is at or past the end of the passed in segment, 'head/tail' are NULL */ static ogg_reference *ogg_buffer_split(ogg_reference **tail, ogg_reference **head,long pos){ /* walk past any preceeding fragments to one of: a) the exact boundary that seps two fragments b) the fragment that needs split somewhere in the middle */ ogg_reference *ret=*tail; ogg_reference *or=*tail; while(or && pos>or->length){ pos-=or->length; or=or->next; } if(!or || pos==0){ return 0; }else{ if(pos>=or->length){ /* exact split, or off the end? */ if(or->next){ /* a split */ *tail=or->next; or->next=0; }else{ /* off or at the end */ *tail=*head=0; } }else{ /* split within a fragment */ long lengthA=pos; long beginB=or->begin+pos; long lengthB=or->length-pos; /* make a new reference to tail the second piece */ *tail=_fetch_ref(or->buffer->ptr.owner); (*tail)->buffer=or->buffer; (*tail)->begin=beginB; (*tail)->length=lengthB; (*tail)->next=or->next; _ogg_buffer_mark_one(*tail); if(head && or==*head)*head=*tail; /* update the first piece */ or->next=0; or->length=lengthA; } } return ret; } static void ogg_buffer_release_one(ogg_reference *or){ ogg_buffer *ob=or->buffer; ogg_buffer_state *bs=ob->ptr.owner; ob->refcount--; if(ob->refcount==0){ bs->outstanding--; /* for the returned buffer */ ob->ptr.next=bs->unused_buffers; bs->unused_buffers=ob; } bs->outstanding--; /* for the returned reference */ or->next=bs->unused_references; bs->unused_references=or; _ogg_buffer_destroy(bs); /* lazy cleanup (if needed) */ } /* release the references, decrease the refcounts of buffers to which they point, release any buffers with a refcount that drops to zero */ static void ogg_buffer_release(ogg_reference *or){ while(or){ ogg_reference *next=or->next; ogg_buffer_release_one(or); or=next; } } static ogg_reference *ogg_buffer_pretruncate(ogg_reference *or,long pos){ /* release preceeding fragments we don't want */ while(or && pos>=or->length){ ogg_reference *next=or->next; pos-=or->length; ogg_buffer_release_one(or); or=next; } if (or) { or->begin+=pos; or->length-=pos; } return or; } static ogg_reference *ogg_buffer_walk(ogg_reference *or){ if(!or)return NULL; while(or->next){ or=or->next; } return(or); } /* *head is appended to the front end (head) of *tail; both continue to be valid pointers, with *tail at the tail and *head at the head */ static ogg_reference *ogg_buffer_cat(ogg_reference *tail, ogg_reference *head){ if(!tail)return head; while(tail->next){ tail=tail->next; } tail->next=head; return ogg_buffer_walk(head); } static void _positionB(oggbyte_buffer *b,int pos){ if(pospos){ /* start at beginning, scan forward */ b->ref=b->baseref; b->pos=0; b->end=b->pos+b->ref->length; b->ptr=b->ref->buffer->data+b->ref->begin; } } static void _positionF(oggbyte_buffer *b,int pos){ /* scan forward for position */ while(pos>=b->end){ /* just seek forward */ b->pos+=b->ref->length; b->ref=b->ref->next; b->end=b->ref->length+b->pos; b->ptr=b->ref->buffer->data+b->ref->begin; } } static int oggbyte_init(oggbyte_buffer *b,ogg_reference *or){ memset(b,0,sizeof(*b)); if(or){ b->ref=b->baseref=or; b->pos=0; b->end=b->ref->length; b->ptr=b->ref->buffer->data+b->ref->begin; return 0; }else return -1; } static void oggbyte_set4(oggbyte_buffer *b,ogg_uint32_t val,int pos){ int i; _positionB(b,pos); for(i=0;i<4;i++){ _positionF(b,pos); b->ptr[pos-b->pos]=val; val>>=8; ++pos; } } static unsigned char oggbyte_read1(oggbyte_buffer *b,int pos){ _positionB(b,pos); _positionF(b,pos); return b->ptr[pos-b->pos]; } static ogg_uint32_t oggbyte_read4(oggbyte_buffer *b,int pos){ ogg_uint32_t ret; _positionB(b,pos); _positionF(b,pos); ret=b->ptr[pos-b->pos]; _positionF(b,++pos); ret|=b->ptr[pos-b->pos]<<8; _positionF(b,++pos); ret|=b->ptr[pos-b->pos]<<16; _positionF(b,++pos); ret|=b->ptr[pos-b->pos]<<24; return ret; } static ogg_int64_t oggbyte_read8(oggbyte_buffer *b,int pos){ ogg_int64_t ret; unsigned char t[7]; int i; _positionB(b,pos); for(i=0;i<7;i++){ _positionF(b,pos); t[i]=b->ptr[pos++ -b->pos]; } _positionF(b,pos); ret=b->ptr[pos-b->pos]; for(i=6;i>=0;--i) ret= ret<<8 | t[i]; return ret; } /* Now we get to the actual framing code */ int ogg_page_version(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read1(&ob,4); } int ogg_page_continued(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read1(&ob,5)&0x01; } int ogg_page_bos(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read1(&ob,5)&0x02; } int ogg_page_eos(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read1(&ob,5)&0x04; } ogg_int64_t ogg_page_granulepos(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read8(&ob,6); } ogg_uint32_t ogg_page_serialno(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read4(&ob,14); } ogg_uint32_t ogg_page_pageno(ogg_page *og){ oggbyte_buffer ob; oggbyte_init(&ob,og->header); return oggbyte_read4(&ob,18); } /* returns the number of packets that are completed on this page (if the leading packet is begun on a previous page, but ends on this page, it's counted */ /* NOTE: If a page consists of a packet begun on a previous page, and a new packet begun (but not completed) on this page, the return will be: ogg_page_packets(page) ==1, ogg_page_continued(page) !=0 If a page happens to be a single packet that was begun on a previous page, and spans to the next page (in the case of a three or more page packet), the return will be: ogg_page_packets(page) ==0, ogg_page_continued(page) !=0 */ int ogg_page_packets(ogg_page *og){ int i; int n; int count=0; oggbyte_buffer ob; oggbyte_init(&ob,og->header); n=oggbyte_read1(&ob,26); for(i=0;ibufferpool=ogg_buffer_create(); return oy; } int ogg_sync_destroy(ogg_sync_state *oy){ if(oy){ ogg_sync_reset(oy); ogg_buffer_destroy(oy->bufferpool); memset(oy,0,sizeof(*oy)); _ogg_free(oy); } return OGG_SUCCESS; } unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long bytes){ /* [allocate and] expose a buffer for data submission. If there is no head fragment allocate one and expose it else if the current head fragment has sufficient unused space expose it else if the current head fragment is unused resize and expose it else allocate new fragment and expose it */ /* base case; fifo uninitialized */ if(!oy->fifo_head){ oy->fifo_head=oy->fifo_tail=ogg_buffer_alloc(oy->bufferpool,bytes); return oy->fifo_head->buffer->data; } /* space left in current fragment case */ if(oy->fifo_head->buffer->size- oy->fifo_head->length- oy->fifo_head->begin >= bytes) return oy->fifo_head->buffer->data+ oy->fifo_head->length+oy->fifo_head->begin; /* current fragment is unused, but too small */ if(!oy->fifo_head->length){ ogg_buffer_realloc(oy->fifo_head,bytes); return oy->fifo_head->buffer->data+oy->fifo_head->begin; } /* current fragment used/full; get new fragment */ { ogg_reference *new=ogg_buffer_alloc(oy->bufferpool,bytes); oy->fifo_head->next=new; oy->fifo_head=new; } return oy->fifo_head->buffer->data; } int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ if(!oy->fifo_head)return OGG_EINVAL; if(oy->fifo_head->buffer->size-oy->fifo_head->length-oy->fifo_head->begin < bytes)return OGG_EINVAL; oy->fifo_head->length+=bytes; oy->fifo_fill+=bytes; return OGG_SUCCESS; } static ogg_uint32_t _checksum(ogg_reference *or, int bytes){ ogg_uint32_t crc_reg=0; int j,post; while(or){ unsigned char *data=or->buffer->data+or->begin; post=(byteslength?bytes:or->length); for(j=0;j> 24)&0xff)^data[j]]; bytes-=j; or=or->next; } return crc_reg; } /* sync the stream. This is meant to be useful for finding page boundaries. return values for this: -n) skipped n bytes 0) page not ready; more data (no bytes skipped) n) page synced at current location; page length n bytes */ long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ oggbyte_buffer page; long bytes,ret=0; ogg_page_release(og); bytes=oy->fifo_fill; oggbyte_init(&page,oy->fifo_tail); if(oy->headerbytes==0){ if(bytes<27)goto sync_out; /* not enough for even a minimal header */ /* verify capture pattern */ if(oggbyte_read1(&page,0)!=(int)'O' || oggbyte_read1(&page,1)!=(int)'g' || oggbyte_read1(&page,2)!=(int)'g' || oggbyte_read1(&page,3)!=(int)'S' ) goto sync_fail; oy->headerbytes=oggbyte_read1(&page,26)+27; } if(bytesheaderbytes)goto sync_out; /* not enough for header + seg table */ if(oy->bodybytes==0){ int i; /* count up body length in the segment table */ for(i=0;iheaderbytes-27;i++) oy->bodybytes+=oggbyte_read1(&page,27+i); } if(oy->bodybytes+oy->headerbytes>bytes)goto sync_out; /* we have what appears to be a complete page; last test: verify checksum */ { ogg_uint32_t chksum=oggbyte_read4(&page,22); oggbyte_set4(&page,0,22); /* Compare checksums; memory continues to be common access */ if(chksum!=_checksum(oy->fifo_tail,oy->bodybytes+oy->headerbytes)){ /* D'oh. Mismatch! Corrupt page (or miscapture and not a page at all). replace the computed checksum with the one actually read in; remember all the memory is common access */ oggbyte_set4(&page,chksum,22); goto sync_fail; } oggbyte_set4(&page,chksum,22); } /* We have a page. Set up page return. */ if(og){ /* set up page output */ og->header=ogg_buffer_split(&oy->fifo_tail,&oy->fifo_head,oy->headerbytes); og->header_len=oy->headerbytes; og->body=ogg_buffer_split(&oy->fifo_tail,&oy->fifo_head,oy->bodybytes); og->body_len=oy->bodybytes; }else{ /* simply advance */ oy->fifo_tail= ogg_buffer_pretruncate(oy->fifo_tail,oy->headerbytes+oy->bodybytes); if(!oy->fifo_tail)oy->fifo_head=0; } ret=oy->headerbytes+oy->bodybytes; oy->unsynced=0; oy->headerbytes=0; oy->bodybytes=0; oy->fifo_fill-=ret; return ret; sync_fail: oy->headerbytes=0; oy->bodybytes=0; oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,1); ret--; /* search forward through fragments for possible capture */ while(oy->fifo_tail){ /* invariant: fifo_cursor points to a position in fifo_tail */ unsigned char *now=oy->fifo_tail->buffer->data+oy->fifo_tail->begin; unsigned char *next=memchr(now, 'O', oy->fifo_tail->length); if(next){ /* possible capture in this segment */ long bytes=next-now; oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,bytes); ret-=bytes; break; }else{ /* no capture. advance to next segment */ long bytes=oy->fifo_tail->length; ret-=bytes; oy->fifo_tail=ogg_buffer_pretruncate(oy->fifo_tail,bytes); } } if(!oy->fifo_tail)oy->fifo_head=0; oy->fifo_fill+=ret; sync_out: return ret; } /* sync the stream and get a page. Keep trying until we find a page. Supress 'sync errors' after reporting the first. return values: OGG_HOLE) recapture (hole in data) 0) need more data 1) page returned Returns pointers into buffered data; invalidated by next call to _stream, _clear, _init, or _buffer */ int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ /* all we need to do is verify a page at the head of the stream buffer. If it doesn't verify, we look for the next potential frame */ while(1){ long ret=ogg_sync_pageseek(oy,og); if(ret>0){ /* have a page */ return 1; } if(ret==0){ /* need more data */ return 0; } /* head did not start a synced page... skipped some bytes */ if(!oy->unsynced){ oy->unsynced=1; return OGG_HOLE; } /* loop. keep looking */ } } /* clear things to an initial state. Good to call, eg, before seeking */ int ogg_sync_reset(ogg_sync_state *oy){ ogg_buffer_release(oy->fifo_tail); oy->fifo_tail=0; oy->fifo_head=0; oy->fifo_fill=0; oy->unsynced=0; oy->headerbytes=0; oy->bodybytes=0; return OGG_SUCCESS; } ogg_stream_state *ogg_stream_create(int serialno){ ogg_stream_state *os=_ogg_calloc(1,sizeof(*os)); os->serialno=serialno; os->pageno=-1; return os; } int ogg_stream_destroy(ogg_stream_state *os){ if(os){ ogg_buffer_release(os->header_tail); ogg_buffer_release(os->body_tail); memset(os,0,sizeof(*os)); _ogg_free(os); } return OGG_SUCCESS; } #define FINFLAG 0x80000000UL #define FINMASK 0x7fffffffUL static void _next_lace(oggbyte_buffer *ob,ogg_stream_state *os){ /* search ahead one lace */ os->body_fill_next=0; while(os->laceptrlacing_fill){ int val=oggbyte_read1(ob,27+os->laceptr++); os->body_fill_next+=val; if(val<255){ os->body_fill_next|=FINFLAG; os->clearflag=1; break; } } } static void _span_queued_page(ogg_stream_state *os){ while( !(os->body_fill&FINFLAG) ){ if(!os->header_tail)break; /* first flush out preceeding page header (if any). Body is flushed as it's consumed, so that's not done here. */ if(os->lacing_fill>=0) os->header_tail=ogg_buffer_pretruncate(os->header_tail, os->lacing_fill+27); os->lacing_fill=0; os->laceptr=0; os->clearflag=0; if(!os->header_tail){ os->header_head=0; break; }else{ /* process/prepare next page, if any */ long pageno; oggbyte_buffer ob; ogg_page og; /* only for parsing header values */ og.header=os->header_tail; /* only for parsing header values */ pageno=ogg_page_pageno(&og); oggbyte_init(&ob,os->header_tail); os->lacing_fill=oggbyte_read1(&ob,26); /* are we in sequence? */ if(pageno!=os->pageno){ if(os->pageno==-1) /* indicates seek or reset */ os->holeflag=1; /* set for internal use */ else os->holeflag=2; /* set for external reporting */ os->body_tail=ogg_buffer_pretruncate(os->body_tail, os->body_fill); if(os->body_tail==0)os->body_head=0; os->body_fill=0; } if(ogg_page_continued(&og)){ if(os->body_fill==0){ /* continued packet, but no preceeding data to continue */ /* dump the first partial packet on the page */ _next_lace(&ob,os); os->body_tail= ogg_buffer_pretruncate(os->body_tail,os->body_fill_next&FINMASK); if(os->body_tail==0)os->body_head=0; /* set span flag */ if(!os->spanflag && !os->holeflag)os->spanflag=2; } }else{ if(os->body_fill>0){ /* preceeding data to continue, but not a continued page */ /* dump body_fill */ os->body_tail=ogg_buffer_pretruncate(os->body_tail, os->body_fill); if(os->body_tail==0)os->body_head=0; os->body_fill=0; /* set espan flag */ if(!os->spanflag && !os->holeflag)os->spanflag=2; } } if(os->laceptrlacing_fill){ os->granulepos=ogg_page_granulepos(&og); /* get current packet size & flag */ _next_lace(&ob,os); os->body_fill+=os->body_fill_next; /* addition handles the flag fine; unsigned on purpose */ /* ...and next packet size & flag */ _next_lace(&ob,os); } os->pageno=pageno+1; os->e_o_s=ogg_page_eos(&og); os->b_o_s=ogg_page_bos(&og); } } } /* add the incoming page to the stream state; we decompose the page into packet segments here as well. */ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ int serialno=ogg_page_serialno(og); int version=ogg_page_version(og); /* check the serial number */ if(serialno!=os->serialno){ ogg_page_release(og); return OGG_ESERIAL; } if(version>0){ ogg_page_release(og); return OGG_EVERSION; } /* add to fifos */ if(!os->body_tail){ os->body_tail=og->body; os->body_head=ogg_buffer_walk(og->body); }else{ os->body_head=ogg_buffer_cat(os->body_head,og->body); } if(!os->header_tail){ os->header_tail=og->header; os->header_head=ogg_buffer_walk(og->header); os->lacing_fill=-27; }else{ os->header_head=ogg_buffer_cat(os->header_head,og->header); } memset(og,0,sizeof(*og)); return OGG_SUCCESS; } int ogg_stream_reset(ogg_stream_state *os){ ogg_buffer_release(os->header_tail); ogg_buffer_release(os->body_tail); os->header_tail=os->header_head=0; os->body_tail=os->body_head=0; os->e_o_s=0; os->b_o_s=0; os->pageno=-1; os->packetno=0; os->granulepos=0; os->body_fill=0; os->lacing_fill=0; os->holeflag=0; os->spanflag=0; os->clearflag=0; os->laceptr=0; os->body_fill_next=0; return OGG_SUCCESS; } int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ ogg_stream_reset(os); os->serialno=serialno; return OGG_SUCCESS; } static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ ogg_packet_release(op); _span_queued_page(os); if(os->holeflag){ int temp=os->holeflag; if(os->clearflag) os->holeflag=0; else os->holeflag=1; if(temp==2){ os->packetno++; return OGG_HOLE; } } if(os->spanflag){ int temp=os->spanflag; if(os->clearflag) os->spanflag=0; else os->spanflag=1; if(temp==2){ os->packetno++; return OGG_SPAN; } } if(!(os->body_fill&FINFLAG)) return 0; if(!op && !adv)return 1; /* just using peek as an inexpensive way to ask if there's a whole packet waiting */ if(op){ op->b_o_s=os->b_o_s; if(os->e_o_s && os->body_fill_next==0) op->e_o_s=os->e_o_s; else op->e_o_s=0; if( (os->body_fill&FINFLAG) && !(os->body_fill_next&FINFLAG) ) op->granulepos=os->granulepos; else op->granulepos=-1; op->packetno=os->packetno; } if(adv){ oggbyte_buffer ob; oggbyte_init(&ob,os->header_tail); /* split the body contents off */ if(op){ op->packet=ogg_buffer_split(&os->body_tail,&os->body_head, os->body_fill&FINMASK); op->bytes=os->body_fill&FINMASK; }else{ os->body_tail=ogg_buffer_pretruncate(os->body_tail, os->body_fill&FINMASK); if(os->body_tail==0)os->body_head=0; } /* update lacing pointers */ os->body_fill=os->body_fill_next; _next_lace(&ob,os); }else{ if(op){ op->packet=ogg_buffer_sub(os->body_tail,0,os->body_fill&FINMASK); op->bytes=os->body_fill&FINMASK; } } if(adv){ os->packetno++; os->b_o_s=0; } return 1; } int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ return _packetout(os,op,1); } int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ return _packetout(os,op,0); } int ogg_packet_release(ogg_packet *op) { if(op){ ogg_buffer_release(op->packet); memset(op, 0, sizeof(*op)); } return OGG_SUCCESS; } int ogg_page_release(ogg_page *og) { if(og){ ogg_buffer_release(og->header); ogg_buffer_release(og->body); memset(og, 0, sizeof(*og)); } return OGG_SUCCESS; } void ogg_page_dup(ogg_page *dup,ogg_page *orig){ dup->header_len=orig->header_len; dup->body_len=orig->body_len; dup->header=ogg_buffer_dup(orig->header); dup->body=ogg_buffer_dup(orig->body); } core/tremor/asm_arm.h000664 001750 001750 00000014551 12702465756 015756 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: arm7 and later wide math functions ********************************************************************/ #ifdef _ARM_ASSEM_ #if !defined(_V_WIDE_MATH) && !defined(_LOW_ACCURACY_) #define _V_WIDE_MATH static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { int lo,hi; asm volatile("smull\t%0, %1, %2, %3" : "=&r"(lo),"=&r"(hi) : "%r"(x),"r"(y) : "cc"); return(hi); } static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { return MULT32(x,y)<<1; } static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { int lo,hi; asm volatile("smull %0, %1, %2, %3\n\t" "movs %0, %0, lsr #15\n\t" "adc %1, %0, %1, lsl #17\n\t" : "=&r"(lo),"=&r"(hi) : "%r"(x),"r"(y) : "cc"); return(hi); } #define MB() asm volatile ("" : : : "memory") static inline void XPROD32(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { int x1, y1, l; asm( "smull %0, %1, %4, %6\n\t" "smlal %0, %1, %5, %7\n\t" "rsb %3, %4, #0\n\t" "smull %0, %2, %5, %6\n\t" "smlal %0, %2, %3, %7" : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) : "3" (a), "r" (b), "r" (t), "r" (v) : "cc" ); *x = x1; MB(); *y = y1; } static inline void XPROD31(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { int x1, y1, l; asm( "smull %0, %1, %4, %6\n\t" "smlal %0, %1, %5, %7\n\t" "rsb %3, %4, #0\n\t" "smull %0, %2, %5, %6\n\t" "smlal %0, %2, %3, %7" : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) : "3" (a), "r" (b), "r" (t), "r" (v) : "cc" ); *x = x1 << 1; MB(); *y = y1 << 1; } static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { int x1, y1, l; asm( "rsb %2, %4, #0\n\t" "smull %0, %1, %3, %5\n\t" "smlal %0, %1, %2, %6\n\t" "smull %0, %2, %4, %5\n\t" "smlal %0, %2, %3, %6" : "=&r" (l), "=&r" (x1), "=&r" (y1) : "r" (a), "r" (b), "r" (t), "r" (v) : "cc" ); *x = x1 << 1; MB(); *y = y1 << 1; } #endif #ifndef _V_CLIP_MATH #define _V_CLIP_MATH static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) { int tmp; asm volatile("subs %1, %0, #32768\n\t" "movpl %0, #0x7f00\n\t" "orrpl %0, %0, #0xff\n" "adds %1, %0, #32768\n\t" "movmi %0, #0x8000" : "+r"(x),"=r"(tmp) : : "cc"); return(x); } #endif #ifndef _V_LSP_MATH_ASM #define _V_LSP_MATH_ASM static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, ogg_int32_t *qexpp, ogg_int32_t *ilsp,ogg_int32_t wi, ogg_int32_t m){ ogg_uint32_t qi=*qip,pi=*pip; ogg_int32_t qexp=*qexpp; asm("mov r0,%3;" "mov r1,%5,asr#1;" "add r0,r0,r1,lsl#3;" "1:" "ldmdb r0!,{r1,r3};" "subs r1,r1,%4;" //ilsp[j]-wi "rsbmi r1,r1,#0;" //labs(ilsp[j]-wi) "umull %0,r2,r1,%0;" //qi*=labs(ilsp[j]-wi) "subs r1,r3,%4;" //ilsp[j+1]-wi "rsbmi r1,r1,#0;" //labs(ilsp[j+1]-wi) "umull %1,r3,r1,%1;" //pi*=labs(ilsp[j+1]-wi) "cmn r2,r3;" // shift down 16? "beq 0f;" "add %2,%2,#16;" "mov %0,%0,lsr #16;" "orr %0,%0,r2,lsl #16;" "mov %1,%1,lsr #16;" "orr %1,%1,r3,lsl #16;" "0:" "cmp r0,%3;\n" "bhi 1b;\n" // odd filter assymetry "ands r0,%5,#1;\n" "beq 2f;\n" "add r0,%3,%5,lsl#2;\n" "ldr r1,[r0,#-4];\n" "mov r0,#0x4000;\n" "subs r1,r1,%4;\n" //ilsp[j]-wi "rsbmi r1,r1,#0;\n" //labs(ilsp[j]-wi) "umull %0,r2,r1,%0;\n" //qi*=labs(ilsp[j]-wi) "umull %1,r3,r0,%1;\n" //pi*=labs(ilsp[j+1]-wi) "cmn r2,r3;\n" // shift down 16? "beq 2f;\n" "add %2,%2,#16;\n" "mov %0,%0,lsr #16;\n" "orr %0,%0,r2,lsl #16;\n" "mov %1,%1,lsr #16;\n" "orr %1,%1,r3,lsl #16;\n" //qi=(pi>>shift)*labs(ilsp[j]-wi); //pi=(qi>>shift)*labs(ilsp[j+1]-wi); //qexp+=shift; //} /* normalize to max 16 sig figs */ "2:" "mov r2,#0;" "orr r1,%0,%1;" "tst r1,#0xff000000;" "addne r2,r2,#8;" "movne r1,r1,lsr #8;" "tst r1,#0x00f00000;" "addne r2,r2,#4;" "movne r1,r1,lsr #4;" "tst r1,#0x000c0000;" "addne r2,r2,#2;" "movne r1,r1,lsr #2;" "tst r1,#0x00020000;" "addne r2,r2,#1;" "movne r1,r1,lsr #1;" "tst r1,#0x00010000;" "addne r2,r2,#1;" "mov %0,%0,lsr r2;" "mov %1,%1,lsr r2;" "add %2,%2,r2;" : "+r"(qi),"+r"(pi),"+r"(qexp) : "r"(ilsp),"r"(wi),"r"(m) : "r0","r1","r2","r3","cc"); *qip=qi; *pip=pi; *qexpp=qexp; } static inline void lsp_norm_asm(ogg_uint32_t *qip,ogg_int32_t *qexpp){ ogg_uint32_t qi=*qip; ogg_int32_t qexp=*qexpp; asm("tst %0,#0x0000ff00;" "moveq %0,%0,lsl #8;" "subeq %1,%1,#8;" "tst %0,#0x0000f000;" "moveq %0,%0,lsl #4;" "subeq %1,%1,#4;" "tst %0,#0x0000c000;" "moveq %0,%0,lsl #2;" "subeq %1,%1,#2;" "tst %0,#0x00008000;" "moveq %0,%0,lsl #1;" "subeq %1,%1,#1;" : "+r"(qi),"+r"(qexp) : : "cc"); *qip=qi; *qexpp=qexp; } #endif #endif psp2/emumain.c000664 001750 001750 00000024513 12702465756 014410 0ustar00sergiosergio000000 000000 #include "emumain.h" #include #include #include "time.h" #include #define SCE_KERNEL_OK 0 #include "psplib/pl_rewind.h" #include "psplib/pl_file.h" #include "psplib/pl_snd.h" #include "psplib/pl_perf.h" #include "psplib/pl_util.h" #include "psplib/pl_psp.h" #include "psplib/video.h" #include "psplib/ctrl.h" #include "shared.h" #include "sound.h" #include "system.h" #include "md_ntsc.h" #include "sms_ntsc.h" //#include #define ip_server "192.168.1.130" #define port_server 18194 PspImage *Screen; pl_rewind Rewinder; static pl_perf_counter FpsCounter; static int ClearScreen; static int ScreenX, ScreenY, ScreenW, ScreenH; static int TicksPerUpdate; static u32 TicksPerSecond; static u64 LastTick; static u64 CurrentTick; static int Frame; static int Rewinding; extern pl_file_path CurrentGame; extern EmulatorOptions Options; extern const u64 ButtonMask[]; extern const int ButtonMapId[]; extern struct ButtonConfig ActiveConfig; extern char *ScreenshotPath; static short soundbuffer[SOUND_SAMPLES*2*10]; static int soundPosWrite = 0; static int soundPosRead = 0; static SceUID console_mtx; static inline void RenderVideo(); static void AudioCallback(pl_snd_sample* buf, unsigned int samples, void *userdata); void MixerCallback(int16 **stream, int16 **output, int length); md_ntsc_t *md_ntsc; sms_ntsc_t *sms_ntsc; int bEmulate; void osd_input_update() { /* Reset input */ input.pad[0] = 0; input.analog[0][0] = 0x7F; static SceCtrlData pad; static int autofire_status = 0; /* Check the input */ if (pspCtrlPollControls(&pad)) { if (--autofire_status < 0) autofire_status = Options.AutoFire; /* Parse input */ int i, on, code; for (i = 0; ButtonMapId[i] >= 0; i++) { code = ActiveConfig.ButtonMap[ButtonMapId[i]]; on = (pad.buttons & ButtonMask[i]) == ButtonMask[i]; /* Check to see if a button set is pressed. If so, unset it, so it */ /* doesn't trigger any other combination presses. */ if (on) pad.buttons &= ~ButtonMask[i]; if (code & AFI) { if (on && (autofire_status == 0)) input.pad[0] |= CODE_MASK(code); continue; } else if (code & JOY) { if (on) { input.pad[0] |= CODE_MASK(code); } continue; } else if (code & SYS) { if (on) { if (CODE_MASK(code) == (INPUT_START)) input.system[0] |= INPUT_START; } continue; } if (code & SPC) { switch (CODE_MASK(code)) { case SPC_MENU: if (on) bEmulate=0; break; case SPC_REWIND: Rewinding = on; break; } } } } return; } void InitEmulator() { //debugNetInit(ip_server,port_server,DEBUG); set_config_defaults(); ClearScreen = 0; /* Initialize screen buffer */ Screen = pspImageCreateVram(720, 576, PSP_IMAGE_16BPP); // pspImageClear(Screen, 0x8000); console_mtx = sceKernelCreateSema("sound_sema", 0, 0, 1, 0); /*if (console_mtx > 0) { debugNetPrintf(DEBUG,"Sound Mutex UID: 0x%08X\n", console_mtx); }*/ /* Set up bitmap structure */ memset(&bitmap, 0, sizeof(t_bitmap)); bitmap.width = Screen->Width; bitmap.height = Screen->Height; bitmap.pitch = (bitmap.width * 2); bitmap.data = (unsigned char *)Screen->Pixels; bitmap.viewport.changed = 3; pl_snd_set_callback(0, AudioCallback, NULL); } void RunEmulator() { float ratio; //debugNetPrintf(DEBUG,"RunEmulator\n"); pspImageClear(Screen, 0); //debugNetPrintf(DEBUG,"ImageClear\n"); if(bitmap.viewport.changed & 1) { bitmap.viewport.changed &= ~1; /* source bitmap */ Screen->Viewport.Width = bitmap.viewport.w+2*bitmap.viewport.x; Screen->Viewport.Height = bitmap.viewport.h+2*bitmap.viewport.y; } /* Recompute screen size/position */ switch (Options.DisplayMode) { default: case DISPLAY_MODE_UNSCALED: ScreenW = Screen->Viewport.Width; ScreenH = Screen->Viewport.Height; break; case DISPLAY_MODE_FIT_HEIGHT: ratio = (float)SCR_HEIGHT / (float)Screen->Viewport.Height; ScreenW = (float)bitmap.viewport.w * ratio - 2; ScreenH = SCR_HEIGHT; break; case DISPLAY_MODE_FILL_SCREEN: ScreenW = SCR_WIDTH; ScreenH = SCR_HEIGHT; break; case DISPLAY_MODE_2X: ScreenW = Screen->Viewport.Width*2; ScreenH = Screen->Viewport.Height*2; break; case DISPLAY_MODE_3X: ScreenW = Screen->Viewport.Width*3; ScreenH = Screen->Viewport.Height*3; break; } //debugNetPrintf(DEBUG,"screensize %d %d\n" ,Screen->Viewport.Width ,Screen->Viewport.Height); ScreenX = (SCR_WIDTH / 2) - (ScreenW / 2); ScreenY = (SCR_HEIGHT / 2) - (ScreenH / 2); /* Init performance counter */ pl_perf_init_counter(&FpsCounter); /* Recompute update frequency */ TicksPerSecond = sceRtcGetTickResolution(); if (Options.UpdateFreq) { TicksPerUpdate = TicksPerSecond / (Options.UpdateFreq / (Options.Frameskip + 1)); sceRtcGetCurrentTick(&LastTick); } Frame = 0; ClearScreen = 2; Rewinding = 0; //pl_rewind_realloc(&Rewinder); int frames_until_save = 0; /* Resume sound */ pl_snd_resume(0); /* Wait for V. refresh */ pspVideoWaitVSync(); bEmulate = 1; /* Main emulation loop */ while (!ExitPSP&&bEmulate) { /* Rewind/save state */ /*if (!Rewinding) { if (--frames_until_save <= 0) { frames_until_save = Options.RewindSaveRate; pl_rewind_save(&Rewinder); } } else { frames_until_save = Options.RewindSaveRate; if (!pl_rewind_restore(&Rewinder)) continue; }*/ /* Run the system emulation for a frame */ if (++Frame <= Options.Frameskip) { /* Skip frame */ if (system_hw == SYSTEM_MCD) { system_frame_scd(1); } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { system_frame_gen(1); } else { system_frame_sms(1); } } else { if (system_hw == SYSTEM_MCD) { system_frame_scd(0); } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { system_frame_gen(0); } else { system_frame_sms(0); } Frame = 0; /* Display */ if(bitmap.viewport.changed & 1) { bitmap.viewport.changed &= ~1; /* source bitmap */ Screen->Viewport.Width = bitmap.viewport.w+2*bitmap.viewport.x; Screen->Viewport.Height = bitmap.viewport.h+2*bitmap.viewport.y; /* Recompute screen size/position */ switch (Options.DisplayMode) { default: case DISPLAY_MODE_UNSCALED: ScreenW = Screen->Viewport.Width; ScreenH = Screen->Viewport.Height; break; case DISPLAY_MODE_FIT_HEIGHT: ratio = (float)SCR_HEIGHT / (float)Screen->Viewport.Height; ScreenW = (float)bitmap.viewport.w * ratio - 2; ScreenH = SCR_HEIGHT; break; case DISPLAY_MODE_FILL_SCREEN: ScreenW = SCR_WIDTH; ScreenH = SCR_HEIGHT; break; case DISPLAY_MODE_2X: ScreenW = Screen->Viewport.Width*2; ScreenH = Screen->Viewport.Height*2; break; case DISPLAY_MODE_3X: ScreenW = Screen->Viewport.Width*3; ScreenH = Screen->Viewport.Height*3; break; } ScreenX = (SCR_WIDTH / 2) - (ScreenW / 2); ScreenY = (SCR_HEIGHT / 2) - (ScreenH / 2); } //debugNetPrintf(DEBUG,"main %d %d \n",soundPosRead,soundPosWrite); int size = audio_update(&soundbuffer[soundPosRead])*2; //debugNetPrintf(DEBUG,"filling %d \n",size); soundPosRead +=size; if(soundPosRead+size>=(SOUND_SAMPLES*2*10)){ soundPosRead = 0; } if((soundPosRead-soundPosWrite)>=(SOUND_SAMPLES*2)||(soundPosRead-soundPosWrite)<0){ sceKernelSignalSema(console_mtx, 1); //lock } RenderVideo(); } } /* Stop sound */ pl_snd_pause(0); } void TrashEmulator() { pl_rewind_destroy(&Rewinder); /* Trash screen */ if (Screen) pspImageDestroy(Screen); if (CurrentGame[0] != '\0') { /* Release emulation resources */ audio_shutdown(); error_shutdown(); } //debugNetFinish(); } void RenderVideo() { /* Update the display */ pspVideoBegin(); /* Clear the buffer first, if necessary */ if (ClearScreen >= 0) { ClearScreen--; pspVideoClearScreen(); } pspVideoPutImage(Screen, ScreenX, ScreenY, ScreenW, ScreenH); /* Show FPS counter */ if (Options.ShowFps) { static char fps_display[32]; sprintf(fps_display, " %3.02f", pl_perf_update_counter(&FpsCounter)); int width = pspFontGetTextWidth(&PspStockFont, fps_display); int height = pspFontGetLineHeight(&PspStockFont); pspVideoFillRect(SCR_WIDTH - width, 0, SCR_WIDTH, height, PSP_COLOR_BLACK); pspVideoPrint(&PspStockFont, SCR_WIDTH - width, 0, fps_display, PSP_COLOR_WHITE); } pspVideoEnd(); /* Wait if needed */ if (Options.UpdateFreq) { do { sceRtcGetCurrentTick(&CurrentTick); } while (CurrentTick - LastTick < TicksPerUpdate); LastTick = CurrentTick; } /* Wait for VSync signal */ if (Options.VSync) pspVideoWaitVSync(); /* Swap buffers */ pspVideoSwapBuffers(); } static void AudioCallback(pl_snd_sample *buf, unsigned int samples, void *userdata) { int i; //debugNetPrintf(DEBUG,"wait %d %d \n",totalSamples,samples); if (!Rewinding) { short* ptr_s = (short*)buf; //debugNetPrintf(DEBUG,"wait %d %d \n",soundPosRead,soundPosWrite); if((soundPosRead-soundPosWrite)=(SOUND_SAMPLES*2*10)){ soundPosWrite = 0; } } else /* Render silence */ for (i = 0; i < samples; i++) buf[i].stereo.l = buf[i].stereo.r = 0; } core/input_hw/xe_1ap.c000664 001750 001750 00000013135 12702465756 016031 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * XE-1AP analog controller support * * Copyright (C) 2011-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #define XE_1AP_LATENCY 3 static struct { uint8 State; uint8 Counter; uint8 Latency; } xe_1ap[2]; void xe_1ap_reset(int index) { input.analog[index][0] = 128; input.analog[index][1] = 128; input.analog[index+1][0] = 128; index >>= 2; xe_1ap[index].State = 0x40; xe_1ap[index].Counter = 11; xe_1ap[index].Latency = 0; } INLINE unsigned char xe_1ap_read(int index) { unsigned char data; unsigned int port = index << 2; /* Current data transfer cycle */ switch (xe_1ap[index].Counter) { case 0: /* E1 E2 Start Select buttons status (active low) */ data = (~input.pad[port] >> 10) & 0x0F; break; case 1: /* A/A' B/B' C D buttons status (active low) */ data = ((~input.pad[port] >> 4) & 0x0F) & ~((input.pad[port] >> 6) & 0x0C); break; case 2: /* CH0 high (Analog Stick Left/Right direction) */ data = (input.analog[port][0] >> 4) & 0x0F; break; case 3: /* CH1 high (Analog Stick Up/Down direction) */ data = (input.analog[port][1] >> 4) & 0x0F; break; case 4: /* CH2 high (N/A) */ data = 0x0; break; case 5: /* CH3 high (Throttle vertical or horizontal direction) */ data = (input.analog[port+1][0] >> 4) & 0x0F; break; case 6: /* CH0 low (Analog Stick Left/Right direction) */ data = input.analog[port][0] & 0x0F; break; case 7: /* CH1 low (Analog Stick Up/Down direction)*/ data = input.analog[port][1] & 0x0F; break; case 8: /* CH2 low (N/A) */ data = 0x0; break; case 9: /* CH3 low (Throttle vertical or horizontal direction) */ data = input.analog[port+1][0] & 0x0F; break; case 10: /* A B A' B' buttons status (active low) */ data = (~input.pad[port] >> 6) & 0x0F; break; default: /* N/A */ data = 0x0F; break; } /* TL indicates current data cycle (0=1st cycle, 1=2nd cycle, etc) */ data |= ((xe_1ap[index].Counter & 1) << 4); /* TR indicates if data is valid (0=valid, 1=not ready) */ /* Some games expect this bit to switch between 0 and 1 */ /* so we actually keep it high for some reads after the */ /* data cycle has been initialized or incremented */ if (xe_1ap[index].Latency) { if (xe_1ap[index].Latency > 1) { /* data is not ready */ data |= 0x20; } /* decrement internal latency */ xe_1ap[index].Latency--; } else if (xe_1ap[index].Counter <= 10) { /* next data cycle */ xe_1ap[index].Counter++; /* reinitialize internal latency */ xe_1ap[index].Latency = XE_1AP_LATENCY; } return data; } INLINE void xe_1ap_write(int index, unsigned char data, unsigned char mask) { /* only update bits set as output */ data = (xe_1ap[index].State & ~mask) | (data & mask); /* look for TH 1->0 transitions */ if (!(data & 0x40) && (xe_1ap[index].State & 0x40)) { /* reset data acquisition cycle */ xe_1ap[index].Counter = 0; /* initialize internal latency */ xe_1ap[index].Latency = XE_1AP_LATENCY; } /* update internal state */ xe_1ap[index].State = data; } unsigned char xe_1ap_1_read(void) { return xe_1ap_read(0); } unsigned char xe_1ap_2_read(void) { return xe_1ap_read(1); } void xe_1ap_1_write(unsigned char data, unsigned char mask) { xe_1ap_write(0, data, mask); } void xe_1ap_2_write(unsigned char data, unsigned char mask) { xe_1ap_write(1, data, mask); } sdl/md.ico000664 001750 001750 00000122216 12702465756 013602 0ustar00sergiosergio000000 000000 ȴx(hP(v'r\\\???"f/5 &&&4441YYY!!!)))aaaY "TTT%-IIIM 3)y0RRR A yyyccc%m~~~VNNN? 3PPP<F)ttt8I 6rrr222hhheeeFFFjjjBBB\ DDD6660001...nnn^^^*~@@@*|ddddVVVlll888/6r$j+++ppp7;;;#hP """LLL"dPl<<< ]!b,U `\; , : RF /8 /xvvv545zzz424"c53|||5{{{www}}}32453#g5962@ߝ2`Pp?B;[c_jPPR ;? .YpR*?}10_d/??<2o}0ަ!1_2.R_j}0Z0rB_J fPD}? Pe0qFh\;?}?'P>/P0P17]1P>P_# 0|.\? Xi;????P1P??????????????2 }f1he#ೳ|ճ?YFRY _iXwٸMX1 ?h1VR?F''R1\R4@?h]R\Fơ?\41w!l 9R9ӛ`?e0P`[/r1r/f!!!!!!ާ?|?1}77PZ*.j_?ԵBZ Z9Yj #}1 \` X1Z c1d2:1#wy@r.?2\lPq\.7'`q'w''y'dPpXpf<'@PǠ'#'Z'1PPPPPcŜ4ƫfŜ?Z ʜJRZ7f_ɜq1w9BX朜L㜜/?h\:?/._. p ?y;`:hfff B.\4?;??V_`:FFFFFFFFFeeehZZZ:r._Y*#FFFFFFFL\PYLPDx`:jBP}Zw:c`:1111111P YYι [e?@e?111111P?1`:° P?F#Zd|?#Y`o𭭭2jɭ 9]* P<L\X*x1!`FPP.P#>f1[h?lµ0i\ 19r_7}h'][`MBL9֚';?!e >隚.隚4?h]V֚?102fcF1.|h]V?\X.f F?;Yi?Y ء.  }? `B9;lơ i}19 PLơL;Re|< P................................................................................................................................................................................NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG$$$$$$$$$$$$$$$$$$$3 gAb`r.`Y1,5~"M1 %H ( }H +QfrCH (vJqi/ ^H ҩAB;nH  JCH >ï ^H `2DفhaH "]rw?WH +Q ? P; ?G&H QaH +W6%H "AG&uH H -H KQG-H kbGH $-H K+G8H EIG&H KsA-H ~TG8H 3QQEmmOG&H K-H $8H HKOIG&H $+AaH K6WH 5NIG&H kaH {U~68H Q=vTNIG&H aH 6WH QvTNI ^H ES{UU{~nH AQ"(E6WH vA3$ % &H =tmEb msK aH AT t v53AE=k3,WH Hb5"(ҢmgA% ^H bU Hms=3nH A)+ KkgA,CH QQAb{=3"b=ҩs % zH UssU3tAmۮ"({~nH tKUb=33+(g,CH gk$bE (m z ^H TK5"gA$"H kQKK 5K~bH"kC,H )vA Qg+$b ^ zH  b (Q+ KknH K3b+="kAWCH  ۩3+KkAbs ^ zH TbEnH Q3)vW,H )b"(QKUbG&%H K b3EE=AauH 5bT8,H  3K+g5G&%H TkEt buH +Asv8,H ) HUk GzH ("bA+( A bH 3{$-,5{Ug{"HG^ kmTkkaa G1P⛟gx/images/Ctrl_pad_auto.png000664 001750 001750 00000001026 12702465756 017070 0ustar00sergiosergio000000 000000 PNG  IHDR,]sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time02/09/14q -$:H(BG# HN:46]h#`NJcl'&"E( 8~8{9GUy"'Czdi{={5ל5oհ7׺lw8FEr`݈̂ˆQPp7HPc`Fo 2};UH (x6ҁp̂(:V Y{a߶2tA*(+Y`%EB.%=ܜo*0cۂm| w ^XiŚѼoٯ|5_Yݸ\̍w L+rbYY¸\.Xun!,s#bpϸ5ZD Vdc6cI迫6n[)+/:dE$-`FP2 1vF%7<󆧓 5i@7'}r?-~~U Њ,U$&V) ܀rY%xQթ8@뎷`n(K p 30H,ºQC+,0h1< A6A+Zq(wY$# -FFՕJp0$FP`4^ϧ`INv%s'0;L@e NL1mNX̍aڭ Z+2@brEkW؀+vǚ.}n=C:eaAqgQu".*q3<XtÊPA1=hZ(5/ҁ= {&  eZa7* [ X\{~DQ7H< o=gyꤗA~Er+՜“ T^ӛdO5 QT+ jVM}=TK* "dϟ߱rdвTٻE&4MFfн×|o뮿y eNNd(H*50 hk[b1:XY$ \ƭԬ& Z9i&t0YS^2/0hڄ7muy,aU4WxJIk}FB5Ki3c1p%l4\J1JI, ؒTBw9:Ki$xd]Nt*5KGxxR w,` Q@X\N (+/k npxB2s3+ X, R);e7K@UE]d] 7ȮE.`DܱN,XV8y2>O<}^% hPQ]@ʍǏtej F{ b=X 22ȈJWc=p+0;x9U# AizicfW/X{ JZ\0ðlƗ/-x4۽p-НSs U@$t?QR-t72 ;t/": #rAVyts![>=Fh^h8a ]/g Db/oӼo*oTyJd#NXnN=V`]_8\ΕLEp<syhNOovx:bBL Vb4LPCM^)/ë1ڠh!ėFe"oݎ߉xbn6pyo߻h -D8{{HQls{btQELtL֢2#0<Ig 6cz](/p~2q&ۍ"3p661ی6+Ԫ ױhx&Q39NkrWb/| %fpX (#Ff7\pOzb7"ɴG*a6`m5g+Ƣ/P%Z̩dz;#S^=+i@Vsc聁B3hv2Zd FB/Aitf3Ta!)Vd3"XWBt,:UJ̅+d9UbFE(̍ 9*/EkSf\`R V TS"^h VTV]MFw3|+2l;mb}mĈPJUx(7i36Ek 7,x{wU߷-ތs=^`ey-]佬X"=S-q듣u}d'm5ժ cRUd׳~ff!]&L* ¤n9G-D jptabg뙑BnY\4J:3K( E2F0ܝīpP6ͬ dB덌h̰=5!AEHD _&ՔxA Az>VF:a)}I2jM:p^_6T} NbL1ep (:bF6y~!7RTX13,"Yz@;&֯pv4+ľ,M]Q).VT&48eݝhEQM,4FLc%e@sMmA"ͧ\`OQ5f k3*0k5LnɆ-bYH flMŭV"AgrFA |96C ~۵G / HQO ̫ƌޜN¾:0Ο)?7di jȣxg aΓY3CNdK.P<=51 Tf&ވxufָ9 f9Gj`J(NKÚc4Pa nϫ(YAk>󗢵N SumjΧ3۠Ӛ }x1#1Vs*Ӳ'q@Ɛq1}rUL#¼t}=-AAcH..SŶT#=1TPЉh6f"UVLD'Ѭq**CyMsԵ[D9;6Fp3v+.Ô6UJ卽2oKE7/7'|o4Z3L;7w;\bZsN{cJaWVXtN&@TY1}YY1y[d{ {nVƞXs1poWH*3j/QFi$7)BI~cM5F`Y]IU$&;v&L1vNƮ:-O; ׍zƽq $h0 Ρ>3b99=4A۬/l{<ȡ\ǛV=[RЁ5K3"jg*ycW XA)މ])Uj{Mjɩ-SEqً_՗\E][ ڸ9֍7޳,+c yveLOXm5[:*\b!=(_cAzýQmjdH,طx5Ɩx[FǺ=Ic7+NsèDO:> y5 okXKXR2߈MzfBJ#dj"=_Θ95JV5+D߽U"uaf!ɦHl^[Hܐ{an Kw%-i32 |2{r|]1΂}#;؏8w5c]:Ü8 "CHUľAB[Z58;:/|:n}]ďz NDb:kRSogK3L)Pf` )yfX%2.G F;b'fT{.7>dBQ  QMAJv3%S  p9TTƵG82Q9[N'b5P)3JEoCrJ%bVrڑ2 B gɽK$o)y9RT7| U)W?YKEyy-% fFƚ%3`3\dA"+Wֶm j^Gn,ܿ9;Q '+۔oTE&d/lV׬dl{-|soD5U"EikbPFOi>86S)SM dbZ08$TNP|&j ZI!=> lIb̌$wڥg*Ego#\ /rmls-r^y ]}>Te6Qq4Jmgh\"kWΔ>k{jM *II@=rv!{ /s|iJk҄ 2621Tk.nbLa>xKFY`lWJ1 <Ȅ܇Dxp+1C&E[GNEbWS]meD]G{ѺI:(4I-AUͤz,cY*㲍$3ŦFq]9T%1f9D6mnZr(*l.ȡlS 7&/&?@i{#gu)Dl4kX4!Mr9 M:*n(olօNwmo(2.1كɴ6Uޤ/b"5Q%V*CAtr9ěN,"6& ɶg#*w i#u>@FBJu I. `Ѕ's3ܕ`(4N lPmBEIκftS Kn:mj>\y+3Z@-XuzJI4b0O_Sl%2I,5hGeNk_crw ڬ9\` +39`PkDjʲBiL-V}w-E!ڧ8\-o-1_XXo<}z+kfrRZ-3ժlt|2> _w=>.(k^gƀ) ?SBprL^ľqϛ7߼dߊt'HT/HY\VxJxz#7NUHAH'ۃQ%^#hG(7aڔY)RX|Ec3_|zbl6:xVd^ aSf^~ȴ kImJ`1X)Sse EA$[J^_(FSz2.1YfI,wF&o /_b'ϟOYs/ tS_%ه& ,ф׷]\%[Af1r^h5\MF]Ag%ZP{Ħl~$=o޼\;{*E!me\juϴR˙YWARo>gS3LTYDzoPx` [@RCk*"29Y%]wV)Zj<Ѥdu4s3Ud1S?_|.8VU~2fs7hֱ ɄI)\XUEdQlSkHNഥ}3޼zMAX11})4WcCc/Ws7Wo_g_p>K~Tpa/2ѵ?q $Z4??}<ɪ4s ^Ev),oMOϥFfI2 I&JfGo"Y{H$%0\M[NSϜ>; Vjl3hfkw|ZԼͮw+:<CXl+sWA.քyC^)ƣ`23Da^/o<{1n?uHd/hfknjbLPGL0)5(XIjN1eC[:/?_Lpt)N3lzJ3!Qc.*"!** #iԺG$Tу?U4I6%jpnꆝTԣ7jc d45B[jȡ g^,P&i½fӨtsE`2%Y9+& Ԣ.CHFףؔ=EE{1a6!PzPGϔۖ=Ws)Bgv|\>oGXUk[#gҩķT*_3pmiJm}juv"n\ǟwo:]T;BfP.hpPShoۣbX$lJzIܦQ'*h'-RMVR4%]0(uA,͉rH [{{Hn%Yt(uJdm~Ӝy0 L 5җ @"YgS9ԩ1T"$6󚅤n07n"4 je.=xz'߿д#EsU3Ớ:XVk(J(6W/߰_ޝ'y&O^ZΘ(gW Ԟ4×Z+Ѝ]IFQI-})wwk/c.#yXJxjq(i$@#!n5iW4F&j*͕Sob/ w L:&r-&@y#sڢ:@}[_e1a.ͤ)I*i. ]_~1d/ u7ZIou9L`CLjy&=Ƀ~r2/A+8YѤӰA#(=ܜR+\0jןUT`{Dռ  T@S_mVc#T!uBJKXO`(EC15If*3A$Udyc˙VxMv#;aY= I"&QV>tZg0ρ1f$_yvn#ld:c&!\!i D <W`ʎiH5J_7N}k rR+͎NF#I0xhsqꀝ1'S4"Ԭ xsLRp)pdĜ 2Ơ[(F іVS'?ߢfi{h_KƮdY0\ L`knS\ 8hه*jMqo^bX̛z\z_MT:Ž17W 4΄2S|Snk.U!I&RL5ϰ>TzmVPC?u)5PFmhJYo9k=6>%% Wka_~u F(:qhndNg7^V4z4H}6fW $4SD=u=^`G'<9݃H[xr۸=?G>.Vp+b2C!QJZ"c]$+WX"DCspj+XEZHqcNXsP`Oޖ6{PJhcZ+qdrӵ%Ak+_S`68\ -ܫAhIZ_0_c#F9l\N+>Zhm!cmmzTp6S55>u¸\{Rt1՝ )s:LW/8'N} һD+ {dN)tt#9mpwwR2MM}n! r[ O=goo͸^;o{5e}b+[16t%AH94sۓ̝=v2e٢X-qLtmqUuY12m wo 6&'ƲJsO4noS1 2&xlT&jlE55q77fZ9a;nhΎuyi˅o}9)Hbzy=3N<ٹ\m|%wwo$ʫd&^>;5$ڶ~&hp:v4Kk1! 5=ȝ{{7LhUj5KΡ盕 Ͼq݂/?+~{:j?SOZC_ Yη>7x{/?띬*G[e<]n英Or^ٯ5Tфcb0%PAvN8V,PrNrPsƏN6yZjjN_D殑7O3-/^| a܇>doWx3øއ4u@e'S_?W^veY>ϋ5f'N,IiO@~|uqF>I,qFvBe&іW/<Ɠۏx983Ktnʋ=a;?n܏ӹ$0w'{/W_Ͼ'/ȓoN)3ՈUgs`>d,]6%r0֨ F웣lt|˓oio෾jkd؟aܯqI(ªz4e@J;z&4 ?¯߽棧ss{򜸼dm95=Zв PAhD_YNPy=3IpщZI[>-7!~|!2W}+0*j?[\nA.EkK g>y©=z&^gs:ՑJbzJj;RYM;-S"du$W_"?|4qz?j%~nqK^y q>k4g I))@s4Y:SAO[e7|{3 _" w_5Q;r/~}66Ϟ=|0R,rZ1)^䘺wspj2Ti1ٓx+N+zcExC=Ѹ^F!x|όa,g\kNl6:mM^dfTp̹9dIM7k'RMޢ$ %@<:ִ#%~꿶_K?[&<+svWj 2{i l+Ж~hE/q4'>4ge}[c@u=8<1Go|kucdQ-`uX#Tlώ|/0-xrѸ?q}~oʿqwlnĽqexLvxH[1hC-j9CJ V6~7p#YCFG)W=#YNb6(>mg_?̜|bQ"u"{Z5Fj ^:h܏돻ҕ2j9-*k<`=*;,lfn␆&&Y>42A|$2>%돽ާ J=W>y\9(>ĢiTP]GEKgNnH|eΰ~ߗڒG5gY: WWPQ(-k$瘀-;S'6G$SfpЃt?(]/j6jVS &Au=YJ'&TU.AKsi4-u& _'%r bv9,&ZP/p{:iOB' ͎ߵ}N:~cjنxnR}hl2hdm9&ê>4zu~'kyiFuxۢ~H:6L|}́t:ReMӛ ,FުZ5tl%XOu8Էgdž޾Qͳ FLX--i$WKc-V|tLgi σ<=XN'|L p|`^::q=,w#l 4V:s Id[Jqȟ0q$Z2jG~+K-uh ub ,4#-ݺ&Ėp8j\^C \>bm'4)4כѧqyJݏ(zܤS=di AqWdm"|xm H;NCX8sw|:6\bG\?YO8D i4̚'^dӃ93lݝ`Y Dn'Āg9N QEwiMθ>N8]8&BR\G1#iωq`]G[ -M~?g :V:(uVM/noA~. qIb%8j2ur2`S+6U >1yYamz-K,޽Ͻ׿#3+iA-nU#!Fb uWuUeFxD{ٯ1XʸPx1cR"3#aleΦqVvq[r/'4R QX^Ʊe֓\3%J ˨XYGOf]  7fǚºMЮ*mr"՟~L5ve݉Ww7La%^%dؾ 954@a%_o`ᔭ'65YlvO#A/]TO v61'}DH~N\.ѐ>G^x4h{,dEn$;6BX"]W~O qp DKmP{\St@R~h-|;J?8_=[) Mcօ%hR[|8:q6uԚ =x%ODŽ˙ xχh;.iv7-/ -nKEsw#o^=HGO\Ry1^sf<=_4y>c jODe՛+Z-nĶxz~G>̝quFgqVƻp<)dEg_}+ɺ[Yms_՛w=<ܚmx{k"~. N -OqfV1v 9%c\vb߸-lx<7㴝c tbsan<'LN>{r[|و-1IF4~ O?[c )t6Ai9ӊ%1i9SuP/'wEՅ"Fq9?b95/]&9TVʿK/(Fcd̼& w09 ʉ[ 5Mv$t%#mQ0.LH| .e̜$|AbfMVSv,ݡZpa z8n[|0G* bnx=/TVafl`6tavaNgѮ\,Gn[ bV̛;M$QQLZ^HQձ, SYx%AY/Odd̨(5wVg3hl@iW6s!=at;8<#S7E-lm!x IDAT|*1L: iFi;a/ŽI{Jl)Y޷&SfUeSD4O_UNe&kNj3-jӗeYtA}, hȣZi-m[Co NFn ؼi2oojd0o*f$|4lqoeӃnԤ`1r/~%%T ~Ux&2S 32JJr*lfI%1 ll 3mt%flT'I6 XF3}iӴ%i\Cpar/iEu1 W9,cl#7|A'0\զe/˶j [fM3BG/K8Aadr4)Mx/Y`$zXm)y 6Ih"__8Ҵ=z0oE$$ <4&BزRѰEQN`-, ŗԝ낰쩙R/pUdvٺbͭO- 67_8k %/֌92ƶ܍^']bcd2n:4J0z/ ܼ-~cϤH Ck'~fA:/HFVk9̺L9CzZ/?Ϲx>t0j#"Vr3̘KP/ԆN4|+[^"}sk[U_3셿nqO=h#f2!&%`%[Cc^1VR"ۀdI5?t#˿5ZЁEr"n2߱ݷ| =AanDoLb^2"}栄9VMrJb*DZ|~O/;@Yտ!lӚȖ7Z%*Oy!/;P9}ۙAmLOfNœm818MžicgO<fݳ6NnҩEPv|X0\*&Ŝ"}z暵i(fNq1't.`L*Y%qFZٗ@FWUX *L-U042 l`>4mqXJ9Ø=Ej f']A!o,AC5Qzq˴ }-AmMfBj~09E m|:)@ h`Tc"@嚓ӭҶ:; VIM+ : f >]6u 3,=9fa#/HL7G; ")_s7-fj"}-n%1\;Nٛ ^ՠi,a4sA8Z[2l>,=@@iTƯ㳩5:1pseI./GKq giCp=fBVӡDq#iRe?h<2|Z`a'FqL-W|eprݤ.cƖqɹ6lĆm+Xl|¢9Rt۠RWrIklVZ b(;r;s=voXt B nmMvj҅*Vx(M F9k: n.Zmdkx1l]gҮ -YV"1*<$7,+5T ׍cg4bñ,*p!&S9tW&,T7HϕR\dd:JkHyIaX6Lufڴ՚M^Dm`J>5! pVpnvj ҋ2jj?}5,)~m9_yc.ͧ \ưUDY;5 &JҦt}ǡz,}+h,hQ0Jd*v] 3!D *6厏'xnsguN$gkvR7lT4cmlo Mԣ=}ATCDtQc>*?/jubRY%vuǗ. % h_<&To gcT='kh[U\=;O ee4g7K9ٴf>cJ˭lqu B/D."2E H7ǦiPgM;RÆ0ܐb&wP]`lc2{b#X}p lBNXVޙ/lLєU`&zՠUv=x|,!+k媐XLv vd5yΡ̰uQ#jt'Qb؂M M^ٺLVDմ !NT '_,и"Ɛmva?^C9aלr=ܺpT#VT^g: ɿN'!r9yPl"DUW^Cf1p&FbDŷ5 R. #BdSNjjzBC𽕻6z.[MczfDI4̖\W@U*MMb%TY)T #FeEBg.oJIc0T5ڔL<]Lf]Wx3W!]غMTBnmGʯ܇4iw?_ kpUN&Z4~RžR#82"d-tUgʊa1rg[i5]ֽhC)Ta w&s!r(4SEo`hvs;&^#%;;^Ùu5rm09k3cM#Yi b:[cSQ*RM ![] E߼aʓuQQEY(O`QI/*uvMM( l`Q: ccHal6KƋMkOj >)XJ;եFG+q\~{{~wȋ_8?O"XEb :X\ µE9ПƂ8bC$f/!hΓխ_,U p4~×*Xc#cHPn%(n`'jYJ}S3d ’LG^Obn !%2n((Vע´mCGhq;O#02&Z:K0y:u)cc )eƑlZA$f5#f`yN.戻T,6]d΋:(n;\}=5O?Ï:yl&yQRT)X:lkTov3۝TCF'_;\SiI+/`X s\شl#z1Vj%704塛"{mڦS;V&1偋q.Fo?xwVQ?Sxpa9q+K |)2@i~U Ɖ>yJ¸Ot 9w Z*mAOOl_ʿsQ^ZMlYoKo|-gb#pP إjr:Wk ܳ!ʥ+T{rJY>z鬈LO`M`Tsiq:Yœ39߽ļ? $en.Bv5`Wnֿ9A 5g9gAE9n b~n$~G^7\$ WEVscw;̳඼r=rLqU ,.NoCcç9XM.^sK&Wo|v:q92_ L@y~c~-?gcdGeI䉚wDgѩ39:12?VOWcM6:͛Bt\=R&CwI}7NlSXp'/PC /q=DNW.jlFdO,V3?`k:U8=EEnjX{/NE͕ێMyMZdT "VjqO?o׿Lʛp ,/?}w;RV_p|}n*P}P^Ά<<O?Lx(}YX8&e" y6^|v~37<}o^% PDuKy5l[ձS?cof¿ITa]x 5ĵ>*H gڳ_HʅlW5a:a֭Uq` ƪ\&Isf,d,ƱvfNĬK'fx݊0^k^lrp)U5}=П?t_?~:CF ox:_hRu^ëb&p'ϏH]UĖ=ûp9E;qqIW8F.RԢE 1%9ݿӏL"v5Pg%H] UEݢ'k! jd&F|'E*M "ix_T过XpX7ꘫ$lr+O b|ƺB2#ЕTNnzYUxm =ٿW>l4]UL>Щگ!44khWKRgL)8qw#T}ub7ǒ3ƌɇC]7>]\r)x(Ϟ/̹ ƘDž#UOT}cy`χAs8jyR*Bt ,Jl!JHD8+_C餟srpJnv'CMU70cq=c"q纉{%6W}͉mbIU3kJMiX*VZnAQ3q~ 3ա9ZgzŮӭMΟtm2,l3VJ;7[4޼#6^uסbO\ǥyxrpwφszF:XB7EoVl{(eX6[ Aџ~RzntʙZաaf<m4_)D;eRjLth`ɠal2I&TB վ69x` K_VQaG2C A<YU܊-7L܌+wR l>fz0H:Nkq-|qy'zoas~\p ?м} c(lxC7;f.ȚwrOGhα$O9όb#ؕ]޵tnA7w<}xVvQf0қFG#KhK޶`nѫ#4ڤ/O N4:E>BФ-Nl'<-;.FY"6'o9X"rCn__֤̾lF_1l0JY6!m#_BpeוzZ캭TCE#ѱnG<㴔6Z閇K1[z[9۷f!Ϗ-B(IDATO6|_LoϾSѭa1>>t9VWX|ϾƷ'>~-\<c0w~w~WoxyOI?swgT!6 X (b,oC䁬ІTL%Hb <{ҍ͜L\_w4]5MئxUꭁw*5[Oa: S7MWVh!xyc1BhC9Kɭ7zbmɎb ]*{IL*s]%{ֽGp.K׭_v80K=9"|,Cay7<==χn}ΧOł%ضoւ&y5?]8/;՟}˯|tm3㉱7 [rl^~~m#!WΖ1iR˼R6FE8 PW!LT+se׍+O䡕11\r-޷8?seM=E[5XBV6|hYg-MICH3 X}&9ru$c%L7p4xnMa}Y#vcjgߘ<Ŕ?ie4O|?1\jy ߽d#0^߿w1'`-8mf`;fs.Orc? ^R0a[; Nw?=/1(cbW瀅rh놡%{~*JuB7,l1tײ!}xSn $\gԳD9*Ƙ*,2 Ms1DdA؇KV~ ЕxIJ.F/a%W Q[6D% GduuxB1qԠia] V>juB9SZ lS了s-)̅qz'չhj\C*E nZ{ݛDob7Đhp w=']K^X*<ڠz\LŭM'ݏTo?=~_EbW{8Gce׿⛯X{&嘌yag (O'x|W")7C&94Ib$uuu~:Il|_>袱a&Ż^ה;=ᛚNM0MK-ÌT.S!BBtͷb;ƎuTaXp>xx7:%{EMG B9WV_y6S>-GtaviMyU~ 4ٓát&3ID\RLӄ&9_>t ai:K46%8©` h\/r<%tZ0%K^63RĸX{tH1^qm}?rnip- Dx{$a޹H-UtEb>!!ƀ膾]]mpkK%uUVWFF=^5@ѝ $g˦NHk>yGJ"89b㧌t51URǽ*~v[Ic+٢X1 CC9B}4$R :CNe `&FVX[&[d*6mS%J~Pgq$?w kmv56t<^[>FU}(W`)yj&tܿ48R98y'o˟e2>󻇒v嗉'xgrmR#>Sɞ0$Kmðz]PA㨩US7Jb& fziM![ 2p!otNF&z(y#'`^PZd يlmr(,!BDŦT}# /OJy=y=oCC_"iCfTQ1ء} 9u1joʂGݔ/b4xuo hd.XTėNpdR~H..$sA!2l,mJ&6 9tLIce\%%CY,XnMrg -;L9 jKZ`sp΃g%?]sUtMtL²j>IOMX7YmJ-Z8&O73JwcI0m<;'5I;6Fzw-s8{%^aBfk(u fWf}5e\ղa")EKcJj;^Ξy>\&Dtk-_P<+ZTnE t IQD1>1N,]ti_acQpWnr}w}*%!r9r,]%ʻIkD.(^Lz]GŌSF){Y\0I6#u⮸x)`m8cVJfި4l"91+|L!ăG~q"=ECၴщͧ_Vs֕x2}46Yv3SP0+aI3Z[W5׈'^ҍ0(:/yP[jA#$֨LS-#7l+lMo;=PE)0r^_֨E``>yԙ>?4*R"(P[1dU.QlUkT"kfRf3$G5#tȧ!تݲNuE-J W=<zbW)ȜaSߕ: 56HTpZxH)^v6R&U36Km᫭hgQG#6$3zfUMMa&l8P8sRcߋx~8ZM)a\[Pρ͢>zޮ}Y׬K+(nnKC"u1_C#"̋qN꘬ڊsn<)FHtLJc(I.•=*F,(K>)-r&*IjfR{YS1OGj׏ 8Üǿ~8ˊat{FN02N$Cxbd 6`(a)GRsa]+Ke_C L`cN#Cړș*+-{(5gҊ9 -H:uXWa^  HB[>!n>NKCw3*pFO*S&etXp]cnnͷIZL)]XaRTobX3#c1=d">㤦N }Veiy %)ֈ%L06`"EoǃE!JmA-8.^lPpO{(1C(KuCB O)aqJ"[.o[6Zɣڽ&YPf789&?vYu_F+' jQv~ҡg}J,Mq$`E|$iY 5.T`.=ľ*W=qabjCeӺ G.Az&Q<~}uNmŖ6WW$VN`.GHO{!ȯX>*UK.1Nʢ[VwNU~"nlO=0dwxyLy)SQt=|5EMA}ƖX)HfiCɶC'y)$ ;LŷmX&p;znwZy)4hzRRnismuUn;<n_7FpWJ I*$AHV]\'8Uz  1xFQσmzٱ%̏-&D"+R?3eZ8bGξmR()IK,ނF7.3UEh,q62"U7{w$HwP"x[,X eAɺ6nO`_הHk+T@؅(ҟ[o2d4l.֖uk`P%d$VCuk1:MdvbpʋZTlǡdvW)-^K u&l}ѕZ Ī,OK؈a#Y!ɣU_6_f*S> `|a[L2gݜluƘT] {`QL]o^X4~(IbrSY|P;ɯҪpȃ{O ll)H4T~CߣJ'`Jgu֣mҭRu [-u4Ҧ J#>zEbM8viy;B^̪EnkƉ57p9ހ&RX!CK}.)rLona(QR`B IqN܀o?lk \\?`+11g`Sγqmy)mؠ99ڝZG@&bSʬ)\-dfcB1oZDvOf7VJD+z&ڲC᪌;zXRCaVNnޓjb *SYNi\u,>v``WxT{#Bc ?}QYEAF!הe,^CGH]ȡ rQ<5u|Wyx1w`?_sgٿxG _oF -lW_ԾFi^şHnЂ?>Ͻ5T;:7_xE!_x^ܿ>M~Ot Sd|},BבU*VIENDB`gx/images/Button_special_over.png000664 001750 001750 00000011306 12702465756 020320 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚ{t?3޼<7!#Ҵj+zU˵R=h Vk[ZD(ZKQ#4/lc3&@s;;3;}~tn;4SRm1 px#I+JHv;%A1ŎVO5 B8b9Tr)wcJ:~l$rvYn X h2|wއ \Ub|I U(9Qbq3fzϘ{.Z3hP+s5̜ݠ8o~l$vOK:ܵkqMלkz_rј'3yBdz4@}}TO)Iz.KtFV?<MӶm$so]7_Ƀɘ:E "+qgL{lo* R \s>$i?ٽ[}맡KNF,޿ʱr  A@ebhp8L0DPB }4zo~U ƀ5%I ^1@=4=6׋&1Ċ\=.s66c l`H(z`0H("RێPYЩn_jտ$nt4RC/?k\ȉlh4""x< HX,H$B! EƣL,N`\H.|5|I<0:OmWuS?۫[';{F&&IR;*1.xEQbD"~?PW{X֧me|Y)j8ԍN W hs'l 3`!&+Sj ˲cZeY;V+J oy@1zɰƨnK2r*tww,--ǐAnx%45S3bϙ@~~>APE5W,˚z=~0, L,5 X?˽K Xhinw#׋_Cg<+!7lL&HI0R']KFQ'oB0/<^vg^׿ {^KwL,㕣T2J2FeN `ҁگEiO;?xix[ lwytk=Mo= ӖP߽Ml|fsj5PSg2}tn{W=z(#"K_#;ꥭ<M%cc9m$O*B9uJX,IHTu[n!$=`*de@g*R`ضuvK;0?'b4NOfiR% v&Md„ ={6-JPueY:i4{?Iʒ/\C[k_꺵~=Q5H$TTU>9Gߦ (|rb4sXEt4NuiӯpfY z85PBȟ3555D"BP^3R@ߦZ -]kNH9s崀)̮fI4c2Ϊp*h$U{S磲\P[[@I/'(jcBO޻;IC9a0LIz,H^qΝ;c'Mc90Hkp֥<nw dj, |bb6[EQ{:{5EQHS(**b#˙>}:v"J΁@ Vi @<.azU=ȪD25>(ŔPϣe$ |PUUfd2!"VՊfjb۵ xj*|$MÚ6o6LyjA8p4zȰ)+~b0Q}VaRk CR2LdffA(bҥdgg 1ZUSU4ryqzzzp8©'; *Lŵ0d Z;0bx,dffri֮]dTϩSNCI^^ޘ6 5 IJ z7UʼnKhOtff&qF{9/N8U-Ucݺux<N )2;f2@74wy 9t /TErrr8r˗/ĉjDPp8ѣGYh]lecxX`a/j͌iѯgD[=DQz)ΝKcc##$©Uf֯_f#+++)\Rϝںפ7 @r(,,XV0۷oGe.]:Br@AMrjYt)deeԨS0 8"I%\*iA  1q$a>G8֞hmml,ɥvz,4:%ѫŤtԬzmppAIɄa-[ cO n%XsA:> z|zsNS] ~Vx<,ZH }:3h4 Ra4HAyu6 zDtHeN0ydJKK5ܻw/477t:X,(h$??nx 8uu]R gxp.8Y)$ J>t'SIOl$lSU;S[Z+VGNNNڎfgg3n8vͦM理-8h%;[owp 'I"z \ݠ{lxuG Bk8{,&3fpAxy 5DQV'[nӧ_uY'3f7(U=o9ɕ"beA%y>٤ rG^^6Y+xcʹbZN2R%9ѥ7U5Ut$i@IMu_,a0?#6K1 q~m6oϟOsQX@glnT'yG\Uuɕ"| ET{#/ ~^Q(^n,idffb0h4PMHͳB^C1ʍz 8$ Rc r$Utj.{,hL=$'K/pxKԽt/O9]so^.|aDNeD2BfDX GEq|&9gSaFJyX\Dc9A^aшy1Utؗ^ʜ ~= %I:wA!=OA @an\.؅?f ؇0oG9,t,crLw+[ޡtq~Y/(X鋫@ ,_ Tȣ߭dOyUu$ɤ)Jnw_vwW*͞"@#7|̼ gRAҝ "7F9ʆ${Ų{nS9{c>#lt$|z/v9t++_,+7Տ~ƒ3'~O* i{LnNՠPǟJt9X L;mxGlZ;)uq:TrU*&͕S|kCs*WP_`oji@9P toXq_+ dqscIENDB`gx/images/Ctrl_sportspad.png000664 001750 001750 00000011474 12702465756 017323 0ustar00sergiosergio000000 000000 PNG  IHDRLT(sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=IDATx{Y?WN M(16 (eckcVKASNNG;l&utƱI:3цvL[M$MBa]9{̙s=~,( \te5lUg0tݣ5Xk_DlYdE^u - !ǐxmn'ӀFOY7`3]G {׆M6׀ht]e]\E!Ud} "1h`ͳY~dv!U>n. +Qty&NlHuMZ[K)b/dۛnĤ(50!V(k6jgm/7rI#l_(Gǣ"k+nt%m'[z^+RW9HS!?Qpq]u3@=Z_]6sVg.b,.?3&]o`BL{jٕ]hZZ42a Ɯ f_0 7Pj|+?>a|;lciYt؋?nWsڹaYo`X yEkCn@*pH1.\k}{}SH GT5p/Ϳ!31en X!N[ tD9 6+h~<+q1ks6GP12^IĪD9esyh bu>-{*敟Ah7"^zw#i\R@6\|-A]z;mkF|1hg&ʬ d,A_u; 9qXQVd\@4e?!X,"DvIİ6>-qGρx8bU V!:6M-Fz\,#_ kɸm'(j@( P򋄻OO!;WDL@ɾ߂T>*~pwlo`GlYB2+"@`7 2JMC;GS}v26d$[I83x+W#ZZ_FtBF> t}m (xD7"v^>XھcJթ&!Wm/!uBm: gs( 86jwr6De+c%BaYdl!ul!{>)ޫs{~y=qd:ˆmn7#֟ZjC& 6'gmE/6?ʒ~lDTEkH -Cj!!PcFL`}4ژ{Qp?:g -)y6t-: 5b@;aw,F}XczƔ>wȞ%(vҕ;1k:V^aA:cEtw(!9ĸ^.W1$왋΋k]F95"z;BǬ3A#! 6C{mSh虶/X>kό6!=?sqpaHvR<vDNab .?pJy#v&bpԟ_=εY*=Vj+:3cG߄<*tNlFKN UTzĶUR-`(wTiSE([¹01/UVJNFDZvEve!b۹y#"W_G<"AxBaxKڈN:G[B IRg46W#; NCȮ+JLIJJJJJJJJJJJJJJJJJJJHdzпʻMi&I(i>$I tť#Mr}tiU{4m>h@[4ݞ$IG괡viZ2n]6V@=jg|z{?I6V}؜$Ig4hNcG$-Q;lv.e}W8Q VoeN-h'vڎwv$I2-I3;$Am}$I =4Mw;$Yguizo=az(/A66>8FO8;ڭqg$=j6&IҞ$A /b-$I: ҎTxM~-RVk6DsFj4pU`*ih S..+@@{y6VNn]yDi'MЦx[$BfcٖA[&Vd@7\Z_ف-m6Sv&SXg7Ku#Wk;$yؔ$ɞ4M3Y$iIyJ2 VkGT1I{M[[A6$IzlН +k@BӍ$r4t;zK;yA$mொ*O;@1M3/Cm' LL5ېW]6}iƆs#b粨^|H{[ΡSHSǭ{ߏYgW;%7i_#jS%IENDB`psp2/config.c000664 001750 001750 00000003642 12702465756 014222 0ustar00sergiosergio000000 000000 #include "osd.h" t_config config; void set_config_defaults(void) { int i; /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 0; config.psgBoostNoise = 1; config.filter = 1; config.low_freq = 200; config.high_freq = 8000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.dac_bits = 14; config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ config.mono = 0; /* system options */ config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */ config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */ config.vdp_mode = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.master_clock = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.ntsc = 0; config.lcd = 0; /* 0.8 fixed point */ /* display options */ config.overscan = 0; /* 3 = all borders (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */ config.gg_extra = 0; /* 1 = show extended Game Gear screen (256x192) */ config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ /* controllers options */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD; config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; for (i=0;idevkitPPC) endif include $(DEVKITPPC)/wii_rules #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files #--------------------------------------------------------------------------------- TARGET := genplus_wii BUILD := build_wii SOURCES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds \ $(BUILD) #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DALT_RENDERER -DHW_RVL CXXFLAGS = $(CFLAGS) LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_set_ir,-wrap,wiiuse_handshake,-wrap,classic_ctrl_handshake,-wrap,classic_ctrl_event #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- LIBS := -lpng -ldi -lfat -liso9660 -lasnd -lwiiuse -lbte -logc -lm -lz #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- LIBDIRS := $(PORTLIBS) #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional # rules for different file extensions #--------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- export OUTPUT := $(CURDIR)/$(TARGET) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ $(foreach dir,$(DATA),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) #--------------------------------------------------------------------------------- # automatically build a list of object files for our project #--------------------------------------------------------------------------------- CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- ifeq ($(strip $(CPPFILES)),) export LD := $(CC) else export LD := $(CXX) endif export OFILES := $(addsuffix .o,$(BINFILES)) \ $(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) $(OGGFILES:.ogg=.ogg.o) \ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ $(sFILES:.s=.o) $(SFILES:.S=.o) #--------------------------------------------------------------------------------- # build a list of include paths #--------------------------------------------------------------------------------- export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I$(CURDIR)/$(BUILD) \ -I$(LIBOGC_INC) -I$(PORTLIBS)/include #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ -L$(LIBOGC_LIB) export OUTPUT := $(CURDIR)/$(TARGET) .PHONY: $(BUILD) clean #--------------------------------------------------------------------------------- $(BUILD): @[ -d $@ ] || mkdir -p $@ @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.wii #--------------------------------------------------------------------------------- clean: @echo clean ... @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol #--------------------------------------------------------------------------------- else DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- # main targets #--------------------------------------------------------------------------------- $(OUTPUT).dol: $(OUTPUT).elf $(OUTPUT).elf: $(OFILES) #--------------------------------------------------------------------------------- # This rule links in binary data with the various extension #--------------------------------------------------------------------------------- %.jpg.o : %.jpg @echo $(notdir $<) $(bin2o) %.png.o : %.png @echo $(notdir $<) $(bin2o) %.pcm.o : %.pcm @echo $(notdir $<) $(bin2o) %.ogg.o : %.ogg @echo $(notdir $<) $(bin2o) -include $(DEPENDS) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- core/tremor/codebook.h000664 001750 001750 00000010051 12702465756 016113 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: basic shared codebook operations ********************************************************************/ #ifndef _V_CODEBOOK_H_ #define _V_CODEBOOK_H_ #include "ogg.h" /* This structure encapsulates huffman and VQ style encoding books; it doesn't do anything specific to either. valuelist/quantlist are nonNULL (and q_* significant) only if there's entry->value mapping to be done. If encode-side mapping must be done (and thus the entry needs to be hunted), the auxiliary encode pointer will point to a decision tree. This is true of both VQ and huffman, but is mostly useful with VQ. */ typedef struct static_codebook{ long dim; /* codebook dimensions (elements per vector) */ long entries; /* codebook entries */ long *lengthlist; /* codeword lengths in bits */ /* mapping ***************************************************************/ int maptype; /* 0=none 1=implicitly populated values from map column 2=listed arbitrary values */ /* The below does a linear, single monotonic sequence mapping. */ long q_min; /* packed 32 bit float; quant value 0 maps to minval */ long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ int q_quant; /* bits: 0 < quant <= 16 */ int q_sequencep; /* bitflag */ long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map map == 2: list of dim*entries quantized entry vals */ } static_codebook; typedef struct codebook{ long dim; /* codebook dimensions (elements per vector) */ long entries; /* codebook entries */ long used_entries; /* populated codebook entries */ /* the below are ordered by bitreversed codeword and only used entries are populated */ int binarypoint; ogg_int32_t *valuelist; /* list of dim*entries actual entry values */ ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ int *dec_index; char *dec_codelengths; ogg_uint32_t *dec_firsttable; int dec_firsttablen; int dec_maxlength; long q_min; /* packed 32 bit float; quant value 0 maps to minval */ long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ } codebook; extern void vorbis_staticbook_clear(static_codebook *b); extern void vorbis_staticbook_destroy(static_codebook *b); extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); extern void vorbis_book_clear(codebook *b); extern long _book_maptype1_quantvals(const static_codebook *b); extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c); extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); extern long vorbis_book_decodevs_add(codebook *book, ogg_int32_t *a, oggpack_buffer *b,int n,int point); extern long vorbis_book_decodev_set(codebook *book, ogg_int32_t *a, oggpack_buffer *b,int n,int point); extern long vorbis_book_decodev_add(codebook *book, ogg_int32_t *a, oggpack_buffer *b,int n,int point); extern long vorbis_book_decodevv_add(codebook *book, ogg_int32_t **a, long off,int ch, oggpack_buffer *b,int n,int point); extern int _ilog(unsigned int v); #endif gx/images/Button_icon_over.png000664 001750 001750 00000016361 12702465756 017636 0ustar00sergiosergio000000 000000 PNG  IHDRvOsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time03/21/09q\EIDATxy\}{VK-$!@`X 3c L` I&90c ` $`f [ Z۫%1ZJ,yzu{_}2՚q^d8STyia@t-pXB!C)Mzp8뺯& o* UUUManL}u<!@Qrj(UU4pp?g=pk\.weY<ömcpp1lu]L<ɇ&0D"B!4M*LBuu5aYoE]_{P7yQueǎݻ1`&l!SLa޼yyŲe^ ^[jq&y*qbӦMR)(DQ"*P9bIqBjdtuu1<<ٳ'?Iee%po͟۷Pe\0.}Nك(PQQA(}),sSEQP!D1Ng|M6l@[[7x#UUUu:yWy޽]vQQQAkk+x\.a81! CQ Øɚ5kXr%\s Ds_֫¹\nm$Imۆ(455QYYI&q ]]`C, q, 0F,Za֮]ܹs5k5k֬u!Dk.۷a:::(++0pq%Lb6mHu( ipJt]'N fϞMOOk׮h4lҥ8 MӬ2Mݻw>a7HRtuug1 #>~@RbTU-::::4MLĶm멫AcgulHR  r9<# aY;wrSVVF8dTöm47ngݜ{TTTFPj$SSSs !dl6KUU3Mطowfܹ|Z~ikkcB!-ZXqEadd&,˚f!af B(RHMӤ4d"~$bY466rBqu])TӋnB v>s:XRSںmd2 ꫯ.<FpPT%xoA13 _" ~| h 0 L,S\6:G$^L)Ǘ3M\.W*dGFs]ݩDqOL,5%HPWe$\b5ٜ\X~|t˲ `x'$"eh|)PO1'wɇK 8Q|0?I%L]k(-JŃ㹎'=:I>Xu $IPH>ZwiQxs9pA X]2$&J%IJF&'Cbd)ԟ$9H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJJRRP")H$%E %))R(IIBIJa7<4T qp]\DQii<'FPD"Ayy9XC=wPt۷aV<ӴlC>aGćѸ `pH' Q+7qgֆ~*T__W)b2ʅ4V;!AX#>ҨDUr/`47ʎ}1~>ƍ0U|fѢEh0 ~ۃ?fZ_|* jK@"8gB VKof7E,^ɿtttto-~%?9HS݂? @Aj0sv-楷jytǵ2wy! [9)B ]j5_\r/ rΙD6yT@؂^Fc8{E uW qт$f<'yPUK.VI:AB{E|^ ^*>yy"Ga)%uRYWp,0sʻ'J2)hHQrpϟ;7 6>Z_sq~?%Jk毿(DxcDR;akMC:5*'Fy2\ ).-u f7yYښM/ n^TQ=gk><<<+u"L(}Ν]t7[ %2Q~W*ZWԖڧF%O=QӲ1e34槿Y44+]$xipCpU 'G6K%@P K7 Dr]L&.g[V9x2C&/y[ͧǥK3o\(N>߶mFGGk^~o7$}4xcKlwz;m456\娅 T8<ؓGRuS& w(oSGx0gu:v\r S`v@N4UUD2{^r W~-zqxr4X#_3Cl3G~{xQ/p9m8C__??ѿ`dsAIO/5>鋹_cis}#-]s'@4_|uTWO7s-t&/,ϏxlܸO[Q!硪ъ%T %W[PL0 r\//5/B\|οcl4LQMr3f QSS+\ej2  v =#yks?8e6۶q]l6Gsm45*eL ,//gppL&sLaf'E>SMlZijnwAVQOrbJb/p<7,Dp8뺅'}7X,+ *LqpUU2e BN2Lafm۩,sX|Fa2 ORMpo9 Ӵ|R'29m&sbez4l20ozX~!8r9}Q2 uuuhV8BL quEQ !(++CUUfBrFNʆ [馛 a6=8-:3 OD6m)շay §2w:^~7۶6_d8o 7 ^}5D #UVKCC|YQrT MH$A*[We(")555ܹ>Z[[m0:3m.ᄁik=|ƒ;#f"\~مTW"_dy d "SG۶ugo⼹ B&P$n hkkUUfg2FGGbb1PhCշoIee%f fΟ?Žzzپ};6" @N]i M6&x/mwg L244pvZ[[,뷛6mАEsy ,زf͚}oKinnf͚5ܹ۷14-BeEA5BΔ* bOS+RA x( eLfH!q ' Q=TjkNF"MF}}=7ٳgyWWW2C&;Uʍ8KON]] .Adu#gX:D$!BZXF{Ko22:#d*>) dX#).hAMHSRSe."`ZvYfMs' bb𸆦ǣ)t]w|K;汱7GFF6YGC{} ;wnMmmmaEQODѦyec4NOLi&\3;xᅗ/,JI8PR3uV֭vb`|XgpT<߭ٶSoo&`v2L ' `db+~Ϟ9tź"s'y}}=hoy_чԷ\F?NPO @OO+_\M,b B>N\<vH 5 {zzڸqc֔ܲΚ5ٳgv66w&7o?!.5 .\5?=\ͽn /)|\e4.w^*)++CӴtUhi뼴Wd\x q=pLpOkgƌX믿'ԚRciK,L6{ﹼeJr}0V ^Za8;GT1mP_c@L|JUOCԺZ#ӚXC kvCf72g$l]nݧ6n$B<ϚymۼJ~+4ո|$,C\ih Jϗݱyj8e"6>X. (=#3713X@7wʕ+_L(_|Y˲Yū'W W]}z0_7dn{ꩧ-U[J*+<~<7y3'MUˏ>l{z+#1Op||tJ:aˮ;Ub8fR;e ýT+Vxm)Pw/7۶@?[X$̛15GSIYN uB:rp0̾]#D$,4MLR}ʕ)u[NP]w][oD"\.n&ٰq["%vԔ$by<)1_;$ds*Z(FC} MuKeaӽYvΓі&T>_܍:<4;C_twPBprVSYYVdb*fwܹsŮ]OVSNP_}ҥKL:6sl#+,15rtdw!up8 2T*uxx'O[d*+,?gϘ13h*gXUW|{r9>>T*?˭Ŷm@*]Fs9iFUUx<(o<YۻoǎSThŶWV IENDB`psp2/config.h000664 001750 001750 00000002107 12702465756 014222 0ustar00sergiosergio000000 000000 #ifndef _CONFIG_H_ #define _CONFIG_H_ #define MAX_INPUTS 8 #define MAX_KEYS 8 #define MAXPATHLEN 1024 /**************************************************************************** * Config Option * ****************************************************************************/ typedef struct { uint8 padtype; } t_input_config; typedef struct { uint8 hq_fm; uint8 filter; uint8 psgBoostNoise; uint8 dac_bits; uint8 ym2413; int16 psg_preamp; int16 fm_preamp; uint32 lp_range; int16 low_freq; int16 high_freq; int16 lg; int16 mg; int16 hg; uint8 mono; uint8 system; uint8 region_detect; uint8 vdp_mode; uint8 master_clock; uint8 force_dtack; uint8 addr_error; uint8 bios; uint8 lock_on; uint8 hot_swap; uint8 invert_mouse; uint8 gun_cursor[2]; uint8 overscan; uint8 gg_extra; uint8 ntsc; uint8 lcd; uint8 render; t_input_config input[MAX_INPUTS]; } t_config; /* Global variables */ extern t_config config; extern void set_config_defaults(void); #endif /* _CONFIG_H_ */ core/tremor/sharedbook.c000664 001750 001750 00000030314 12702465756 016446 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: basic shared codebook operations ********************************************************************/ #include #include #include #include "ogg.h" #include "misc.h" #include "ivorbiscodec.h" #include "codebook.h" /**** pack/unpack helpers ******************************************/ int _ilog(unsigned int v){ int ret=0; while(v){ ret++; v>>=1; } return(ret); } /* 32 bit float (not IEEE; nonnormalized mantissa + biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm Why not IEEE? It's just not that important here. */ #define VQ_FEXP 10 #define VQ_FMAN 21 #define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ static ogg_int32_t _float32_unpack(long val,int *point){ long mant=val&0x1fffff; int sign=val&0x80000000; long exp =(val&0x7fe00000L)>>VQ_FMAN; exp-=(VQ_FMAN-1)+VQ_FEXP_BIAS; if(mant){ while(!(mant&0x40000000)){ mant<<=1; exp-=1; } if(sign)mant= -mant; }else{ sign=0; exp=-9999; } *point=exp; return mant; } /* given a list of word lengths, generate a list of codewords. Works for length ordered or unordered, always assigns the lowest valued codewords first. Extended to handle unused entries (length 0) */ ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ long i,j,count=0; ogg_uint32_t marker[33]; ogg_uint32_t *r=(ogg_uint32_t *)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); memset(marker,0,sizeof(marker)); for(i=0;i0){ ogg_uint32_t entry=marker[length]; /* when we claim a node for an entry, we also claim the nodes below it (pruning off the imagined tree that may have dangled from it) as well as blocking the use of any nodes directly above for leaves */ /* update ourself */ if(length<32 && (entry>>length)){ /* error condition; the lengths must specify an overpopulated tree */ _ogg_free(r); return(NULL); } r[count++]=entry; /* Look to see if the next shorter marker points to the node above. if so, update it and repeat. */ { for(j=length;j>0;j--){ if(marker[j]&1){ /* have to jump branches */ if(j==1) marker[1]++; else marker[j]=marker[j-1]<<1; break; /* invariant says next upper marker would already have been moved if it was on the same path */ } marker[j]++; } } /* prune the tree; the implicit invariant says all the longer markers were dangling from our just-taken node. Dangle them from our *new* node. */ for(j=length+1;j<33;j++) if((marker[j]>>1) == entry){ entry=marker[j]; marker[j]=marker[j-1]<<1; }else break; }else if(sparsecount==0)count++; } /* bitreverse the words because our bitwise packer/unpacker is LSb endian */ for(i=0,count=0;i>j)&1; } if(sparsecount){ if(l[i]) r[count++]=temp; }else r[count++]=temp; } return(r); } /* there might be a straightforward one-line way to do the below that's portable and totally safe against roundoff, but I haven't thought of it. Therefore, we opt on the side of caution */ long _book_maptype1_quantvals(const static_codebook *b){ /* get us a starting hint, we'll polish it below */ int bits=_ilog(b->entries); int vals=b->entries>>((bits-1)*(b->dim-1)/b->dim); while(1){ long acc=1; long acc1=1; int i; for(i=0;idim;i++){ acc*=vals; acc1*=vals+1; } if(acc<=b->entries && acc1>b->entries){ return(vals); }else{ if(acc>b->entries){ vals--; }else{ vals++; } } } } /* different than what _book_unquantize does for mainline: we repack the book in a fixed point format that shares the same binary point. Upon first use, we can shift point if needed */ /* we need to deal with two map types: in map type 1, the values are generated algorithmically (each column of the vector counts through the values in the quant vector). in map type 2, all the values came in in an explicit list. Both value lists must be unpacked */ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, int *maxpoint){ long j,k,count=0; if(b->maptype==1 || b->maptype==2){ int quantvals; int minpoint,delpoint; ogg_int32_t mindel=_float32_unpack(b->q_min,&minpoint); ogg_int32_t delta=_float32_unpack(b->q_delta,&delpoint); ogg_int32_t *r=(ogg_int32_t *)_ogg_calloc(n*b->dim,sizeof(*r)); int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); *maxpoint=minpoint; /* maptype 1 and 2 both use a quantized value vector, but different sizes */ switch(b->maptype){ case 1: /* most of the time, entries%dimensions == 0, but we need to be well defined. We define that the possible vales at each scalar is values == entries/dim. If entries%dim != 0, we'll have 'too few' values (values*dimentries;j++){ if((sparsemap && b->lengthlist[j]) || !sparsemap){ ogg_int32_t last=0; int lastpoint=0; int indexdiv=1; for(k=0;kdim;k++){ int index= (j/indexdiv)%quantvals; ogg_int32_t point=0; int val=VFLOAT_MULTI(delta,delpoint, abs(b->quantlist[index]),&point); val=VFLOAT_ADD(mindel,minpoint,val,point,&point); val=VFLOAT_ADD(last,lastpoint,val,point,&point); if(b->q_sequencep){ last=val; lastpoint=point; } if(sparsemap){ r[sparsemap[count]*b->dim+k]=val; rp[sparsemap[count]*b->dim+k]=point; }else{ r[count*b->dim+k]=val; rp[count*b->dim+k]=point; } if(*maxpointentries;j++){ if((sparsemap && b->lengthlist[j]) || !sparsemap){ ogg_int32_t last=0; int lastpoint=0; for(k=0;kdim;k++){ ogg_int32_t point=0; int val=VFLOAT_MULTI(delta,delpoint, abs(b->quantlist[j*b->dim+k]),&point); val=VFLOAT_ADD(mindel,minpoint,val,point,&point); val=VFLOAT_ADD(last,lastpoint,val,point,&point); if(b->q_sequencep){ last=val; lastpoint=point; } if(sparsemap){ r[sparsemap[count]*b->dim+k]=val; rp[sparsemap[count]*b->dim+k]=point; }else{ r[count*b->dim+k]=val; rp[count*b->dim+k]=point; } if(*maxpointdim;j++) if(rp[j]<*maxpoint) r[j]>>=*maxpoint-rp[j]; _ogg_free(rp); return(r); } return(NULL); } void vorbis_staticbook_clear(static_codebook *b){ if(b->quantlist)_ogg_free(b->quantlist); if(b->lengthlist)_ogg_free(b->lengthlist); memset(b,0,sizeof(*b)); } void vorbis_staticbook_destroy(static_codebook *b){ vorbis_staticbook_clear(b); _ogg_free(b); } void vorbis_book_clear(codebook *b){ /* static book is not cleared; we're likely called on the lookup and the static codebook belongs to the info struct */ if(b->valuelist)_ogg_free(b->valuelist); if(b->codelist)_ogg_free(b->codelist); if(b->dec_index)_ogg_free(b->dec_index); if(b->dec_codelengths)_ogg_free(b->dec_codelengths); if(b->dec_firsttable)_ogg_free(b->dec_firsttable); memset(b,0,sizeof(*b)); } static ogg_uint32_t bitreverse(ogg_uint32_t x){ x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); } static int sort32a(const void *a,const void *b){ return (**(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- (**(ogg_uint32_t **)a<**(ogg_uint32_t **)b); } /* decode codebook arrangement is more heavily optimized than encode */ int vorbis_book_init_decode(codebook *c,const static_codebook *s){ int i,j,n=0,tabn; int *sortindex; memset(c,0,sizeof(*c)); /* count actually used entries */ for(i=0;ientries;i++) if(s->lengthlist[i]>0) n++; c->entries=s->entries; c->used_entries=n; c->dim=s->dim; if(n>0){ /* two different remappings go on here. First, we collapse the likely sparse codebook down only to actually represented values/words. This collapsing needs to be indexed as map-valueless books are used to encode original entry positions as integers. Second, we reorder all vectors, including the entry index above, by sorted bitreversed codeword to allow treeless decode. */ /* perform sort */ ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n); if(codes==NULL)goto err_out; for(i=0;icodelist=(ogg_uint32_t *)_ogg_malloc(n*sizeof(*c->codelist)); /* the index is a reverse index */ for(i=0;icodelist[sortindex[i]]=codes[i]; _ogg_free(codes); c->valuelist=_book_unquantize(s,n,sortindex,&c->binarypoint); c->dec_index=(int *)_ogg_malloc(n*sizeof(*c->dec_index)); for(n=0,i=0;ientries;i++) if(s->lengthlist[i]>0) c->dec_index[sortindex[n++]]=i; c->dec_codelengths=(char *)_ogg_malloc(n*sizeof(*c->dec_codelengths)); for(n=0,i=0;ientries;i++) if(s->lengthlist[i]>0) c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ if(c->dec_firsttablen<5)c->dec_firsttablen=5; if(c->dec_firsttablen>8)c->dec_firsttablen=8; tabn=1<dec_firsttablen; c->dec_firsttable=(ogg_uint32_t *)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); c->dec_maxlength=0; for(i=0;idec_maxlengthdec_codelengths[i]) c->dec_maxlength=c->dec_codelengths[i]; if(c->dec_codelengths[i]<=c->dec_firsttablen){ ogg_uint32_t orig=bitreverse(c->codelist[i]); for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; } } /* now fill in 'unused' entries in the firsttable with hi/lo search hints for the non-direct-hits */ { ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); long lo=0,hi=0; for(i=0;idec_firsttablen); if(c->dec_firsttable[bitreverse(word)]==0){ while((lo+1)codelist[lo+1]<=word)lo++; while( hi=(c->codelist[hi]&mask))hi++; /* we only actually have 15 bits per hint to play with here. In order to overflow gracefully (nothing breaks, efficiency just drops), encode as the difference from the extremes. */ { unsigned long loval=lo; unsigned long hival=n-hi; if(loval>0x7fff)loval=0x7fff; if(hival>0x7fff)hival=0x7fff; c->dec_firsttable[bitreverse(word)]= 0x80000000UL | (loval<<15) | hival; } } } } } return(0); err_out: vorbis_book_clear(c); return(-1); } core/m68k/readme.txt000664 001750 001750 00000025126 12702465756 015441 0ustar00sergiosergio000000 000000 MUSASHI ======= Version 3.3 A portable Motorola M680x0 processor emulation engine. Copyright 1998-2001 Karl Stenerud. All rights reserved. INTRODUCTION: ------------ Musashi is a Motorola 68000, 68010, 68EC020, and 68020 emulator written in C. This emulator was written with two goals in mind: portability and speed. The emulator is written to ANSI C specifications with the exception that I use inline functions. This is not compliant to the ANSI spec, but will be compliant to the ANSI C9X spec. It has been successfully running in the MAME project (www.mame.net) for over 2 years and so has had time to mature. LICENSE AND COPYRIGHT: --------------------- The Musashi M680x0 emulator is copyright 1998-2001 Karl Stenerud. The source code included in this archive is provided AS-IS, free for any non-commercial purpose. If you build a program using this core, please give credit to the author. If you wish to use this core in a commercial environment, please contact the author to discuss commercial licensing. AVAILABILITY: ------------ The latest version of this code can be obtained at: http://kstenerud.cjb.net CONTACTING THE AUTHOR: --------------------- I can be reached at kstenerud@mame.net BASIC CONFIGURATION: ------------------- The basic configuration will give you a standard 68000 that has sufficient functionality to work in a primitive environment. This setup assumes that you only have 1 device interrupting it, that the device will always request an autovectored interrupt, and it will always clear the interrupt before the interrupt service routine finishes (but could possibly re-assert the interrupt). You will have only one address space, no tracing, and no instruction prefetch. To implement the basic configuration: - Open m68kconf.h and verify that the settings for INLINE and DECL_SPEC will work with your compiler. (They are set for gcc) - In your host program, implement the following functions: unsigned int m68k_read_memory_8(unsigned int address); unsigned int m68k_read_memory_16(unsigned int address); unsigned int m68k_read_memory_32(unsigned int address); void m68k_write_memory_8(unsigned int address, unsigned int value); void m68k_write_memory_16(unsigned int address, unsigned int value); void m68k_write_memory_32(unsigned int address, unsigned int value); - In your host program, be sure to call m68k_pulse_reset() once before calling any of the other functions as this initializes the core. - Use m68k_execute() to execute instructions and m68k_set_irq() to cause an interrupt. ADDING PROPER INTERRUPT HANDLING: -------------------------------- The interrupt handling in the basic configuration doesn't emulate the interrupt acknowledge phase of the CPU and automatically clears an interrupt request during interrupt processing. While this works for most systems, you may need more accurate interrupt handling. To add proper interrupt handling: - In m68kconf.h, set M68K_EMULATE_INT_ACK to OPT_SPECIFY_HANDLER - In m68kconf.h, set M68K_INT_ACK_CALLBACK(A) to your interrupt acknowledge routine - Your interrupt acknowledge routine must return an interrupt vector, M68K_INT_ACK_AUTOVECTOR, or M68K_INT_ACK_SPURIOUS. most m68k implementations just use autovectored interrupts. - When the interrupting device is satisfied, you must call m68k_set_irq(0) to remove the interrupt request. MULTIPLE INTERRUPTS: ------------------- The above system will work if you have only one device interrupting the CPU, but if you have more than one device, you must do a bit more. To add multiple interrupts: - You must make an interrupt arbitration device that will take the highest priority interrupt and encode it onto the IRQ pins on the CPU. - The interrupt arbitration device should use m68k_set_irq() to set the highest pending interrupt, or 0 for no interrupts pending. SEPARATE IMMEDIATE AND PC-RELATIVE READS: ---------------------------------------- You can write faster memory access functions if you know whether you are fetching from ROM or RAM. Immediate reads are always from the program space (Always in ROM unless it is running self-modifying code). This will also separate the pc-relative reads, since some systems treat PROGRAM mode reads and DATA mode reads differently (for program encryption, for instance). See the section below (ADDRESS SPACE) for an explanation of PROGRAM and DATA mode. To enable separate reads: - In m68kconf.h, turn on M68K_SEPARATE_READS. - In your host program, implement the following functions: unsigned int m68k_read_immediate_16(unsigned int address); unsigned int m68k_read_immediate_32(unsigned int address); unsigned int m68k_read_pcrelative_8(unsigned int address); unsigned int m68k_read_pcrelative_16(unsigned int address); unsigned int m68k_read_pcrelative_32(unsigned int address); - If you need to know the current PC (for banking and such), set M68K_MONITOR_PC to OPT_SPECIFY_HANDLER, and set M68K_SET_PC_CALLBACK(A) to your routine. ADDRESS SPACES: -------------- Most systems will only implement one address space, placing ROM at the lower addresses and RAM at the higher. However, there is the possibility that a system will implement ROM and RAM in the same address range, but in different address spaces, or will have different mamory types that require different handling for the program and the data. The 68k accomodates this by allowing different program spaces, the most important to us being PROGRAM and DATA space. Here is a breakdown of how information is fetched: - All immediate reads are fetched from PROGRAM space. - All PC-relative reads are fetched from PROGRAM space. - The initial stack pointer and program counter are fetched from PROGRAM space. - All other reads (except for those from the moves instruction for 68020) are fetched from DATA space. The m68k deals with this by encoding the requested address space on the function code pins: FC Address Space 210 ------------------ --- USER DATA 001 USER PROGRAM 010 SUPERVISOR DATA 101 SUPERVISOR PROGRAM 110 CPU SPACE 111 <-- not emulated in this core since we emulate interrupt acknowledge in another way. Problems arise here if you need to emulate this distinction (if, for example, your ROM and RAM are at the same address range, with RAM and ROM enable wired to the function code pins). There are 2 ways to deal with this situation using Musashi: 1. If you only need the distinction between PROGRAM and DATA (the most common), you can just separate the reads (see the preceeding section). This is the faster solution. 2. You can emulate the function code pins entirely. To emulate the function code pins: - In m68kconf.h, set M68K_EMULATE_FC to OPT_SPECIFY_HANDLER and set M68K_SET_FC_CALLBACK(A) to your function code handler function. - Your function code handler should select the proper address space for subsequent calls to m68k_read_xx (and m68k_write_xx for 68010+). Note: immediate reads are always done from program space, so technically you don't need to implement the separate immediate reads, although you could gain more speed improvements leaving them in and doing some clever programming. USING DIFFERENT CPU TYPES: ------------------------- The default is to enable only the 68000 cpu type. To change this, change the settings for M68K_EMULATE_010 etc in m68kconf.h. To set the CPU type you want to use: - Make sure it is enabled in m68kconf.h. Current switches are: M68K_EMULATE_010 M68K_EMULATE_EC020 M68K_EMULATE_020 - In your host program, call m68k_set_cpu_type() and then call m68k_pulse_reset(). Valid CPU types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68010, M68K_CPU_TYPE_68EC020, M68K_CPU_TYPE_68020 CLOCK FREQUENCY: --------------- In order to emulate the correct clock frequency, you will have to calculate how long it takes the emulation to execute a certain number of "cycles" and vary your calls to m68k_execute() accordingly. As well, it is a good idea to take away the CPU's timeslice when it writes to a memory-mapped port in order to give the device it wrote to a chance to react. You can use the functions m68k_cycles_run(), m68k_cycles_remaining(), m68k_modify_timeslice(), and m68k_end_timeslice() to do this. Try to use large cycle values in your calls to m68k_execute() since it will increase throughput. You can always take away the timeslice later. MORE CORRECT EMULATION: ---------------------- You may need to enable these in order to properly emulate some of the more obscure functions of the m68k: - M68K_EMULATE_BKPT_ACK causes the CPU to call a breakpoint handler on a BKPT instruction - M68K_EMULATE_TRACE causes the CPU to generate trace exceptions when the trace bits are set - M68K_EMULATE_RESET causes the CPU to call a reset handler on a RESET instruction. - M68K_EMULATE_PREFETCH emulates the 4-word instruction prefetch that is part of the 68000/68010 (needed for Amiga emulation). - call m68k_pulse_halt() to emulate the HALT pin. CONVENIENCE FUNCTIONS: --------------------- These are in here for programmer convenience: - M68K_INSTRUCTION_HOOK lets you call a handler before each instruction. - M68K_LOG_ENABLE and M68K_LOG_1010_1111 lets you log illegal and A/F-line instructions. MULTIPLE CPU EMULATION: ---------------------- The default is to use only one CPU. To use more than one CPU in this core, there are some things to keep in mind: - To have different cpus call different functions, use OPT_ON instead of OPT_SPECIFY_HANDLER, and use the m68k_set_xxx_callback() functions to set your callback handlers on a per-cpu basis. - Be sure to call set_cpu_type() for each CPU you use. - Use m68k_set_context() and m68k_get_context() to switch to another CPU. LOAD AND SAVE CPU CONTEXTS FROM DISK: ------------------------------------ You can use them68k_load_context() and m68k_save_context() functions to load and save the CPU state to disk. GET/SET INFORMATION FROM THE CPU: -------------------------------- You can use m68k_get_reg() and m68k_set_reg() to gain access to the internals of the CPU. EXAMPLE: ------- I have included a file example.zip that contains a full example. core/tremor/codebook.c000664 001750 001750 00000023150 12702465756 016112 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: basic codebook pack/unpack/code/decode operations ********************************************************************/ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codebook.h" #include "misc.h" /* unpacks a codebook from the packet buffer into the codebook struct, readies the codebook auxiliary structures for decode *************/ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){ long i,j; memset(s,0,sizeof(*s)); /* make sure alignment is correct */ if(oggpack_read(opb,24)!=0x564342)goto _eofout; /* first the basic parameters */ s->dim=oggpack_read(opb,16); s->entries=oggpack_read(opb,24); if(s->entries==-1)goto _eofout; /* codeword ordering.... length ordered or unordered? */ switch((int)oggpack_read(opb,1)){ case 0: /* unordered */ s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); /* allocated but unused entries? */ if(oggpack_read(opb,1)){ /* yes, unused entries */ for(i=0;ientries;i++){ if(oggpack_read(opb,1)){ long num=oggpack_read(opb,5); if(num==-1)goto _eofout; s->lengthlist[i]=num+1; }else s->lengthlist[i]=0; } }else{ /* all entries used; no tagging */ for(i=0;ientries;i++){ long num=oggpack_read(opb,5); if(num==-1)goto _eofout; s->lengthlist[i]=num+1; } } break; case 1: /* ordered */ { long length=oggpack_read(opb,5)+1; s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); for(i=0;ientries;){ long num=oggpack_read(opb,_ilog(s->entries-i)); if(num==-1)goto _eofout; for(j=0;jentries;j++,i++) s->lengthlist[i]=length; length++; } } break; default: /* EOF */ return(-1); } /* Do we have a mapping to unpack? */ switch((s->maptype=oggpack_read(opb,4))){ case 0: /* no mapping */ break; case 1: case 2: /* implicitly populated value mapping */ /* explicitly populated value mapping */ s->q_min=oggpack_read(opb,32); s->q_delta=oggpack_read(opb,32); s->q_quant=oggpack_read(opb,4)+1; s->q_sequencep=oggpack_read(opb,1); { int quantvals=0; switch(s->maptype){ case 1: quantvals=_book_maptype1_quantvals(s); break; case 2: quantvals=s->entries*s->dim; break; } /* quantized values */ s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals); for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; } break; default: goto _errout; } /* all set */ return(0); _errout: _eofout: vorbis_staticbook_clear(s); return(-1); } /* the 'eliminate the decode tree' optimization actually requires the codewords to be MSb first, not LSb. This is an annoying inelegancy (and one of the first places where carefully thought out design turned out to be wrong; Vorbis II and future Ogg codecs should go to an MSb bitpacker), but not actually the huge hit it appears to be. The first-stage decode table catches most words so that bitreverse is not in the main execution path. */ static ogg_uint32_t bitreverse(ogg_uint32_t x){ x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); } STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){ int read=book->dec_maxlength; long lo,hi; long lok = oggpack_look(b,book->dec_firsttablen); if (lok >= 0) { long entry = book->dec_firsttable[lok]; if(entry&0x80000000UL){ lo=(entry>>15)&0x7fff; hi=book->used_entries-(entry&0x7fff); }else{ oggpack_adv(b, book->dec_codelengths[entry-1]); return(entry-1); } }else{ lo=0; hi=book->used_entries; } lok = oggpack_look(b, read); while(lok<0 && read>1) lok = oggpack_look(b, --read); if(lok<0){ oggpack_adv(b,1); /* force eop */ return -1; } /* bisect search for the codeword in the ordered list */ { ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); while(hi-lo>1){ long p=(hi-lo)>>1; long test=book->codelist[lo+p]>testword; lo+=p&(test-1); hi-=p&(-test); } if(book->dec_codelengths[lo]<=read){ oggpack_adv(b, book->dec_codelengths[lo]); return(lo); } } oggpack_adv(b, read+1); return(-1); } /* Decode side is specced and easier, because we don't need to find matches using different criteria; we simply read and map. There are two things we need to do 'depending': We may need to support interleave. We don't really, but it's convenient to do it here rather than rebuild the vector later. Cascades may be additive or multiplicitive; this is not inherent in the codebook, but set in the code using the codebook. Like interleaving, it's easiest to do it here. addmul==0 -> declarative (set the value) addmul==1 -> additive addmul==2 -> multiplicitive */ /* returns the [original, not compacted] entry number or -1 on eof *********/ long vorbis_book_decode(codebook *book, oggpack_buffer *b){ if(book->used_entries>0){ long packed_entry=decode_packed_entry_number(book,b); if(packed_entry>=0) return(book->dec_index[packed_entry]); } /* if there's no dec_index, the codebook unpacking isn't collapsed */ return(-1); } /* returns 0 on OK or -1 on eof *************************************/ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ int step=n/book->dim; long *entry = (long *)alloca(sizeof(*entry)*step); ogg_int32_t **t = (ogg_int32_t **)alloca(sizeof(*t)*step); int i,j,o; int shift=point-book->binarypoint; if(shift>=0){ for (i = 0; i < step; i++) { entry[i]=decode_packed_entry_number(book,b); if(entry[i]==-1)return(-1); t[i] = book->valuelist+entry[i]*book->dim; } for(i=0,o=0;idim;i++,o+=step) for (j=0;j>shift; }else{ for (i = 0; i < step; i++) { entry[i]=decode_packed_entry_number(book,b); if(entry[i]==-1)return(-1); t[i] = book->valuelist+entry[i]*book->dim; } for(i=0,o=0;idim;i++,o+=step) for (j=0;jused_entries>0){ int i,j,entry; ogg_int32_t *t; int shift=point-book->binarypoint; if(shift>=0){ for(i=0;ivaluelist+entry*book->dim; for (j=0;jdim;) a[i++]+=t[j++]>>shift; } }else{ for(i=0;ivaluelist+entry*book->dim; for (j=0;jdim;) a[i++]+=t[j++]<<-shift; } } } return(0); } long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ int i,j,entry; ogg_int32_t *t; int shift=point-book->binarypoint; if(shift>=0){ for(i=0;ivaluelist+entry*book->dim; for (j=0;jdim;){ a[i++]=t[j++]>>shift; } } }else{ for(i=0;ivaluelist+entry*book->dim; for (j=0;jdim;){ a[i++]=t[j++]<<-shift; } } } }else{ int i,j; for(i=0;idim;){ a[i++]=0; } } } return(0); } long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,\ long offset,int ch, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ long i,j,entry; int chptr=0; int shift=point-book->binarypoint; if(shift>=0){ for(i=offset;ivaluelist+entry*book->dim; for (j=0;jdim;j++){ a[chptr++][i]+=t[j]>>shift; if(chptr==ch){ chptr=0; i++; } } } } }else{ for(i=offset;ivaluelist+entry*book->dim; for (j=0;jdim;j++){ a[chptr++][i]+=t[j]<<-shift; if(chptr==ch){ chptr=0; i++; } } } } } } return(0); } libretro/msvc/msvc-2010/libretro.def000664 001750 001750 00000001011 12702465756 020335 0ustar00sergiosergio000000 000000 LIBRARY "msvc-2010" EXPORTS retro_set_environment retro_set_video_refresh retro_set_audio_sample retro_set_audio_sample_batch retro_set_input_poll retro_set_input_state retro_init retro_deinit retro_api_version retro_get_system_info retro_get_system_av_info retro_set_controller_port_device retro_reset retro_run retro_serialize_size retro_serialize retro_unserialize retro_cheat_reset retro_cheat_set retro_load_game retro_load_game_special retro_unload_game retro_get_region retro_get_memory_data retro_get_memory_size gx/config.h000664 001750 001750 00000007621 12702465756 013762 0ustar00sergiosergio000000 000000 /**************************************************************************** * config.c * * Genesis Plus GX configuration file support * * Copyright Eke-Eke (2007-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _CONFIG_H_ #define _CONFIG_H_ #define CONFIG_VERSION "GENPLUS-GX 1.7.5" /**************************************************************************** * Config Option * ****************************************************************************/ typedef struct { char version[16]; uint8 hq_fm; uint8 filter; uint8 psgBoostNoise; uint8 dac_bits; uint8 ym2413; uint8 mono; int16 psg_preamp; int16 fm_preamp; int16 low_freq; int16 high_freq; int16 lg; int16 mg; int16 hg; uint32 lp_range; uint8 system; uint8 region_detect; uint8 master_clock; uint8 vdp_mode; uint8 force_dtack; uint8 addr_error; uint8 bios; uint8 lock_on; uint8 hot_swap; uint8 invert_mouse; uint8 gun_cursor[2]; uint8 overscan; uint8 gg_extra; uint8 lcd; uint8 ntsc; uint8 vsync; uint8 render; uint8 tv_mode; uint8 bilinear; uint8 vfilter; uint8 aspect; int16 xshift; int16 yshift; int16 xscale; int16 yscale; #ifdef HW_RVL uint8 trap; float gamma; #else uint8 v_prog; #endif t_input_config input[MAX_INPUTS]; uint16 pad_keymap[4][MAX_KEYS+1]; #ifdef HW_RVL uint32 wpad_keymap[4*3][MAX_KEYS]; uint8 autosleep; int32 calx; int32 caly; #endif uint8 autoload; uint8 autocheat; uint8 s_auto; uint8 s_default; uint8 s_device; uint8 l_device; uint8 bg_overlay; uint8 cd_leds; uint8 fps; int16 screen_w; float bgm_volume; float sfx_volume; char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN]; float ntsc_sharpness; float ntsc_resolution; float ntsc_artifacts; float ntsc_fringing; float ntsc_bleed; char sys_rom[12][256]; } t_config; extern t_config config; extern void config_save(void); extern void config_default(void); #endif /* _CONFIG_H_ */ gx/images/Ctrl_pad6b.png000664 001750 001750 00000003361 12702465756 016274 0ustar00sergiosergio000000 000000 PNG  IHDR,]sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYEIDATxKlUwf:Ph@y >" * Cb+!4,&h…1>&&jܰpe& QC0!** 9.}V/=׽ fƵ>!d8=M3+_kB2`| tg^ 8 8 %0\َFzN`{lK! tR)KY^xc*`x|Kj'tâ$N`KaGNpɲ\ya X|FLEAn"̠/i_% cU R:RP#2LRA 'EO@IENa(iN`E:$ Z008e*v+)ocdVJ_Ix5 "g0“;UX:g!}أ $g%6GFmx~+I g p!`TV7~C^{ͬB@ߡ7xܮ½P#NחrX <_aFp尙+Yw&>3`η * `fg8ޮGGU85>N²nFIENDB`gx/images/Crosshair_p1.png000664 001750 001750 00000003416 12702465756 016652 0ustar00sergiosergio000000 000000 PNG  IHDR,,ZsBIT|d pHYs  ~tEXtCreation Time06/24/08t_ tEXtSoftwareMacromedia Fireworks MX*$bIDATxՙ[lU3IiniЂhI6PmUh%* \ @U ]ƫRЮ@*)H $i4NҒ$ 3I KΜ9g̹|G,ߓ\󩬪v`%P)%x#@ 0<]vPA@$QbMM֭iNLeܵkm{ggӴ@NҔV>mrBf+O9raðjQ`)gV]7@( Wwl-aShi=4M g3/T5ݻY,X[?OfMgOy"S7XS\/BQtaǎ5?c0"ðsgC%'g3 7Bi&]x,adYE曤 sդ`ؙ2p xH}H%.'4[,>ҾO(: ޣ$'`}[wGtQͨ9Mp74:rY?][$;۶C` V&p6mПiԦF=BLoDEH=\B5^ .{ܱ_w+cB7 N5EP\Al, R=dsǔ>X`Җ~dY &!l| Ė$>"4^ p-JAhڵb!ܗ ə0 z8Þ9ƹ/Ly\!|{H]fIY/0 axcȡyF:(ۘv%nT"6n=$$0R9傃4sHI'Zkm`$lӥU2 ]XRXV`Yܞ-LS>)T՞$VA!5g%/yi}'ggZd\h.PϷa](iQjZ\mmDׁgH"&?m]dv ˄&H$|_-H %Ws/N>]]gm̷Yia XؖmG씱| Bc?lp!}1mEeQsjQ#WDTe#ݘ.ʚb2,oՂ?ȴ, ԝLw Mؤ::!.n}0`иN^7<_;ݱߡ7 *,>)PVB<"7\fT60uhrIh !PMG[3FԠGTy#BK~"97ݭzg`>1O5m DcǺLiz{$^,ѕzA݀:W+,=yuQH5%iVQY9"xY!CBS"~y̻\as\ 9`d@W".zT6\&=M7&  6_w7_, ~^ B,iÀ0Q^)xkEF U)SwyeejPqdH. 9C-klUMI; z@"29)x@d7 1N5YrLy&3E-)WHQX,ȑ)ءrJ Z5DC $dmȣ|iyl컄: #Gs G:mnvKzX-~̹F0E"xVJފ@Cj{ݤ2X65|D F x?ik Rϣ9>_>hטUjrv.>I gnSCg /Wl^ 31jDhG?WVMk˳f]{2妧3TCQ03Rcv} !`!p 3񟦛%l1@\Ꜹ'uV ,X_#!D;){fhrx9:lR9ׄƄ&~ w:E; b( +Dy4$jz$;0]lrpu st~ڇeP8O8^$@5Wv+! 7P&;UR3&y^gƬDN6'T'hU~f&RJh.@⾟zR%66+~ejN%#1Gc W;5tXD] ֗x%^i{5Mi`ˎzJg;YT )>j EE8BZ·5%}Z,1@>o_">CM\>RJ%l쇅8M/ ?ۜc^B S"즵i2nSO<}X4HmgE)74A-#4.&ͯÅgE2:!}Tp5ȗR5 2=2 =G ?ǀjQ9d) Q^@3UD6Q[-s)"R)JO " j䴍JZywZnIRM3l1>%) TBF2*y;<9e@ ࿈oB Tc6%l)j;z")W}e⎍Ct9mܧ2wXV?u}Qfb)4,ڵP_9^U.Kw]:t\64LgڽPZA䔣 ŵ[E+٦W$ysN\D.߳rO1Io r]ףAz/ af>Q!B3;dIq\%D.Bx@kzx_py_9z+Y8Tڐ?{@^%MUy@D62 ΀\ Tyԑ߻8n'o,gǩ[QoA]9{eDŽ&&D}q١gU8Ke'' 79d&%bvD}%> 3fIBh'=͑ F,EB;q~sG#P?R݇QM3/}&בM$ k ݵ(|(.!9ZfhF~`}e}&u4m.1EfiZMMl38cƹ8}nN?3@Lе{AL;h> Űiq?i{'a`gQ8=.N‏${ 5I7dG8M#EM'}ZD$té9s9f s 10c3`0ga΀Ü39f s 10c3`0ga΀Ü39f s 10c3`0ga΀I@4m^-m/5m/KE-_mZ|p-պWڶQ_,x8hJ#}9N OoMk{EoK{Q^)^*k%uhF}(G_7Msg>u85uE: $:W!xm۫MӼN;жCy/ 2E i| .oW;o6MJ۶sM+m1 OP.oB#wKf۶?6a4lQƋ!<\;2mQpxW>^m]9"UR\h&W˻ wrܶۥr i&pp|<< 0oױ?QLŶm_bs/Mmۉϋ-^4E9lm{iޟx9}&`U*ҍ5M.'+'\Cb*y _Egs| Ley?csץi?< !ͦiDn6MsmwJuȗ s8L ڶq4WZ: 3W7ڶs8b_R&: IENDB`gx/config.c000664 001750 001750 00000024033 12702465756 013751 0ustar00sergiosergio000000 000000 /**************************************************************************** * config.c * * Genesis Plus GX configuration file support * * Copyright Eke-Eke (2007-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gui.h" #include "file_load.h" t_config config; static int config_load(void) { /* open configuration file */ char fname[MAXPATHLEN]; sprintf (fname, "%s/config.ini", DEFAULT_PATH); FILE *fp = fopen(fname, "rb"); if (fp) { /* check file size */ fseek(fp, 0, SEEK_END); if (ftell(fp) != sizeof(config)) { fclose(fp); return 0; } /* check version */ char version[16]; fseek(fp, 0, SEEK_SET); fread(version, 16, 1, fp); if (memcmp(version,CONFIG_VERSION,16)) { fclose(fp); return 0; } /* read file */ fseek(fp, 0, SEEK_SET); fread(&config, sizeof(config), 1, fp); fclose(fp); return 1; } return 0; } void config_save(void) { /* open configuration file */ char fname[MAXPATHLEN]; sprintf (fname, "%s/config.ini", DEFAULT_PATH); FILE *fp = fopen(fname, "wb"); if (fp) { /* write file */ fwrite(&config, sizeof(config), 1, fp); fclose(fp); } } void config_default(void) { /* version TAG */ strncpy(config.version,CONFIG_VERSION,16); /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 1; config.filter = 1; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.dac_bits = 14; config.ym2413 = 2; /* AUTO */ config.mono = 0; /* system options */ config.system = 0; /* AUTO */ config.region_detect = 0; /* AUTO */ config.vdp_mode = 0; /* AUTO */ config.master_clock = 0; /* AUTO */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; config.hot_swap = 0; /* video options */ config.xshift = 0; config.yshift = 0; config.xscale = 0; config.yscale = 0; config.aspect = 1; config.overscan = 3; /* FULL */ config.gg_extra = 0; config.lcd = 0; config.ntsc = 0; config.vsync = 1; /* AUTO */ config.bilinear = 0; config.vfilter = 1; if (VIDEO_HaveComponentCable()) { config.render = 2; } else { config.render = 0; } switch (vmode->viTVMode >> 2) { case VI_PAL: config.tv_mode = 1; /* 50hz only */ break; case VI_EURGB60: config.tv_mode = 2; /* 50/60hz */ break; default: config.tv_mode = 0; /* 60hz only */ break; } #ifdef HW_RVL config.trap = 0; config.gamma = VI_GM_1_0 / 10.0; #else config.v_prog = 1; #endif /* NTSC filter options */ config.ntsc_sharpness = 0.0; config.ntsc_resolution = 0.0; config.ntsc_artifacts = 0.0; config.ntsc_fringing = 0.0; config.ntsc_bleed = 0.0; /* controllers options */ config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; /* on-screen options */ config.cd_leds = 0; config.fps = 0; /* menu options */ config.autoload = 0; config.autocheat = 0; config.s_auto = 1; config.s_default = 1; config.s_device = 0; config.bg_overlay = 0; config.screen_w = 658; config.bgm_volume = 100.0; config.sfx_volume = 100.0; #ifdef HW_RVL config.autosleep = 1; config.calx = 0; config.caly = 0; #endif /* default ROM directories */ #ifdef HW_RVL DIR *dir = opendir("sd:/"); if (dir) { config.l_device = TYPE_SD; closedir(dir); } else { config.l_device = TYPE_USB; } sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #else config.l_device = TYPE_SD; sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #endif /* system ROM paths */ sprintf (config.sys_rom[0], "%s/bios/bios_CD_U.bin", DEFAULT_PATH); sprintf (config.sys_rom[1], "%s/bios/bios_CD_E.bin", DEFAULT_PATH); sprintf (config.sys_rom[2], "%s/bios/bios_CD_J.bin", DEFAULT_PATH); sprintf (config.sys_rom[3], "%s/bios/bios_MD.bin", DEFAULT_PATH); sprintf (config.sys_rom[4], "%s/bios/bios_U.sms", DEFAULT_PATH); sprintf (config.sys_rom[5], "%s/bios/bios_E.sms", DEFAULT_PATH); sprintf (config.sys_rom[6], "%s/bios/bios_J.sms", DEFAULT_PATH); sprintf (config.sys_rom[7], "%s/bios/bios.gg", DEFAULT_PATH); sprintf (config.sys_rom[8], "%s/lock-on/ggenie.bin", DEFAULT_PATH); sprintf (config.sys_rom[9], "%s/lock-on/areplay.bin", DEFAULT_PATH); sprintf (config.sys_rom[10], "%s/lock-on/sk.bin", DEFAULT_PATH); sprintf (config.sys_rom[11], "%s/lock-on/sk2chip.bin", DEFAULT_PATH); /* try to restore user config */ int loaded = config_load(); #ifdef HW_RVL /* initialize WPAD timeout */ WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800); #else /* check if component cable was detected */ if (VIDEO_HaveComponentCable()) { /* when component cable is detected, libogc automatically enables progressive mode */ /* as preferred video mode but it could still be used on TV not supporting 480p/576p */ PAD_ScanPads(); /* detect progressive mode switch requests */ if (PAD_ButtonsHeld(0) & PAD_BUTTON_B) { /* swap progressive mode enable flag */ config.v_prog ^= 1; /* play some sound to inform user */ ASND_Pause(0); int voice = ASND_GetFirstUnusedVoice(); ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); sleep (2); ASND_Pause(1); } /* check if progressive mode should be disabled */ if (!config.v_prog) { /* switch menu video mode to interlaced */ vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE; VIDEO_Configure(vmode); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); } } #endif /* inform user if default config is used */ if (!loaded) { GUI_WaitPrompt("Warning","Default Settings restored"); gx_input_SetDefault(); } /* default emulated inputs */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = (config.input[1].device != -1) ? SYSTEM_GAMEPAD : NO_SYSTEM; input_init(); } core/system.h000664 001750 001750 00000011065 12702465756 014350 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Virtual System emulation * * Support for 16-bit & 8-bit hardware modes * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _SYSTEM_H_ #define _SYSTEM_H_ #include "blip_buf.h" /* Supported hardware models */ #define SYSTEM_SG 0x10 #define SYSTEM_SGII 0x11 #define SYSTEM_MARKIII 0x12 #define SYSTEM_SMS 0x20 #define SYSTEM_SMS2 0x21 #define SYSTEM_GG 0x40 #define SYSTEM_GGMS 0x41 #define SYSTEM_MD 0x80 #define SYSTEM_PBC 0x81 #define SYSTEM_PICO 0x82 #define SYSTEM_MCD 0x84 /* NTSC & PAL Master Clock frequencies */ #define MCLOCK_NTSC 53693175 #define MCLOCK_PAL 53203424 /* Number of M-Cycles executed per line */ #define MCYCLES_PER_LINE 3420 /* Horizontal timing offsets when running in Z80 mode */ #define SMS_CYCLE_OFFSET 530 #define PBC_CYCLE_OFFSET 560 typedef struct { uint8 *data; /* Bitmap data */ int width; /* Bitmap width */ int height; /* Bitmap height */ int pitch; /* Bitmap pitch */ struct { int x; /* X offset of viewport within bitmap */ int y; /* Y offset of viewport within bitmap */ int w; /* Width of viewport */ int h; /* Height of viewport */ int ow; /* Previous width of viewport */ int oh; /* Previous height of viewport */ int changed; /* 1= Viewport width or height have changed */ } viewport; } t_bitmap; typedef struct { int sample_rate; /* Output Sample rate (8000-48000) */ double frame_rate; /* Output Frame rate (usually 50 or 60 frames per second) */ int enabled; /* 1= sound emulation is enabled */ blip_t* blips[3][2]; /* Blip Buffer resampling */ } t_snd; /* Global variables */ extern t_bitmap bitmap; extern t_snd snd; extern uint32 mcycles_vdp; extern int16 SVP_cycles; extern uint8 system_hw; extern uint8 system_bios; extern uint32 system_clock; /* Function prototypes */ extern int audio_init(int samplerate, double framerate); extern void audio_set_rate(int samplerate, double framerate); extern void audio_reset(void); extern void audio_shutdown(void); extern int audio_update(int16 *buffer); extern void audio_set_equalizer(void); extern void system_init(void); extern void system_reset(void); extern void system_frame_gen(int do_skip); extern void system_frame_scd(int do_skip); extern void system_frame_sms(int do_skip); #endif /* _SYSTEM_H_ */ core/membnk.h000664 001750 001750 00000005661 12702465756 014302 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Z80 bank access to 68k bus * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2012 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _MEMBNK_H_ #define _MEMBNK_H_ extern unsigned int zbank_unused_r(unsigned int address); extern void zbank_unused_w(unsigned int address, unsigned int data); extern unsigned int zbank_lockup_r(unsigned int address); extern void zbank_lockup_w(unsigned int address, unsigned int data); extern unsigned int zbank_read_ctrl_io(unsigned int address); extern void zbank_write_ctrl_io(unsigned int address, unsigned int data); extern unsigned int zbank_read_vdp(unsigned int address); extern void zbank_write_vdp(unsigned int address, unsigned int data); struct _zbank_memory_map { unsigned int (*read)(unsigned int address); void (*write)(unsigned int address, unsigned int data); } zbank_memory_map[256]; #endif /* _MEMBNK_H_ */ core/input_hw/activator.h000664 001750 001750 00000004707 12702465756 016662 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Activator support * * Copyright (C) 2011-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _ACTIVATOR_H_ #define _ACTIVATOR_H_ /* Function prototypes */ extern void activator_reset(int index); extern unsigned char activator_1_read(void); extern unsigned char activator_2_read(void); extern void activator_1_write(unsigned char data, unsigned char mask); extern void activator_2_write(unsigned char data, unsigned char mask); #endif core/cart_hw/ggenie.h000664 001750 001750 00000004636 12702465756 015717 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Game Genie Hardware emulation * * Copyright (C) 2009-2014 Eke-Eke (Genesis Plus GX) * * Based on documentation from Charles McDonald * (http://cgfm2.emuviews.com/txt/genie.txt) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GGENIE_H_ #define _GGENIE_H_ /* Function prototypes */ extern void ggenie_init(void); extern void ggenie_shutdown(void); extern void ggenie_reset(int hard); extern void ggenie_switch(int enable); #endif core/system.c000664 001750 001750 00000105635 12702465756 014352 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Virtual System emulation * * Support for 16-bit & 8-bit hardware modes * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "eq.h" /* Global variables */ t_bitmap bitmap; t_snd snd; uint32 mcycles_vdp; uint8 system_hw; uint8 system_bios; uint32 system_clock; int16 SVP_cycles = 800; static uint8 pause_b; static EQSTATE eq; static int16 llp,rrp; /******************************************************************************************/ /* Audio subsystem */ /******************************************************************************************/ int audio_init(int samplerate, double framerate) { /* Shutdown first */ audio_shutdown(); /* Clear the sound data context */ memset(&snd, 0, sizeof (snd)); /* Initialize Blip Buffers */ snd.blips[0][0] = blip_new(samplerate / 10); snd.blips[0][1] = blip_new(samplerate / 10); if (!snd.blips[0][0] || !snd.blips[0][1]) { audio_shutdown(); return -1; } /* Mega CD sound hardware */ if (system_hw == SYSTEM_MCD) { /* allocate blip buffers */ snd.blips[1][0] = blip_new(samplerate / 10); snd.blips[1][1] = blip_new(samplerate / 10); snd.blips[2][0] = blip_new(samplerate / 10); snd.blips[2][1] = blip_new(samplerate / 10); if (!snd.blips[1][0] || !snd.blips[1][1] || !snd.blips[2][0] || !snd.blips[2][1]) { audio_shutdown(); return -1; } } /* Initialize resampler internal rates */ audio_set_rate(samplerate, framerate); /* Set audio enable flag */ snd.enabled = 1; /* Reset audio */ audio_reset(); return (0); } void audio_set_rate(int samplerate, double framerate) { /* Number of M-cycles executed per second. */ /* All emulated chips are kept in sync by using a common oscillator (MCLOCK) */ /* */ /* The original console would run exactly 53693175 M-cycles per sec (53203424 for PAL), */ /* 3420 M-cycles per line and 262 (313 for PAL) lines per frame, which gives an exact */ /* framerate of 59.92 (49.70 for PAL) frames per second. */ /* */ /* Since audio samples are generated at the end of the frame, to prevent audio skipping */ /* or lag between emulated frames, number of samples rendered per frame must be set to */ /* output samplerate (number of samples played per second) divided by input framerate */ /* (number of frames emulated per seconds). */ /* */ /* On some systems, we may want to achieve 100% smooth video rendering by synchronizing */ /* frame emulation with VSYNC, which frequency is generally not exactly those values. */ /* In that case, input framerate (number of frames emulated per seconds) is the same as */ /* output framerate (number of frames rendered per seconds) by the host video hardware. */ /* */ /* When no framerate is specified, base clock is set to original master clock value. */ /* Otherwise, it is set to number of M-cycles emulated per line (fixed) multiplied by */ /* number of lines per frame (VDP mode specific) multiplied by input framerate. */ /* */ double mclk = framerate ? (MCYCLES_PER_LINE * (vdp_pal ? 313 : 262) * framerate) : system_clock; /* For maximal accuracy, sound chips are running at their original rate using common */ /* master clock timebase so they remain perfectly synchronized together, while still */ /* being synchronized with 68K and Z80 CPUs as well. Mixed sound chip output is then */ /* resampled to desired rate at the end of each frame, using Blip Buffer. */ blip_set_rates(snd.blips[0][0], mclk, samplerate); blip_set_rates(snd.blips[0][1], mclk, samplerate); /* Mega CD sound hardware */ if (system_hw == SYSTEM_MCD) { /* number of SCD master clocks run per second */ mclk = framerate ? (SCYCLES_PER_LINE * (vdp_pal ? 313 : 262) * framerate) : SCD_CLOCK; /* PCM core */ pcm_init(mclk, samplerate); /* CDD core */ cdd_init(samplerate); } /* Reinitialize internal rates */ snd.sample_rate = samplerate; snd.frame_rate = framerate; } void audio_reset(void) { int i,j; /* Clear blip buffers */ for (i=0; i<3; i++) { for (j=0; j<2; j++) { if (snd.blips[i][j]) { blip_clear(snd.blips[i][j]); } } } /* Low-Pass filter */ llp = 0; rrp = 0; /* 3 band EQ */ audio_set_equalizer(); } void audio_set_equalizer(void) { init_3band_state(&eq,config.low_freq,config.high_freq,snd.sample_rate); eq.lg = (double)(config.lg) / 100.0; eq.mg = (double)(config.mg) / 100.0; eq.hg = (double)(config.hg) / 100.0; } void audio_shutdown(void) { int i,j; /* Delete blip buffers */ for (i=0; i<3; i++) { for (j=0; j<2; j++) { blip_delete(snd.blips[i][j]); snd.blips[i][j] = 0; } } } int audio_update(int16 *buffer) { /* run sound chips until end of frame */ int size = sound_update(mcycles_vdp); /* Mega CD specific */ if (system_hw == SYSTEM_MCD) { /* sync PCM chip with other sound chips */ pcm_update(size); /* read CDDA samples */ cdd_read_audio(size); } #ifdef ALIGN_SND /* return an aligned number of samples if required */ size &= ALIGN_SND; #endif /* resample FM & PSG mixed stream to output buffer */ #ifdef LSB_FIRST blip_read_samples(snd.blips[0][0], buffer, size); blip_read_samples(snd.blips[0][1], buffer + 1, size); #else blip_read_samples(snd.blips[0][0], buffer + 1, size); blip_read_samples(snd.blips[0][1], buffer, size); #endif /* Mega CD specific */ if (system_hw == SYSTEM_MCD) { /* resample PCM & CD-DA streams to output buffer */ #ifdef LSB_FIRST blip_mix_samples(snd.blips[1][0], buffer, size); blip_mix_samples(snd.blips[1][1], buffer + 1, size); blip_mix_samples(snd.blips[2][0], buffer, size); blip_mix_samples(snd.blips[2][1], buffer + 1, size); #else blip_mix_samples(snd.blips[1][0], buffer + 1, size); blip_mix_samples(snd.blips[1][1], buffer, size); blip_mix_samples(snd.blips[2][0], buffer + 1, size); blip_mix_samples(snd.blips[2][1], buffer, size); #endif } /* Audio filtering */ if (config.filter) { int samples = size; int16 *out = buffer; int32 l, r; if (config.filter & 1) { /* single-pole low-pass filter (6 dB/octave) */ uint32 factora = config.lp_range; uint32 factorb = 0x10000 - factora; /* restore previous sample */ l = llp; r = rrp; do { /* apply low-pass filter */ l = l*factora + out[0]*factorb; r = r*factora + out[1]*factorb; /* 16.16 fixed point */ l >>= 16; r >>= 16; /* update sound buffer */ *out++ = l; *out++ = r; } while (--samples); /* save last samples for next frame */ llp = l; rrp = r; } else if (config.filter & 2) { do { /* 3 Band EQ */ l = do_3band(&eq,out[0]); r = do_3band(&eq,out[1]); /* clipping (16-bit samples) */ if (l > 32767) l = 32767; else if (l < -32768) l = -32768; if (r > 32767) r = 32767; else if (r < -32768) r = -32768; /* update sound buffer */ *out++ = l; *out++ = r; } while (--samples); } } /* Mono output mixing */ if (config.mono) { int16 out; int samples = size; do { out = (buffer[0] + buffer[1]) / 2; *buffer++ = out; *buffer++ = out; } while (--samples); } #ifdef LOGSOUND error("%d samples returned\n\n",size); #endif return size; } /**************************************************************** * Virtual System emulation ****************************************************************/ void system_init(void) { gen_init(); io_init(); vdp_init(); render_init(); sound_init(); } void system_reset(void) { gen_reset(1); io_reset(); render_reset(); vdp_reset(); sound_reset(); audio_reset(); } void system_frame_gen(int do_skip) { /* line counters */ int start, end, line; /* reset frame cycle counter */ mcycles_vdp = 0; /* reset VDP FIFO */ fifo_write_cnt = 0; fifo_slots = 0; /* check if display setings have changed during previous frame */ if (bitmap.viewport.changed & 2) { /* interlaced modes */ int old_interlaced = interlaced; interlaced = (reg[12] & 0x02) >> 1; if (old_interlaced != interlaced) { /* double resolution mode */ im2_flag = ((reg[12] & 0x06) == 0x06); /* reset field status flag */ odd_frame = interlaced; /* video mode has changed */ bitmap.viewport.changed = 5; /* update rendering mode */ if (reg[1] & 0x04) { if (im2_flag) { render_bg = (reg[11] & 0x04) ? render_bg_m5_im2_vs : render_bg_m5_im2; render_obj = (reg[12] & 0x08) ? render_obj_m5_im2_ste : render_obj_m5_im2; } else { render_bg = (reg[11] & 0x04) ? render_bg_m5_vs : render_bg_m5; render_obj = (reg[12] & 0x08) ? render_obj_m5_ste : render_obj_m5; } } } else { /* clear flag */ bitmap.viewport.changed &= ~2; } /* active screen height */ if (reg[1] & 0x04) { /* Mode 5 */ if (reg[1] & 0x08) { /* 240 active lines */ bitmap.viewport.h = 240; bitmap.viewport.y = (config.overscan & 1) * 24 * vdp_pal; } else { /* 224 active lines */ bitmap.viewport.h = 224; bitmap.viewport.y = (config.overscan & 1) * (8 + (24 * vdp_pal)); } } else { /* Mode 4 (192 active lines) */ bitmap.viewport.h = 192; bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { bitmap.viewport.oh = bitmap.viewport.h; bitmap.viewport.changed |= 1; } } /* initialize VCounter */ v_counter = bitmap.viewport.h; /* first line of overscan */ if (bitmap.viewport.y) { blank_line(v_counter, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* clear DMA Busy, FIFO FULL & field flags */ status &= 0xFEED; /* set VBLANK & FIFO EMPTY flags */ status |= 0x0208; /* check interlaced modes */ if (interlaced) { /* switch even/odd field flag */ odd_frame ^= 1; status |= (odd_frame << 4); } /* run VDP DMA */ if (dma_length) { vdp_dma_update(0); } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* level 4 interrupt */ m68k_update_irq(4); } } /* refresh inputs just before VINT (Warriors of Eternal Sun) */ osd_input_update(); /* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */ m68k_run(588); /* set VINT flag */ status |= 0x80; /* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */ m68k_run(788); if (zstate == 1) { z80_run(788); } else { Z80.cycles = 788; } /* Vertical Interrupt */ vint_pending = 0x20; if (reg[1] & 0x20) { /* level 6 interrupt */ m68k_set_irq(6); } /* assert Z80 interrupt */ Z80.irq_state = ASSERT_LINE; /* run 68k & Z80 until end of line */ m68k_run(MCYCLES_PER_LINE); if (zstate == 1) { z80_run(MCYCLES_PER_LINE); } else { Z80.cycles = MCYCLES_PER_LINE; } /* run SVP chip */ if (svp) { ssp1601_run(SVP_cycles); } /* update VDP cycle count */ mcycles_vdp = MCYCLES_PER_LINE; /* initialize line count */ line = bitmap.viewport.h + 1; /* initialize overscan area */ start = lines_per_frame - bitmap.viewport.y; end = bitmap.viewport.h + bitmap.viewport.y; /* Vertical Blanking */ do { /* update VCounter */ v_counter = line; /* render overscan */ if ((line < end) || (line >= start)) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* update 6-Buttons & Lightguns */ input_refresh(); if (Z80.irq_state) { /* Z80 interrupt is asserted for exactly one line */ m68k_run(mcycles_vdp + 788); if (zstate == 1) { z80_run(mcycles_vdp + 788); } else { Z80.cycles = mcycles_vdp + 788; } /* clear Z80 interrupt */ Z80.irq_state = CLEAR_LINE; } /* run 68k & Z80 until end of line */ m68k_run(mcycles_vdp + MCYCLES_PER_LINE); if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* run SVP chip */ if (svp) { ssp1601_run(SVP_cycles); } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < (lines_per_frame - 1)); /* update VCounter */ v_counter = line; /* last line of overscan */ if (bitmap.viewport.y) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* reload H-Int counter */ h_counter = reg[10]; /* clear VBLANK flag */ status &= ~0x08; /* run VDP DMA */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* parse first line of sprites */ if (reg[1] & 0x40) { parse_satb(-1); } /* update 6-Buttons & Lightguns */ input_refresh(); /* run 68k & Z80 until end of line */ m68k_run(mcycles_vdp + MCYCLES_PER_LINE); if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* run SVP chip */ if (svp) { ssp1601_run(SVP_cycles); } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; /* reset line count */ line = 0; /* Active Display */ do { /* update VCounter */ v_counter = line; /* run VDP DMA */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* render scanline */ if (!do_skip) { render_line(line); } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* reload H-Int counter */ h_counter = reg[10]; /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* level 4 interrupt */ m68k_update_irq(4); } } else { /* decrement H-Int counter */ h_counter--; } /* run 68k & Z80 until end of line */ m68k_run(mcycles_vdp + MCYCLES_PER_LINE); if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* run SVP chip */ if (svp) { ssp1601_run(SVP_cycles); } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < bitmap.viewport.h); /* check viewport changes */ if (bitmap.viewport.w != bitmap.viewport.ow) { bitmap.viewport.ow = bitmap.viewport.w; bitmap.viewport.changed |= 1; } /* adjust timings for next frame */ input_end_frame(mcycles_vdp); m68k.cycles -= mcycles_vdp; Z80.cycles -= mcycles_vdp; } void system_frame_scd(int do_skip) { /* line counters */ int start, end, line; /* reset frame cycle counter */ mcycles_vdp = 0; scd.cycles = 0; /* reset VDP FIFO */ fifo_write_cnt = 0; fifo_slots = 0; /* check if display setings have changed during previous frame */ if (bitmap.viewport.changed & 2) { /* interlaced modes */ int old_interlaced = interlaced; interlaced = (reg[12] & 0x02) >> 1; if (old_interlaced != interlaced) { /* double resolution mode */ im2_flag = ((reg[12] & 0x06) == 0x06); /* reset field status flag */ odd_frame = interlaced; /* video mode has changed */ bitmap.viewport.changed = 5; /* update rendering mode */ if (reg[1] & 0x04) { if (im2_flag) { render_bg = (reg[11] & 0x04) ? render_bg_m5_im2_vs : render_bg_m5_im2; render_obj = (reg[12] & 0x08) ? render_obj_m5_im2_ste : render_obj_m5_im2; } else { render_bg = (reg[11] & 0x04) ? render_bg_m5_vs : render_bg_m5; render_obj = (reg[12] & 0x08) ? render_obj_m5_ste : render_obj_m5; } } } else { /* clear flag */ bitmap.viewport.changed &= ~2; } /* active screen height */ if (reg[1] & 0x04) { /* Mode 5 */ if (reg[1] & 0x08) { /* 240 active lines */ bitmap.viewport.h = 240; bitmap.viewport.y = (config.overscan & 1) * 24 * vdp_pal; } else { /* 224 active lines */ bitmap.viewport.h = 224; bitmap.viewport.y = (config.overscan & 1) * (8 + (24 * vdp_pal)); } } else { /* Mode 4 (192 active lines) */ bitmap.viewport.h = 192; bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { bitmap.viewport.oh = bitmap.viewport.h; bitmap.viewport.changed |= 1; } } /* initialize VCounter */ v_counter = bitmap.viewport.h; /* first line of overscan */ if (bitmap.viewport.y) { blank_line(v_counter, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* clear DMA Busy, FIFO FULL & field flags */ status &= 0xFEED; /* set VBLANK & FIFO EMPTY flags */ status |= 0x0208; /* check interlaced modes */ if (interlaced) { /* switch even/odd field flag */ odd_frame ^= 1; status |= (odd_frame << 4); } /* run VDP DMA */ if (dma_length) { vdp_dma_update(0); } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* level 4 interrupt */ m68k_update_irq(4); } } /* refresh inputs just before VINT */ osd_input_update(); /* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */ m68k_run(588); /* set VINT flag */ status |= 0x80; /* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */ m68k_run(788); if (zstate == 1) { z80_run(788); } else { Z80.cycles = 788; } /* Vertical Interrupt */ vint_pending = 0x20; if (reg[1] & 0x20) { /* level 6 interrupt */ m68k_set_irq(6); } /* assert Z80 interrupt */ Z80.irq_state = ASSERT_LINE; /* run both 68k & CD hardware until end of line */ scd_update(MCYCLES_PER_LINE); /* run Z80 until end of line */ if (zstate == 1) { z80_run(MCYCLES_PER_LINE); } else { Z80.cycles = MCYCLES_PER_LINE; } /* update VDP cycle count */ mcycles_vdp = MCYCLES_PER_LINE; /* initialize line count */ line = bitmap.viewport.h + 1; /* initialize overscan area */ start = lines_per_frame - bitmap.viewport.y; end = bitmap.viewport.h + bitmap.viewport.y; /* Vertical Blanking */ do { /* update VCounter */ v_counter = line; /* render overscan */ if ((line < end) || (line >= start)) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* update 6-Buttons & Lightguns */ input_refresh(); if (Z80.irq_state) { /* Z80 interrupt is asserted for exactly one line */ m68k_run(mcycles_vdp + 788); if (zstate == 1) { z80_run(mcycles_vdp + 788); } else { Z80.cycles = mcycles_vdp + 788; } /* clear Z80 interrupt */ Z80.irq_state = CLEAR_LINE; } /* run both 68k & CD hardware until end of line */ scd_update(mcycles_vdp + MCYCLES_PER_LINE); /* run Z80 until end of line */ if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < (lines_per_frame - 1)); /* update VCounter */ v_counter = line; /* last line of overscan */ if (bitmap.viewport.y) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* reload H-Int counter */ h_counter = reg[10]; /* clear VBLANK flag */ status &= ~0x08; /* run VDP DMA */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* parse first line of sprites */ if (reg[1] & 0x40) { parse_satb(-1); } /* update 6-Buttons & Lightguns */ input_refresh(); /* run both 68k & CD hardware until end of line */ scd_update(mcycles_vdp + MCYCLES_PER_LINE); /* run Z80 until end of line */ if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; /* reset line count */ line = 0; /* Active Display */ do { /* update VCounter */ v_counter = line; /* run VDP DMA */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* render scanline */ if (!do_skip) { render_line(line); } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* reload H-Int counter */ h_counter = reg[10]; /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* level 4 interrupt */ m68k_update_irq(4); } } else { /* decrement H-Int counter */ h_counter--; } /* run both 68k & CD hardware until end of line */ scd_update(mcycles_vdp + MCYCLES_PER_LINE); /* run Z80 until end of line */ if (zstate == 1) { z80_run(mcycles_vdp + MCYCLES_PER_LINE); } else { Z80.cycles = mcycles_vdp + MCYCLES_PER_LINE; } /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < bitmap.viewport.h); /* check viewport changes */ if (bitmap.viewport.w != bitmap.viewport.ow) { bitmap.viewport.ow = bitmap.viewport.w; bitmap.viewport.changed |= 1; } /* adjust timings for next frame */ scd_end_frame(scd.cycles); input_end_frame(mcycles_vdp); m68k.cycles -= mcycles_vdp; Z80.cycles -= mcycles_vdp; } void system_frame_sms(int do_skip) { /* line counter */ int start, end, line; /* reset frame cycle count */ mcycles_vdp = 0; /* reset VDP FIFO */ fifo_write_cnt = 0; fifo_slots = 0; /* check if display settings has changed during previous frame */ if (bitmap.viewport.changed & 2) { bitmap.viewport.changed &= ~2; if (system_hw & SYSTEM_MD) { /* interlaced modes */ int old_interlaced = interlaced; interlaced = (reg[12] & 0x02) >> 1; if (old_interlaced != interlaced) { /* double resolution mode */ im2_flag = ((reg[12] & 0x06) == 0x06); /* reset field status flag */ odd_frame = interlaced; /* video mode has changed */ bitmap.viewport.changed = 5; /* update rendering mode */ if (reg[1] & 0x04) { if (im2_flag) { render_bg = (reg[11] & 0x04) ? render_bg_m5_im2_vs : render_bg_m5_im2; render_obj = (reg[12] & 0x08) ? render_obj_m5_im2_ste : render_obj_m5_im2; } else { render_bg = (reg[11] & 0x04) ? render_bg_m5_vs : render_bg_m5; render_obj = (reg[12] & 0x08) ? render_obj_m5_ste : render_obj_m5; } } } /* active screen height */ if (reg[1] & 0x04) { /* Mode 5 */ if (reg[1] & 0x08) { /* 240 active lines */ bitmap.viewport.h = 240; bitmap.viewport.y = (config.overscan & 1) * 24 * vdp_pal; } else { /* 224 active lines */ bitmap.viewport.h = 224; bitmap.viewport.y = (config.overscan & 1) * (8 + (24 * vdp_pal)); } } else { bitmap.viewport.h = 192; bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } } else { /* check for VDP extended modes */ int mode = (reg[0] & 0x06) | (reg[1] & 0x18); /* update active height */ if (mode == 0x0E) { bitmap.viewport.h = 240; } else if (mode == 0x16) { bitmap.viewport.h = 224; } else { bitmap.viewport.h = 192; } /* update vertical overscan */ if (config.overscan & 1) { bitmap.viewport.y = (240 + 48*vdp_pal - bitmap.viewport.h) >> 1; } else { if ((system_hw == SYSTEM_GG) && !config.gg_extra) { /* Display area reduced to 160x144 */ bitmap.viewport.y = (144 - bitmap.viewport.h) / 2; } else { bitmap.viewport.y = 0; } } } /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { bitmap.viewport.oh = bitmap.viewport.h; bitmap.viewport.changed |= 1; } } /* initialize VCounter */ v_counter = bitmap.viewport.h; /* first line of overscan */ if (bitmap.viewport.y > 0) { blank_line(v_counter, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* Mega Drive VDP specific */ if (system_hw & SYSTEM_MD) { /* clear DMA Busy & field flags */ status &= 0xED; /* set VBLANK flag */ status |= 0x08; /* interlaced modes only */ if (interlaced) { /* switch even/odd field flag */ odd_frame ^= 1; status |= (odd_frame << 4); } /* run VDP DMA */ if (dma_length) { vdp_dma_update(0); } } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* Cycle-accurate HINT */ /* IRQ line is latched between instructions, during instruction last cycle. */ /* This means that if Z80 cycle count is exactly a multiple of MCYCLES_PER_LINE, */ /* interrupt should be triggered AFTER the next instruction. */ if ((Z80.cycles % MCYCLES_PER_LINE) == 0) { z80_run(Z80.cycles + 1); } /* Z80 interrupt */ Z80.irq_state = ASSERT_LINE; } } /* refresh inputs just before VINT */ osd_input_update(); /* run Z80 until end of line */ z80_run(MCYCLES_PER_LINE); /* make sure VINT flag was not read (then cleared) by last instruction */ if (v_counter == bitmap.viewport.h) { /* Set VINT flag */ status |= 0x80; /* Vertical Interrupt */ vint_pending = 0x20; if (reg[1] & 0x20) { Z80.irq_state = ASSERT_LINE; } } /* update VDP cycle count */ mcycles_vdp = MCYCLES_PER_LINE; /* initialize line count */ line = bitmap.viewport.h + 1; /* initialize overscan area */ start = lines_per_frame - bitmap.viewport.y; end = bitmap.viewport.h + bitmap.viewport.y; /* Vertical Blanking */ do { /* update VCounter */ v_counter = line; /* Master System & Game Gear VDP specific */ if ((system_hw < SYSTEM_MD) && (line > (lines_per_frame - 16))) { /* Sprites are still processed during top border */ render_obj((line - lines_per_frame) & 1); parse_satb(line - lines_per_frame); } /* render overscan */ if ((line < end) || (line >= start)) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* update 6-Buttons & Lightguns */ input_refresh(); /* run Z80 until end of line */ z80_run(mcycles_vdp + MCYCLES_PER_LINE); /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < (lines_per_frame - 1)); /* update VCounter */ v_counter = line; /* last line of overscan */ if (bitmap.viewport.y > 0) { blank_line(line, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x); } /* reload H-Int counter */ h_counter = reg[10]; /* Detect pause button input (in Game Gear Mode, NMI is not generated) */ if (system_hw != SYSTEM_GG) { if (input.pad[0] & INPUT_START) { /* NMI is edge-triggered */ if (!pause_b) { pause_b = 1; z80_set_nmi_line(ASSERT_LINE); z80_set_nmi_line(CLEAR_LINE); } } else { pause_b = 0; } } /* 3-D glasses faking: skip rendering of left lens frame */ do_skip |= (work_ram[0x1ffb] & cart.special & HW_3D_GLASSES); /* Mega Drive VDP specific */ if (system_hw & SYSTEM_MD) { /* clear VBLANK flag */ status &= ~0x08; /* run VDP DMA */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* parse first line of sprites */ if (reg[1] & 0x40) { parse_satb(-1); } } /* Master System & Game Gear VDP specific */ else { /* Sprites are still processed during vertical borders */ if (reg[1] & 0x40) { render_obj(1); } /* Sprites pre-processing occurs even when display is disabled */ parse_satb(-1); } /* update 6-Buttons & Lightguns */ input_refresh(); /* run Z80 until end of line */ z80_run(mcycles_vdp + MCYCLES_PER_LINE); /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; /* latch Vertical Scroll register */ vscroll = reg[9]; /* reset line count */ line = 0; /* Active Display */ do { /* run VDP DMA (Mega Drive VDP specific) */ if (dma_length) { vdp_dma_update(mcycles_vdp); } /* make sure that line has not already been rendered */ if (v_counter != line) { /* update VCounter */ v_counter = line; /* render scanline */ if (!do_skip) { render_line(line); } } /* update 6-Buttons & Lightguns */ input_refresh(); /* H-Int counter */ if (h_counter == 0) { /* reload H-Int counter */ h_counter = reg[10]; /* Horizontal Interrupt is pending */ hint_pending = 0x10; if (reg[0] & 0x10) { /* Cycle-accurate HINT */ /* IRQ line is latched between instructions, during instruction last cycle. */ /* This means that if Z80 cycle count is exactly a multiple of MCYCLES_PER_LINE, */ /* interrupt should be triggered AFTER the next instruction. */ if ((Z80.cycles % MCYCLES_PER_LINE) == 0) { z80_run(Z80.cycles + 1); } /* assert Z80 interrupt */ Z80.irq_state = ASSERT_LINE; } } else { /* decrement H-Int counter */ h_counter--; } /* run Z80 until end of line */ z80_run(mcycles_vdp + MCYCLES_PER_LINE); /* update VDP cycle count */ mcycles_vdp += MCYCLES_PER_LINE; } while (++line < bitmap.viewport.h); /* check viewport changes */ if (bitmap.viewport.w != bitmap.viewport.ow) { bitmap.viewport.ow = bitmap.viewport.w; bitmap.viewport.changed |= 1; } /* adjust timings for next frame */ input_end_frame(mcycles_vdp); Z80.cycles -= mcycles_vdp; } core/membnk.c000664 001750 001750 00000017034 12702465756 014272 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Z80 bank access to 68k bus * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /* Handlers for access to unused addresses and those which make the machine lock up. */ unsigned int zbank_unused_r(unsigned int address) { #ifdef LOGERROR error("Z80 bank unused read %06X (%x)\n", address, Z80.pc.d); #endif return 0xFF; } void zbank_unused_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("Z80 bank unused write %06X = %02X (%x)\n", address, data, Z80.pc.d); #endif } unsigned int zbank_lockup_r(unsigned int address) { #ifdef LOGERROR error("Z80 bank lockup read %06X (%x)\n", address, Z80.pc.d); #endif if (!config.force_dtack) { Z80.cycles = 0xFFFFFFFF; zstate = 0; } return 0xFF; } void zbank_lockup_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("Z80 bank lockup write %06X = %02X (%x)\n", address, data, Z80.pc.d); #endif if (!config.force_dtack) { Z80.cycles = 0xFFFFFFFF; zstate = 0; } } /* I/O & Control registers */ unsigned int zbank_read_ctrl_io(unsigned int address) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { if (!(address & 0xE0)) { return (io_68k_read((address >> 1) & 0x0F)); } return zbank_unused_r(address); } case 0x11: /* BUSACK */ { if (address & 1) { return zbank_unused_r(address); } return 0xFF; } case 0x30: /* TIME */ { if (cart.hw.time_r) { unsigned int data = cart.hw.time_r(address); if (address & 1) { return (data & 0xFF); } return (data >> 8); } return zbank_unused_r(address); } case 0x41: /* OS ROM */ { if (address & 1) { return (gen_bankswitch_r() | 0xFE); } return zbank_unused_r(address); } case 0x10: /* MEMORY MODE */ case 0x12: /* RESET */ case 0x20: /* MEGA-CD */ case 0x40: /* TMSS */ case 0x44: /* RADICA */ case 0x50: /* SVP REGISTERS */ { return zbank_unused_r(address); } default: /* Invalid address */ { return zbank_lockup_r(address); } } } void zbank_write_ctrl_io(unsigned int address, unsigned int data) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { /* get /LWR only */ if ((address & 0xE1) == 0x01) { io_68k_write((address >> 1) & 0x0F, data); return; } zbank_unused_w(address, data); return; } case 0x11: /* BUSREQ */ { if (!(address & 1)) { gen_zbusreq_w(data & 1, Z80.cycles); return; } zbank_unused_w(address, data); return; } case 0x12: /* RESET */ { if (!(address & 1)) { gen_zreset_w(data & 1, Z80.cycles); return; } zbank_unused_w(address, data); return; } case 0x30: /* TIME */ { cart.hw.time_w(address, data); return; } case 0x41: /* OS ROM */ { if ((config.bios & 1) && (address & 1)) { gen_bankswitch_w(data & 1); return; } zbank_unused_w(address, data); return; } case 0x10: /* MEMORY MODE */ case 0x20: /* MEGA-CD */ case 0x40: /* TMSS */ case 0x44: /* RADICA */ case 0x50: /* SVP REGISTERS */ { zbank_unused_w(address, data); return; } default: /* Invalid address */ { zbank_lockup_w(address, data); return; } } } /* VDP */ unsigned int zbank_read_vdp(unsigned int address) { switch (address & 0xFD) { case 0x00: /* DATA */ { return (vdp_68k_data_r() >> 8); } case 0x01: /* DATA */ { return (vdp_68k_data_r() & 0xFF); } case 0x04: /* CTRL */ { return (((vdp_68k_ctrl_r(Z80.cycles) >> 8) & 3) | 0xFC); } case 0x05: /* CTRL */ { return (vdp_68k_ctrl_r(Z80.cycles) & 0xFF); } case 0x08: /* HVC */ case 0x0C: { return (vdp_hvc_r(Z80.cycles) >> 8); } case 0x09: /* HVC */ case 0x0D: { return (vdp_hvc_r(Z80.cycles) & 0xFF); } case 0x18: /* Unused */ case 0x19: case 0x1C: case 0x1D: { return zbank_unused_r(address); } default: /* Invalid address */ { return zbank_lockup_r(address); } } } void zbank_write_vdp(unsigned int address, unsigned int data) { switch (address & 0xFC) { case 0x00: /* Data port */ { vdp_68k_data_w(data << 8 | data); return; } case 0x04: /* Control port */ { vdp_68k_ctrl_w(data << 8 | data); return; } case 0x10: /* PSG */ case 0x14: { if (address & 1) { SN76489_Write(Z80.cycles, data); return; } zbank_unused_w(address, data); return; } case 0x18: /* Unused */ { zbank_unused_w(address, data); return; } case 0x1C: /* TEST register */ { vdp_test_w(data << 8 | data); return; } default: /* Invalid address */ { zbank_lockup_w(address, data); return; } } } core/input_hw/activator.c000664 001750 001750 00000007770 12702465756 016660 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Activator support * * Copyright (C) 2011-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; uint8 Counter; } activator[2]; void activator_reset(int index) { activator[index].State = 0x40; activator[index].Counter = 0; } INLINE unsigned char activator_read(int index) { /* IR sensors 1-16 data (active low) */ uint16 data = ~input.pad[index << 2]; /* D1 = D0 (data is ready) */ uint8 temp = (activator[index].State & 0x01) << 1; switch (activator[index].Counter) { case 0: /* x x x x 0 1 0 0 */ temp |= 0x04; break; case 1: /* x x l1 l2 l3 l4 1 1 */ temp |= ((data << 2) & 0x3C); break; case 2: /* x x l5 l6 l7 l8 0 0 */ temp |= ((data >> 2) & 0x3C); break; case 3: /* x x h1 h2 h3 h4 1 1 */ temp |= ((data >> 6) & 0x3C); break; case 4: /* x x h5 h6 h7 h8 0 0 */ temp |= ((data >> 10) & 0x3C); break; } return temp; } INLINE void activator_write(int index, unsigned char data, unsigned char mask) { /* update bits set as output only */ data = (activator[index].State & ~mask) | (data & mask); /* TH transitions */ if ((activator[index].State ^ data) & 0x40) { /* reset sequence cycle */ activator[index].Counter = 0; } else { /* D0 transitions */ if ((activator[index].State ^ data) & 0x01) { /* increment sequence cycle */ if (activator[index].Counter < 4) { activator[index].Counter++; } } } /* update internal state */ activator[index].State = data; } unsigned char activator_1_read(void) { return activator_read(0); } unsigned char activator_2_read(void) { return activator_read(1); } void activator_1_write(unsigned char data, unsigned char mask) { activator_write(0, data, mask); } void activator_2_write(unsigned char data, unsigned char mask) { activator_write(1, data, mask); } core/cart_hw/ggenie.c000664 001750 001750 00000020616 12702465756 015706 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Game Genie Hardware emulation * * Copyright (C) 2009-2014 Eke-Eke (Genesis Plus GX) * * Based on documentation from Charles McDonald * (http://cgfm2.emuviews.com/txt/genie.txt) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 enabled; uint8 *rom; uint16 regs[0x20]; uint16 old[6]; uint16 data[6]; uint32 addr[6]; } ggenie; static unsigned int ggenie_read_byte(unsigned int address); static unsigned int ggenie_read_word(unsigned int address); static void ggenie_write_byte(unsigned int address, unsigned int data); static void ggenie_write_word(unsigned int address, unsigned int data); static void ggenie_write_regs(unsigned int offset, unsigned int data); void ggenie_init(void) { memset(&ggenie,0,sizeof(ggenie)); /* Store Game Genie ROM (32k) above cartridge ROM + SRAM area */ if (cart.romsize > 0x810000) return; ggenie.rom = cart.rom + 0x810000; /* Try to load Game Genie ROM file */ if (load_archive(GG_ROM, ggenie.rom, 0x8000, NULL) > 0) { #ifdef LSB_FIRST int i; for (i=0; i<0x8000; i+=2) { /* Byteswap ROM */ uint8 temp = ggenie.rom[i]; ggenie.rom[i] = ggenie.rom[i+1]; ggenie.rom[i+1] = temp; } #endif /* $0000-$7fff mirrored into $8000-$ffff */ memcpy(ggenie.rom + 0x8000, ggenie.rom, 0x8000); /* Game Genie hardware is enabled */ ggenie.enabled = 1; } } void ggenie_shutdown(void) { if (ggenie.enabled) { ggenie_switch(0); ggenie.enabled = 0; } } void ggenie_reset(int hard) { if (ggenie.enabled) { if (hard) { /* clear codes */ ggenie_switch(0); /* reset internal state */ memset(ggenie.regs,0,sizeof(ggenie.regs)); memset(ggenie.old,0,sizeof(ggenie.old)); memset(ggenie.data,0,sizeof(ggenie.data)); memset(ggenie.addr,0,sizeof(ggenie.addr)); } /* Game Genie ROM is mapped at $000000-$007fff */ m68k.memory_map[0].base = ggenie.rom; /* Internal registers are mapped at $000000-$00001f */ m68k.memory_map[0].write8 = ggenie_write_byte; m68k.memory_map[0].write16 = ggenie_write_word; /* Disable registers reads */ m68k.memory_map[0].read16 = NULL; } } void ggenie_switch(int enable) { int i; if (enable) { /* enable cheats */ for (i=0; i<6; i++) { /* patch is enabled ? */ if (ggenie.regs[0] & (1 << i)) { /* save old value and patch ROM if enabled */ ggenie.old[i] = *(uint16 *)(cart.rom + ggenie.addr[i]); *(uint16 *)(cart.rom + ggenie.addr[i]) = ggenie.data[i]; } } } else { /* disable cheats in reversed order in case the same address is used by multiple patches */ for (i=5; i>=0; i--) { /* patch is enabled ? */ if (ggenie.regs[0] & (1 << i)) { /* restore original ROM value */ *(uint16 *)(cart.rom + ggenie.addr[i]) = ggenie.old[i]; } } } } static unsigned int ggenie_read_byte(unsigned int address) { unsigned int data = ggenie.regs[(address >> 1) & 0x1f]; return ((address & 1) ? (data & 0xff) : ((data >> 8) & 0xff)); } static unsigned int ggenie_read_word(unsigned int address) { return ggenie.regs[(address >> 1) & 0x1f]; } static void ggenie_write_byte(unsigned int address, unsigned int data) { /* Register offset */ uint8 offset = (address >> 1) & 0x1f; /* /LWR and /UWR are used to decode writes */ if (address & 1) { data = (ggenie.regs[offset] & 0xff00) | (data & 0xff); } else { data = (ggenie.regs[offset] & 0x00ff) | ((data & 0xff) << 8); } /* Update internal register */ ggenie_write_regs(offset,data); } static void ggenie_write_word(unsigned int address, unsigned int data) { /* Register offset */ uint8 offset = (address >> 1) & 0x1f; /* Write internal register (full WORD) */ ggenie_write_regs(offset,data); } static void ggenie_write_regs(unsigned int offset, unsigned int data) { /* update internal register */ ggenie.regs[offset] = data; /* Mode Register */ if (offset == 0) { /* MODE bit */ if (data & 0x400) { /* $0000-$7ffff reads mapped to Cartridge ROM */ m68k.memory_map[0].base = cart.rom; m68k.memory_map[0].read8 = NULL; m68k.memory_map[0].read16 = NULL; } else { /* $0000-$7ffff reads mapped to Game Genie ROM */ m68k.memory_map[0].base = ggenie.rom; m68k.memory_map[0].read8 = NULL; m68k.memory_map[0].read16 = NULL; /* READ_ENABLE bit */ if (data & 0x200) { /* $0000-$7ffff reads mapped to Game Genie Registers */ /* code doing this should execute in RAM so we don't need to modify base address */ m68k.memory_map[0].read8 = ggenie_read_byte; m68k.memory_map[0].read16 = ggenie_read_word; } } /* LOCK bit */ if (data & 0x100) { /* decode patch address (ROM area only)*/ /* note: Charles's doc is wrong, first register holds bits 23-16 of patch address */ ggenie.addr[0] = ((ggenie.regs[2] & 0x3f) << 16) | ggenie.regs[3]; ggenie.addr[1] = ((ggenie.regs[5] & 0x3f) << 16) | ggenie.regs[6]; ggenie.addr[2] = ((ggenie.regs[8] & 0x3f) << 16) | ggenie.regs[9]; ggenie.addr[3] = ((ggenie.regs[11] & 0x3f) << 16) | ggenie.regs[12]; ggenie.addr[4] = ((ggenie.regs[14] & 0x3f) << 16) | ggenie.regs[15]; ggenie.addr[5] = ((ggenie.regs[17] & 0x3f) << 16) | ggenie.regs[18]; /* decode patch data */ ggenie.data[0] = ggenie.regs[4]; ggenie.data[1] = ggenie.regs[7]; ggenie.data[2] = ggenie.regs[10]; ggenie.data[3] = ggenie.regs[13]; ggenie.data[4] = ggenie.regs[16]; ggenie.data[5] = ggenie.regs[19]; /* disable internal registers */ m68k.memory_map[0].write8 = m68k_unused_8_w; m68k.memory_map[0].write16 = m68k_unused_16_w; /* patch ROM when GG program exits (LOCK bit set) */ /* this is done here to handle patched program reads faster & more easily */ /* on real HW, address decoding would be done on each reads */ ggenie_switch(1); } else { m68k.memory_map[0].write8 = ggenie_write_byte; m68k.memory_map[0].write16 = ggenie_write_word; } } /* RESET register */ else if (offset == 1) { ggenie.regs[1] |= 1; } } core/macros.h000664 001750 001750 00000003477 12702465756 014320 0ustar00sergiosergio000000 000000 #ifndef _MACROS_H_ #define _MACROS_H_ #ifdef LSB_FIRST #define READ_BYTE(BASE, ADDR) (BASE)[(ADDR)^1] #define READ_WORD(BASE, ADDR) (((BASE)[ADDR]<<8) | (BASE)[(ADDR)+1]) #define READ_WORD_LONG(BASE, ADDR) (((BASE)[(ADDR)+1]<<24) | \ ((BASE)[(ADDR)]<<16) | \ ((BASE)[(ADDR)+3]<<8) | \ (BASE)[(ADDR)+2]) #define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[(ADDR)^1] = (VAL)&0xff #define WRITE_WORD(BASE, ADDR, VAL) (BASE)[ADDR] = ((VAL)>>8) & 0xff; \ (BASE)[(ADDR)+1] = (VAL)&0xff #define WRITE_WORD_LONG(BASE, ADDR, VAL) (BASE)[(ADDR+1)] = ((VAL)>>24) & 0xff; \ (BASE)[(ADDR)] = ((VAL)>>16)&0xff; \ (BASE)[(ADDR+3)] = ((VAL)>>8)&0xff; \ (BASE)[(ADDR+2)] = (VAL)&0xff #else #define READ_BYTE(BASE, ADDR) (BASE)[ADDR] #define READ_WORD(BASE, ADDR) *(uint16 *)((BASE) + (ADDR)) #define READ_WORD_LONG(BASE, ADDR) *(uint32 *)((BASE) + (ADDR)) #define WRITE_BYTE(BASE, ADDR, VAL) (BASE)[ADDR] = VAL & 0xff #define WRITE_WORD(BASE, ADDR, VAL) *(uint16 *)((BASE) + (ADDR)) = VAL & 0xffff #define WRITE_WORD_LONG(BASE, ADDR, VAL) *(uint32 *)((BASE) + (ADDR)) = VAL & 0xffffffff #endif /* C89 compatibility */ #ifndef M_PI #define M_PI 3.14159265358979323846264338327f #endif /* M_PI */ /* Set to your compiler's static inline keyword to enable it, or * set it to blank to disable it. * If you define INLINE in the makefile, it will override this value. * NOTE: not enabling inline functions will SEVERELY slow down emulation. */ #ifndef INLINE #define INLINE static __inline__ #endif /* INLINE */ #endif /* _MACROS_H_ */ gcw0/Makefile000664 001750 001750 00000012710 12702465756 014221 0ustar00sergiosergio000000 000000 # Makefile for genplus SDL GCW0 # # (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald # modified by Eke-Eke # # Defines : # -DLSB_FIRST : for little endian systems. # -DLOGERROR : enable message logging # -DLOGVDP : enable VDP debug messages # -DLOGSOUND : enable AUDIO debug messages # -DLOG_SCD : enable SCD debug messages # -DLOG_CDD : enable CDD debug messages # -DLOG_CDC : enable CDC debug messages # -DLOG_PCM : enable PCM debug messages # -DLOGSOUND : enable AUDIO debug messages # -D8BPP_RENDERING - configure for 8-bit pixels (RGB332) # -D15BPP_RENDERING - configure for 15-bit pixels (RGB555) # -D16BPP_RENDERING - configure for 16-bit pixels (RGB565) # -D32BPP_RENDERING - configure for 32-bit pixels (RGB888) NAME = gen_gcw0 SDL-CONFIG = /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config CC = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-gcc #CFLAGS = `$(SDL-CONFIG) --cflags` -03 -fomit-frame-pointer -Wall -ansi -std=c99 #CFLAGS = `sdl-config --cflags` -O6 -fomit-frame-pointer -Wall -Wno-strict-aliasing -ansi -std=c99 CFLAGS = `$(SDL-CONFIG) --cflags` -O3 -fomit-frame-pointer -Wall -ansi -std=c99 -march=mips32 -mtune=mips32r2 -mhard-float #-fomit-frame-pointer #LDFLAGS = -g DEFINES = -DLSB_FIRST -DUSE_16BPP_RENDERING -DUSE_LIBVORBIS -DGCWZERO -DALIGN_LONG -DALT_RENDERER SRCDIR = ../core INCLUDES = -I$(SRCDIR) -I$(SRCDIR)/z80 -I$(SRCDIR)/m68k \ -I$(SRCDIR)/sound -I$(SRCDIR)/input_hw -I$(SRCDIR)/cart_hw -I$(SRCDIR)/cart_hw/svp \ -I$(SRCDIR)/cd_hw -I$(SRCDIR)/ntsc \ -I$(SRCDIR)/../gcw0 \ -I/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include/ # -I$(SRCDIR)/tremor LIBS = `$(SDL-CONFIG) --libs --libs` -lz -lm -lSDL_ttf -lSDL_image \ -L/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/lib -lvorbisfile OBJDIR = ./build_gcw0 OBJECTS = $(OBJDIR)/z80.o OBJECTS += $(OBJDIR)/m68kcpu.o \ $(OBJDIR)/s68kcpu.o OBJECTS += $(OBJDIR)/genesis.o \ $(OBJDIR)/vdp_ctrl.o \ $(OBJDIR)/vdp_render.o \ $(OBJDIR)/system.o \ $(OBJDIR)/io_ctrl.o \ $(OBJDIR)/mem68k.o \ $(OBJDIR)/memz80.o \ $(OBJDIR)/membnk.o \ $(OBJDIR)/state.o \ $(OBJDIR)/loadrom.o OBJECTS += $(OBJDIR)/input.o \ $(OBJDIR)/gamepad.o \ $(OBJDIR)/lightgun.o \ $(OBJDIR)/mouse.o \ $(OBJDIR)/activator.o \ $(OBJDIR)/xe_1ap.o \ $(OBJDIR)/teamplayer.o \ $(OBJDIR)/paddle.o \ $(OBJDIR)/sportspad.o \ $(OBJDIR)/terebi_oekaki.o \ $(OBJDIR)/graphic_board.o OBJECTS += $(OBJDIR)/sound.o \ $(OBJDIR)/sn76489.o \ $(OBJDIR)/ym2413.o \ $(OBJDIR)/ym2612.o OBJECTS += $(OBJDIR)/blip_buf.o OBJECTS += $(OBJDIR)/eq.o OBJECTS += $(OBJDIR)/sram.o \ $(OBJDIR)/svp.o \ $(OBJDIR)/ssp16.o \ $(OBJDIR)/ggenie.o \ $(OBJDIR)/areplay.o \ $(OBJDIR)/eeprom_93c.o \ $(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/md_cart.o \ $(OBJDIR)/sms_cart.o OBJECTS += $(OBJDIR)/scd.o \ $(OBJDIR)/cdd.o \ $(OBJDIR)/cdc.o \ $(OBJDIR)/gfx.o \ $(OBJDIR)/pcm.o \ $(OBJDIR)/cd_cart.o OBJECTS += $(OBJDIR)/sms_ntsc.o \ $(OBJDIR)/md_ntsc.o OBJECTS += $(OBJDIR)/main.o \ $(OBJDIR)/config.o \ $(OBJDIR)/error.o \ $(OBJDIR)/unzip.o \ $(OBJDIR)/fileio.o \ $(OBJDIR)/utils.o #\ # $(OBJDIR)/menu.o #OBJECTS += $(OBJDIR)/block.o \ # $(OBJDIR)/codebook.o \ # $(OBJDIR)/floor0.o \ # $(OBJDIR)/floor1.o \ # $(OBJDIR)/framing.o \ # $(OBJDIR)/info.o \ # $(OBJDIR)/mapping0.o \ # $(OBJDIR)/mdct.o \ # $(OBJDIR)/registry.o \ # $(OBJDIR)/res012.o \ # $(OBJDIR)/sharedbook.o \ # $(OBJDIR)/synthesis.o \ # $(OBJDIR)/vorbisfile.o \ # $(OBJDIR)/window.o ## 1st $(OBJDIR)/bitwise.o \ all: $(NAME) $(NAME): $(OBJDIR) $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@ $(OBJDIR) : @[ -d $@ ] || mkdir -p $@ $(OBJDIR)/%.o : $(SRCDIR)/%.c $(SRCDIR)/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/sound/%.c $(SRCDIR)/sound/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/input_hw/%.c $(SRCDIR)/input_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/%.c $(SRCDIR)/cart_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(SRCDIR)/cart_hw/svp/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cd_hw/%.c $(SRCDIR)/cd_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/z80/%.c $(SRCDIR)/z80/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/m68k/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/ntsc/%.c $(SRCDIR)/ntsc/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ #$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(SRCDIR)/tremor/%.h # $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ #$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c # $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/../gcw0/%.c $(SRCDIR)/../gcw0/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ pack : strip $(NAME) upx -9 $(NAME) clean: rm -f $(OBJECTS) $(NAME) psp2/emumain.h000664 001750 001750 00000003124 12702465756 014410 0ustar00sergiosergio000000 000000 #ifndef _EMUMAIN_H #define _EMUMAIN_H #define int32 int32_t #define int16 int16_t #define u32 uint32_t #define u64 uint64_t #define ScePspDateTime SceDateTime #define SOUND_FREQUENCY 48000 #define SOUND_SAMPLES 832 void InitEmulator(); void RunEmulator(); void TrashEmulator(); #define DISPLAY_MODE_UNSCALED 0 #define DISPLAY_MODE_FIT_HEIGHT 1 #define DISPLAY_MODE_FILL_SCREEN 2 #define DISPLAY_MODE_2X 3 #define DISPLAY_MODE_3X 4 #define JOY 0x10000 #define SYS 0x20000 #define SPC 0x40000 #define AFI 0x80000 #define CODE_MASK(x) (x & 0xffff) #define SPC_MENU 1 #define SPC_REWIND 2 #define MAP_BUTTONS 18 #define MAP_ANALOG_UP 0 #define MAP_ANALOG_DOWN 1 #define MAP_ANALOG_LEFT 2 #define MAP_ANALOG_RIGHT 3 #define MAP_BUTTON_UP 4 #define MAP_BUTTON_DOWN 5 #define MAP_BUTTON_LEFT 6 #define MAP_BUTTON_RIGHT 7 #define MAP_BUTTON_SQUARE 8 #define MAP_BUTTON_CROSS 9 #define MAP_BUTTON_CIRCLE 10 #define MAP_BUTTON_TRIANGLE 11 #define MAP_BUTTON_LTRIGGER 12 #define MAP_BUTTON_RTRIGGER 13 #define MAP_BUTTON_SELECT 14 #define MAP_BUTTON_START 15 #define MAP_BUTTON_LRTRIGGERS 16 #define MAP_BUTTON_STARTSELECT 17 typedef struct { int ShowFps; int ControlMode; int ClockFreq; int DisplayMode; int VSync; int UpdateFreq; int Frameskip; int VertStrip; int SoundEngine; int SoundBoost; int AutoFire; int RewindSaveRate; int RewindReplayDelay; } EmulatorOptions; struct ButtonConfig { unsigned int ButtonMap[MAP_BUTTONS]; }; #endif // _EMUMAIN_H libretro/msvc/msvc-2010/000700 001750 001750 00000000000 12703321515 016007 5ustar00sergiosergio000000 000000 gx/fileio/file_slot.c000664 001750 001750 00000054130 12702465756 015734 0ustar00sergiosergio000000 000000 /* * file_slot.c * * FAT and Memory Card SRAM/State slots managment * * Copyright Eke-Eke (2008-2014), based on original code from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "file_slot.h" #include "file_load.h" #include "gui.h" #include "filesel.h" #include "saveicon.h" /** * libOGC CARD System Work Area */ static u8 SysArea[CARD_WORKAREA] ATTRIBUTE_ALIGN (32); /* Mega CD backup RAM stuff */ static u32 brm_crc[2]; static char brm_filename[3][32] = {CD_BRAM_JP, CD_BRAM_EU, CD_BRAM_US}; static u8 brm_format[0x40] = { 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f }; /**************************************************************************** * CardMount * * libOGC provides the CARD_Mount function, and it should be all you need. * However, experience with previous emulators has taught me that you are * better off doing a little bit more than that! * *****************************************************************************/ static int CardMount(int slot) { int tries = 0; #ifdef HW_RVL *(unsigned long *) (0xCD006800) |= 1 << 13; /*** Disable Encryption ***/ #else *(unsigned long *) (0xCC006800) |= 1 << 13; /*** Disable Encryption ***/ #endif while (tries < 10) { VIDEO_WaitVSync (); if (CARD_Mount(slot, SysArea, NULL) == CARD_ERROR_READY) return 1; else EXI_ProbeReset (); tries++; } return 0; } /**************************************************************************** * Slot Management * * ****************************************************************************/ void slot_autoload(int slot, int device) { /* Mega CD backup RAM specific */ if (!slot && (system_hw == SYSTEM_MCD)) { /* automatically load internal backup RAM */ FILE *fp = fopen(brm_filename[((region_code ^ 0x40) >> 6) - 1], "rb"); if (fp != NULL) { fread(scd.bram, 0x2000, 1, fp); fclose(fp); /* update CRC */ brm_crc[0] = crc32(0, scd.bram, 0x2000); } else { /* force internal backup RAM format (does not use previous region backup RAM) */ scd.bram[0x1fff] = 0; } /* check if internal backup RAM is correctly formatted */ if (memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { /* clear internal backup RAM */ memset(scd.bram, 0x00, 0x2000 - 0x40); /* internal Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = 0x00; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (sizeof(scd.bram) / 64) - 3; /* format internal backup RAM */ memcpy(scd.bram + 0x2000 - 0x40, brm_format, 0x40); /* clear CRC to force file saving (in case previous region backup RAM was also formatted) */ brm_crc[0] = 0; } /* automatically load cartridge backup RAM (if enabled) */ if (scd.cartridge.id) { fp = fopen(CART_BRAM, "rb"); if (fp != NULL) { int filesize = scd.cartridge.mask + 1; int done = 0; /* Read into buffer (2k blocks) */ while (filesize > CHUNKSIZE) { fread(scd.cartridge.area + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Read remaining bytes */ if (filesize) { fread(scd.cartridge.area + done, filesize, 1, fp); } /* close file */ fclose(fp); /* update CRC */ brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); } /* check if cartridge backup RAM is correctly formatted */ if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { /* clear cartridge backup RAM */ memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); /* Cartridge Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; /* format cartridge backup RAM */ memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - 0x40, brm_format, 0x40); } } } /* configurable SRAM & State auto-saving */ if ((slot && !(config.s_auto & 2)) || (!slot && !(config.s_auto & 1))) { return; } if (strlen(rom_filename)) { SILENT = 1; slot_load(slot, device); SILENT = 0; } } void slot_autosave(int slot, int device) { /* Mega CD backup RAM specific */ if (!slot && (system_hw == SYSTEM_MCD)) { /* verify that internal backup RAM has been modified */ if (crc32(0, scd.bram, 0x2000) != brm_crc[0]) { /* check if it is correctly formatted before saving */ if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { FILE *fp = fopen(brm_filename[((region_code ^ 0x40) >> 6) - 1], "wb"); if (fp != NULL) { fwrite(scd.bram, 0x2000, 1, fp); fclose(fp); /* update CRC */ brm_crc[0] = crc32(0, scd.bram, 0x2000); } } } /* verify that cartridge backup RAM has been modified */ if (scd.cartridge.id && (crc32(0, scd.cartridge.area, scd.cartridge.mask + 1) != brm_crc[1])) { /* check if it is correctly formatted before saving */ if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { FILE *fp = fopen(CART_BRAM, "wb"); if (fp != NULL) { int filesize = scd.cartridge.mask + 1; int done = 0; /* Write to file (2k blocks) */ while (filesize > CHUNKSIZE) { fwrite(scd.cartridge.area + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Write remaining bytes */ if (filesize) { fwrite(scd.cartridge.area + done, filesize, 1, fp); } /* Close file */ fclose(fp); /* update CRC */ brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); } } } } /* configurable SRAM & State auto-saving */ if ((slot && !(config.s_auto & 2)) || (!slot && !(config.s_auto & 1))) { return; } if (strlen(rom_filename)) { SILENT = 1; slot_save(slot, device); SILENT = 0; } } void slot_autodetect(int slot, int device, t_slot *ptr) { if (!ptr) return; char filename[MAXPATHLEN]; memset(ptr,0,sizeof(t_slot)); if (!device) { /* FAT support */ if (slot > 0) { sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); } else { sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); } /* Open file */ FILE *fp = fopen(filename, "rb"); if (fp) { /* Retrieve date & close */ struct stat filestat; stat(filename, &filestat); struct tm *timeinfo = localtime(&filestat.st_mtime); ptr->year = 1900 + timeinfo->tm_year; ptr->month = timeinfo->tm_mon; ptr->day = timeinfo->tm_mday; ptr->hour = timeinfo->tm_hour; ptr->min = timeinfo->tm_min; fclose(fp); ptr->valid = 1; } } else { /* Memory Card support */ if (slot > 0) sprintf(filename,"MD-%04X.gp%d", rominfo.realchecksum, slot - 1); else sprintf(filename,"MD-%04X.srm", rominfo.realchecksum); /* Initialise the CARD system */ memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Mount CARD */ if (CardMount(device)) { /* Open file */ card_file CardFile; if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY) { /* Retrieve date & close */ card_stat CardStatus; CARD_GetStatus(device, CardFile.filenum, &CardStatus); time_t rawtime = CardStatus.time; struct tm *timeinfo = localtime(&rawtime); ptr->year = 1900 + timeinfo->tm_year; ptr->month = timeinfo->tm_mon; ptr->day = timeinfo->tm_mday; ptr->hour = timeinfo->tm_hour; ptr->min = timeinfo->tm_min; CARD_Close(&CardFile); ptr->valid = 1; } CARD_Unmount(device); } } } int slot_delete(int slot, int device) { char filename[MAXPATHLEN]; int ret = 0; if (!device) { /* FAT support */ if (slot > 0) { /* remove screenshot */ sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); remove(filename); sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); } else { sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); } /* Delete file */ ret = remove(filename); } else { /* Memory Card support */ if (slot > 0) sprintf(filename,"MD-%04X.gp%d", rominfo.realchecksum, slot - 1); else sprintf(filename,"MD-%04X.srm", rominfo.realchecksum); /* Initialise the CARD system */ memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Mount CARD */ if (CardMount(device)) { /* Delete file */ ret = CARD_Delete(device,filename); CARD_Unmount(device); } } return ret; } int slot_load(int slot, int device) { char filename[MAXPATHLEN]; unsigned long filesize, done = 0; u8 *buffer; /* File Type */ if (slot > 0) { GUI_MsgBoxOpen("Information","Loading State ...",1); } else { if (!sram.on) { GUI_WaitPrompt("Error","Backup RAM is disabled !"); return 0; } GUI_MsgBoxOpen("Information","Loading Backup RAM ...",1); } /* Device Type */ if (!device) { /* FAT file */ if (slot > 0) { sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); } else { sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); } /* Open file */ FILE *fp = fopen(filename, "rb"); if (!fp) { GUI_WaitPrompt("Error","Unable to open file !"); return 0; } /* Get file size */ fseek(fp, 0, SEEK_END); filesize = ftell(fp); fseek(fp, 0, SEEK_SET); /* allocate buffer */ buffer = (u8 *)memalign(32,filesize); if (!buffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); fclose(fp); return 0; } /* Read into buffer (2k blocks) */ while (filesize > CHUNKSIZE) { fread(buffer + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Read remaining bytes */ fread(buffer + done, filesize, 1, fp); done += filesize; /* Close file */ fclose(fp); } else { /* Memory Card file */ if (slot > 0) { sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); } else { sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); } /* Initialise the CARD system */ char action[64]; memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Attempt to mount the card */ if (!CardMount(device)) { GUI_WaitPrompt("Error","Unable to mount memory card"); return 0; } /* Retrieve the sector size */ u32 SectorSize = 0; int CardError = CARD_GetSectorSize(device, &SectorSize); if (!SectorSize) { sprintf(action, "Invalid sector size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); return 0; } /* Open file */ card_file CardFile; CardError = CARD_Open(device, filename, &CardFile); if (CardError) { sprintf(action, "Unable to open file (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); return 0; } /* Get file size */ filesize = CardFile.len; if (filesize % SectorSize) { filesize = ((filesize / SectorSize) + 1) * SectorSize; } /* Allocate buffer */ u8 *in = (u8 *)memalign(32, filesize); if (!in) { GUI_WaitPrompt("Error","Unable to allocate memory !"); CARD_Close(&CardFile); CARD_Unmount(device); return 0; } /* Read file sectors */ while (filesize > 0) { CARD_Read(&CardFile, &in[done], SectorSize, done); done += SectorSize; filesize -= SectorSize; } /* Close file */ CARD_Close(&CardFile); CARD_Unmount(device); /* Uncompressed file size */ memcpy(&filesize, in + 2112, 4); buffer = (u8 *)memalign(32, filesize); if (!buffer) { free(in); GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } /* Uncompress file */ uncompress ((Bytef *)buffer, &filesize, (Bytef *)(in + 2112 + 4), done - 2112 - 4); done = filesize; free(in); } if (slot > 0) { /* Load state */ if (state_load(buffer) <= 0) { free(buffer); GUI_WaitPrompt("Error","Invalid state file !"); return 0; } } else { /* load SRAM (max. 64 KB)*/ if (done < 0x10000) { memcpy(sram.sram, buffer, done); memset(sram.sram + done, 0xFF, 0x10000 - done); } else { memcpy(sram.sram, buffer, 0x10000); } /* update CRC */ sram.crc = crc32(0, sram.sram, 0x10000); } free(buffer); GUI_MsgBoxClose(); return 1; } int slot_save(int slot, int device) { char filename[MAXPATHLEN]; unsigned long filesize, done = 0; u8 *buffer; if (slot > 0) { GUI_MsgBoxOpen("Information","Saving State ...",1); /* allocate buffer */ buffer = (u8 *)memalign(32,STATE_SIZE); if (!buffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } filesize = state_save(buffer); } else { /* only save if SRAM is enabled */ if (!sram.on) { GUI_WaitPrompt("Error","Backup RAM disabled !"); return 0; } /* max. supported SRAM size */ filesize = 0x10000; /* only save modified SRAM size */ do { if (sram.sram[filesize-1] != 0xff) break; } while (--filesize > 0); /* only save if SRAM has been modified */ if ((filesize == 0) || (crc32(0, &sram.sram[0], 0x10000) == sram.crc)) { GUI_WaitPrompt("Warning","Backup RAM not modified !"); return 0; } GUI_MsgBoxOpen("Information","Saving Backup RAM ...",1); /* allocate buffer */ buffer = (u8 *)memalign(32, filesize); if (!buffer) { GUI_WaitPrompt("Error","Unable to allocate memory !"); return 0; } /* copy SRAM data */ memcpy(buffer, sram.sram, filesize); /* update CRC */ sram.crc = crc32(0, sram.sram, 0x10000); } /* Device Type */ if (!device) { /* FAT filename */ if (slot > 0) { sprintf(filename, "%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); } else { sprintf(filename, "%s/saves/%s.srm", DEFAULT_PATH, rom_filename); } /* Open file */ FILE *fp = fopen(filename, "wb"); if (!fp) { GUI_WaitPrompt("Error","Unable to open file !"); free(buffer); return 0; } /* Write from buffer (2k blocks) */ while (filesize > CHUNKSIZE) { fwrite(buffer + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Write remaining bytes */ fwrite(buffer + done, filesize, 1, fp); done += filesize; /* Close file */ fclose(fp); free(buffer); /* Close message box */ GUI_MsgBoxClose(); /* Save state screenshot */ if (slot > 0) { sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); gxSaveScreenshot(filename); } } else { /* Memory Card filename */ if (slot > 0) { sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); } else { sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); } /* Initialise the CARD system */ char action[64]; memset(&SysArea, 0, CARD_WORKAREA); CARD_Init("GENP", "00"); /* CARD slot */ device--; /* Attempt to mount the card */ if (!CardMount(device)) { GUI_WaitPrompt("Error","Unable to mount memory card"); free(buffer); return 0; } /* Retrieve sector size */ u32 SectorSize = 0; int CardError = CARD_GetSectorSize(device, &SectorSize); if (!SectorSize) { sprintf(action, "Invalid sector size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(buffer); return 0; } /* Build output buffer */ u8 *out = (u8 *)memalign(32, filesize + 2112 + 4); if (!out) { GUI_WaitPrompt("Error","Unable to allocate memory !"); CARD_Unmount(device); free(buffer); return 0; } /* Memory Card file header */ char comment[2][32] = { {"Genesis Plus GX"}, {"SRAM Save"} }; strcpy (comment[1], filename); memcpy (&out[0], &icon, 2048); memcpy (&out[2048], &comment[0], 64); /* uncompressed size */ done = filesize; memcpy(&out[2112], &done, 4); /* compress file */ compress2 ((Bytef *)&out[2112 + 4], &filesize, (Bytef *)buffer, done, 9); /* Adjust file size */ filesize = filesize + 4 + 2112; if (filesize % SectorSize) { filesize = ((filesize / SectorSize) + 1) * SectorSize; } /* Check if file already exists */ card_file CardFile; if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY) { int size = filesize - CardFile.len; CARD_Close(&CardFile); memset(&CardFile,0,sizeof(CardFile)); /* Check file new size */ if (size > 0) { CardError = CARD_Create(device, "TEMP", size, &CardFile); if (CardError) { sprintf(action, "Unable to increase file size (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(out); free(buffer); return 0; } /* delete temporary file */ CARD_Close(&CardFile); memset(&CardFile,0,sizeof(CardFile)); CARD_Delete(device, "TEMP"); } /* delete previously existing file */ CARD_Delete(device, filename); } /* Create a new file */ CardError = CARD_Create(device, filename, filesize, &CardFile); if (CardError) { sprintf(action, "Unable to create file (%d)", CardError); GUI_WaitPrompt("Error",action); CARD_Unmount(device); free(out); free(buffer); return 0; } /* Update file informations */ time_t rawtime; time(&rawtime); card_stat CardStatus; CARD_GetStatus(device, CardFile.filenum, &CardStatus); CardStatus.icon_addr = 0x0; CardStatus.icon_fmt = 2; CardStatus.icon_speed = 1; CardStatus.comment_addr = 2048; CardStatus.time = rawtime; CARD_SetStatus(device, CardFile.filenum, &CardStatus); /* Write file sectors */ while (filesize > 0) { CARD_Write(&CardFile, &out[done], SectorSize, done); filesize -= SectorSize; done += SectorSize; } /* Close file */ CARD_Close(&CardFile); CARD_Unmount(device); free(out); free(buffer); /* Close message box */ GUI_MsgBoxClose(); } return 1; } libretro/scrc32.h000664 001750 001750 00000000203 12702465756 015005 0ustar00sergiosergio000000 000000 #ifndef _S_CRC32_H #define _S_CRC32_H unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len); #endif gx/images/Button_load_over.png000664 001750 001750 00000010635 12702465756 017623 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚ}t?3l &D#=#Z+!)-ΕRHتSѶ뵴RQEkAz h 4y!l6}f&=99;;3>4Maey<0h@6`Ł`;WO?',`9p0?pT<}/ƙ* %8En+<ʽ8&m&^$rvY,~_]¡{$•%aTyCx +UstNZ;8tO/`Fm)=A),˥r^}upUc><%ma OrD ItR۽$@Y|?i;^,uܵ/cfn'R/PiJ✖{mfgSEvn_B+$i?Pe'8r϶CìV|xJݷ[sq, *xxMgzbȨQ|*[ϥ7bIp( F Äa"qE0o57SYn}L6}JVZ}b$.Pk>% 7Sһ xll6DQD4ljbƹQX,f|&']/vxyyZBIPlpUCX6ڀ^oYͩkv`H$^ts3* DB^gFvRVV^pX0;[n$"Ei/|AޗNsXDelyo-jq:@"@UUTU%H|7OL\_4A@sqj&v6-cf032OU]֬(Dc"R{º}M%vYTES_Cp8RFYh# +bWލTWXz9vYV˲|h e=ݡ'}h:TH$)v=gEE#//Ϙ999#tc//&I7h(vF |0Mey8 5W$զAWVUU1{lD1F\idV35s,mf'82O3' E(}+jl:u* h@fua@f5HwfwǬ|}K*eQΜ'Lunoo*Cv'-VLE̙Ô)Sa btxQQ/0PYQzڄ3y3BUDC=ł F3 O[n[oEQhhh0.]: 23tp8\ 8sEq2rTٸᠾQ:F/Xֺ̰ м!v4bMes h X(Dh-4z(q èj}u?9a#aӦM|elQTUe˖ ;gvԉDh4:yG;fZw 0l;ˢm0vV痟 ZrDvڵn-[]zbރIi LkW mfc^o on,sLqoӧYlF̚ncHz1+́xz>^oRjyJ īnZ޹(Mڔgl0eі6nȊ+ɸG\/8p?HF2 8= #zL3k+ Vӯ X{-H,bdx_0Mt(st:9tЈN4@<.R>٫qCM2z1ӫ$i0@I j.?=~`I3h8񏔯H*BEQ'wٹMyEV-MkL*fV`081Ǎ42dRڨަ?3܊jA7ԈC*nh\BV!G\].CabJ=> Je_ܾxlLVCoyhKq{ r!Z^A& <4,QEGf)3f$I!P(f(1\ \&D""n<ȏ3Wy+$ 8x|5\a^]?y.EgR(d[8sx YuT;XF{\w5ݩbzV.8Ғc;ʈ'Z&-I1;~C.=mN:8ذpN0ld1/ :}-Ɨvln7N5A3nڕQf(l*`r%58p$Io^J?=O‡m A0X{ -8v6)U" jު#$;[Hѯ W$Leqʢ(JMٮ^;mg|x&vvr4f\ ZۍO菣&qWiYOYhoo|t,))uxV*z+WݔuW\~|"cFf`PNAHPf5k<. <@*SIENDB`libretro/link.T000664 001750 001750 00000000047 12702465756 014625 0ustar00sergiosergio000000 000000 { global: retro_*; local: *; }; gx/images/Option_video.png000664 001750 001750 00000011720 12702465756 016750 0ustar00sergiosergio000000 000000 PNG  IHDR@T2.1SsBIT|d pHYs  ~tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$$IDATx\ypםgF#Y,A )B q^;»9f ,b;q\N9668q\k'`.m) i$hhKDz^{]ׯ$ #@*l6[V-zwjuEQZۭKEQ6" fCdA9k2z 9{(?=6ퟺ4 h0 W E(" $IZ~:mO_K:uj￿ٳ0(//ԩSa4,(^ A8S @D"XE4MiPV",_V ٳ'LpF9+Wj5233GE nr(0 t:x<v`0`ppPTHJJ˲2ɒ$pT(0tA_THPqqq0L/>D"P*㐘8 RFJZ=|,YpǎÖ-[T*aX /(cΝXja_ <.] $pΝG}NF ;;m6p ,\IIIrytwwc֭IfB[Ckk(/Yzr 0 jq>&(JjAl6CΟ?vbz/"Ν;h4F{{;B܌ӧO HMMBcc#J% ŋcڵ7Uf>T*L&(l6JJJӧ(//  YYY) ddd ..N֦CCQQ֬Yra8qℼjؼy3,|>rssQSSTB!lٲK3g PQQSN[(8C||& IA||(566z3f̀(:u* CCC͕P(HHHR &NǃC,b(^W_ PTغu+"L&mmmHKKG}}=`0`6QGq 2$I… 7%BH/F||< $IFq9, ^6 r?}}}hiiEQHIIrhoo51555444'ׇ|>At:pQ~$ ;;{lj@\\- y͘5krrr0gD{{\<kWƲ,rrrp}2 #;/b֭ph4hnndKrYYY0 $ VU(f0 J5 F6C\ fBVVF#$IBww7A@^^F#,l$&&XVTVV ?8񠭭 ׄih4<F2\r===0L(((Upt:TWWC#pd2|@rr2nLEQzhii^ tbɒ%HNNB0݋ .y ??(#!l޼|4i֮]+}ECAcDQjEHp*jTOQA t:쵣w?$D@$AT*T*!"t:jǔ8c娩B;3Fi FH@ `0(k^sp8 χp8 R8p;u0r 1~ET(`Y4MC$|>455ɿ3 FuKFn|ndd `T@vd5A4naC(o4(F>"`$F{$v~3uDnz nҀhzIZ-ɚ`0hU@Ђ ! i `hhh2 χӧ8~ ~z̙WK._BRyO<.bF?ↆpǎٳtR|GHLL'Hۍ̜9| rʋ/^iii ?fVX'x.]BCCT*J%H+ypgyE>@||;8 ' ZXcX kkbqb-@1N@5 8 ' ZXcX kkbqb-@1N4M3QgϞ}pߍꫯn@=z]v=u'?g۷oh2eʮ }}}lJJ , ;v_>B)fb+ꯋaz7{6nܸ@W!}$)[ ʕ+iii8KݿSN=8r]]](՝===??~xل tA慯lO>f D? W^y学Y:8|0^x ;%N}@~}}5G>1<A2$4MN<r y+vv6mZeVϜ6m?tk׮]wȑY&{3f,8qbۡC 7oVCCC7M.\QZZgIp|>pٗА$N(Ijz|ݺuǖ.]aʔ)8q1VY*ݻWyqoUUՕ,fYvObb⢎T {^,[N`qݿHD*DQD Sդoؽ{w"˲ZFKK-IIIEQݻs[[[M@@2LG( BZRv}ڱ}0(LKKK]N3f-v\y-Z_Wqa HNN.++s|>#//Gy>++맂 b4,z xl@$I"I:.Jܞ~F.--$Ɋ_: B$իꮮ.kUU~`xӦM+GreeUtNP(.ŅΜ9%VUUĵ 4y@0 # ̙3?~駗e9s\\fͯ  Vqܢ߇a> &,_@koo7o~رcϟxCnnn߄0?>fsիٗP\\X,vjm...NaY6xJKKz4i.'I HĜiڴi~f3T*gݕbO`? e}IENDB`gx/fileio/file_slot.h000664 001750 001750 00000005016 12702465756 015740 0ustar00sergiosergio000000 000000 /* * file_slot.c * * FAT and Memory Card SRAM/Savestate files managment * * Copyright Eke-Eke (2008-2014), based on original code from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILE_SLOT_H #define _FILE_SLOT_H typedef struct { int valid; u16 year; u8 month; u8 day; u8 hour; u8 min; } t_slot; extern void slot_autoload(int slot, int device); extern void slot_autosave(int slot, int device); extern void slot_autodetect(int slot, int device, t_slot *ptr); extern int slot_delete(int slot, int device); extern int slot_load(int slot, int device); extern int slot_save(int slot, int device); #endif gx/gui/000700 001750 001750 00000000000 12703321515 013067 5ustar00sergiosergio000000 000000 core/cart_hw/eeprom_spi.h000664 001750 001750 00000004426 12702465756 016620 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * SPI Serial EEPROM (25XX512 only) support * * Copyright (C) 2012 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _EEPROM_SPI_H_ #define _EEPROM_SPI_H_ /* Function prototypes */ extern void eeprom_spi_init(); extern void eeprom_spi_write(unsigned char data); extern unsigned int eeprom_spi_read(unsigned int address); #endif core/ntsc/sms_ntsc.h000664 001750 001750 00000013753 12702465756 015632 0ustar00sergiosergio000000 000000 /* Sega Master System/Game Gear/TI 99/4A NTSC video filter */ /* sms_ntsc 0.2.3 */ #ifndef SMS_NTSC_H #define SMS_NTSC_H #include "sms_ntsc_config.h" #ifdef __cplusplus extern "C" { #endif /* Image parameters, ranging from -1.0 to 1.0. Actual internal values shown in parenthesis and should remain fairly stable in future versions. */ typedef struct sms_ntsc_setup_t { /* Basic parameters */ double hue; /* -1 = -180 degrees +1 = +180 degrees */ double saturation; /* -1 = grayscale (0.0) +1 = oversaturated colors (2.0) */ double contrast; /* -1 = dark (0.5) +1 = light (1.5) */ double brightness; /* -1 = dark (0.5) +1 = light (1.5) */ double sharpness; /* edge contrast enhancement/blurring */ /* Advanced parameters */ double gamma; /* -1 = dark (1.5) +1 = light (0.5) */ double resolution; /* image resolution */ double artifacts; /* artifacts caused by color changes */ double fringing; /* color artifacts caused by brightness changes */ double bleed; /* color bleed (color resolution reduction) */ float const* decoder_matrix; /* optional RGB decoder matrix, 6 elements */ unsigned char* palette_out; /* optional RGB palette out, 3 bytes per color */ } sms_ntsc_setup_t; /* Video format presets */ extern sms_ntsc_setup_t const sms_ntsc_composite; /* color bleeding + artifacts */ extern sms_ntsc_setup_t const sms_ntsc_svideo; /* color bleeding only */ extern sms_ntsc_setup_t const sms_ntsc_rgb; /* crisp image */ extern sms_ntsc_setup_t const sms_ntsc_monochrome;/* desaturated + artifacts */ enum { sms_ntsc_palette_size = 4096 }; /* Initializes and adjusts parameters. Can be called multiple times on the same sms_ntsc_t object. Can pass NULL for either parameter. */ typedef struct sms_ntsc_t sms_ntsc_t; void sms_ntsc_init( sms_ntsc_t* ntsc, sms_ntsc_setup_t const* setup ); /* Filters one row of pixels. Input pixel format is set by SMS_NTSC_IN_FORMAT and output RGB depth is set by SMS_NTSC_OUT_DEPTH. Both default to 16-bit RGB. In_row_width is the number of pixels to get to the next input row. */ void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline); /* Number of output pixels written by blitter for given input width. */ #define SMS_NTSC_OUT_WIDTH( in_width ) \ (((in_width) / sms_ntsc_in_chunk + 1) * sms_ntsc_out_chunk) /* Number of input pixels that will fit within given output width. Might be rounded down slightly; use SMS_NTSC_OUT_WIDTH() on result to find rounded value. */ #define SMS_NTSC_IN_WIDTH( out_width ) \ (((out_width) / sms_ntsc_out_chunk - 1) * sms_ntsc_in_chunk + 2) /* Interface for user-defined custom blitters */ enum { sms_ntsc_in_chunk = 3 }; /* number of input pixels read per chunk */ enum { sms_ntsc_out_chunk = 7 }; /* number of output pixels generated per chunk */ /* Begins outputting row and starts three pixels. First pixel will be cut off a bit. Declares variables, so must be before first statement in a block (unless you're using C++). */ #define SMS_NTSC_BEGIN_ROW( ntsc, pixel0, pixel1, pixel2 ) \ SMS_NTSC_BEGIN_ROW_6_( pixel0, pixel1, pixel2, SMS_NTSC_IN_FORMAT, ntsc ) /* Begins input pixel */ #define SMS_NTSC_COLOR_IN( in_index, ntsc, color_in ) \ SMS_NTSC_COLOR_IN_( in_index, color_in, SMS_NTSC_IN_FORMAT, ntsc ) /* Generates output pixel */ #define SMS_NTSC_RGB_OUT( x, rgb_out ) {\ raw_ =\ kernel0 [x ] + kernel1 [(x+12)%7+14] + kernel2 [(x+10)%7+28] +\ kernelx0 [(x+7)%14] + kernelx1 [(x+ 5)%7+21] + kernelx2 [(x+ 3)%7+35];\ SMS_NTSC_CLAMP_( raw_, 0 );\ SMS_NTSC_RGB_OUT_( rgb_out, 0 );\ } /* private */ enum { sms_ntsc_entry_size = 3 * 14 }; typedef unsigned long sms_ntsc_rgb_t; struct sms_ntsc_t { sms_ntsc_rgb_t table [sms_ntsc_palette_size] [sms_ntsc_entry_size]; }; #define SMS_NTSC_BGR12( ntsc, n ) (ntsc)->table [n & 0xFFF] #define SMS_NTSC_RGB16( ntsc, n ) \ (sms_ntsc_rgb_t const*) ((char const*) (ntsc)->table +\ ((n << 10 & 0x7800) | (n & 0x0780) | (n >> 9 & 0x0078)) *\ (sms_ntsc_entry_size * sizeof (sms_ntsc_rgb_t) / 8)) #define SMS_NTSC_RGB15( ntsc, n ) \ (sms_ntsc_rgb_t const*) ((char const*) (ntsc)->table +\ ((n << 9 & 0x3C00) | (n & 0x03C0) | (n >> 9 & 0x003C)) *\ (sms_ntsc_entry_size * sizeof (sms_ntsc_rgb_t) / 4)) /* common 3->7 ntsc macros */ #define SMS_NTSC_BEGIN_ROW_6_( pixel0, pixel1, pixel2, ENTRY, table ) \ sms_ntsc_rgb_t raw_;\ unsigned const sms_ntsc_pixel0_ = (pixel0);\ sms_ntsc_rgb_t const* kernel0 = ENTRY( table, sms_ntsc_pixel0_ );\ unsigned const sms_ntsc_pixel1_ = (pixel1);\ sms_ntsc_rgb_t const* kernel1 = ENTRY( table, sms_ntsc_pixel1_ );\ unsigned const sms_ntsc_pixel2_ = (pixel2);\ sms_ntsc_rgb_t const* kernel2 = ENTRY( table, sms_ntsc_pixel2_ );\ sms_ntsc_rgb_t const* kernelx0;\ sms_ntsc_rgb_t const* kernelx1 = kernel0;\ sms_ntsc_rgb_t const* kernelx2 = kernel0 /* common ntsc macros */ #define sms_ntsc_rgb_builder ((1L << 21) | (1 << 11) | (1 << 1)) #define sms_ntsc_clamp_mask (sms_ntsc_rgb_builder * 3 / 2) #define sms_ntsc_clamp_add (sms_ntsc_rgb_builder * 0x101) #define SMS_NTSC_CLAMP_( io, shift ) {\ sms_ntsc_rgb_t sub = (io) >> (9-(shift)) & sms_ntsc_clamp_mask;\ sms_ntsc_rgb_t clamp = sms_ntsc_clamp_add - sub;\ io |= clamp;\ clamp -= sub;\ io &= clamp;\ } #define SMS_NTSC_COLOR_IN_( index, color, ENTRY, table ) {\ unsigned color_;\ kernelx##index = kernel##index;\ kernel##index = (color_ = (color), ENTRY( table, color_ ));\ } /* x is always zero except in snes_ntsc library */ #if SMS_NTSC_OUT_DEPTH == 15 #define SMS_NTSC_RGB_OUT_( rgb_out, x ) {\ rgb_out = (raw_>>(14-x)& 0x7C00)|(raw_>>(9-x)&0x03E0)|(raw_>>(4-x)&0x001F);\ } #elif SMS_NTSC_OUT_DEPTH == 16 #define SMS_NTSC_RGB_OUT_( rgb_out, x) {\ rgb_out = (raw_>>(13-x)& 0xF800)|(raw_>>(8-x)&0x07E0)|(raw_>>(4-x)&0x001F);\ } #endif #ifdef __cplusplus } #endif #endif core/cd_hw/gfx.h000664 001750 001750 00000014062 12702465756 014674 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD graphics processor * * Copyright (C) 2012 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _CD_GFX_ #define _CD_GFX_ #define gfx scd.gfx_hw typedef struct { uint32 cycles; /* current cycles count for graphics operation */ uint32 cyclesPerLine; /* current graphics operation timings */ uint32 dotMask; /* stamp map size mask */ uint16 *tracePtr; /* trace vector pointer */ uint16 *mapPtr; /* stamp map table base address */ uint8 stampShift; /* stamp pixel shift value (related to stamp size) */ uint8 mapShift; /* stamp map table shift value (related to stamp map size) */ uint16 bufferOffset; /* image buffer column offset */ uint32 bufferStart; /* image buffer start index */ uint16 lut_offset[0x8000]; /* Cell Image -> WORD-RAM offset lookup table (1M Mode) */ uint8 lut_prio[4][0x100][0x100]; /* WORD-RAM data writes priority lookup table */ uint8 lut_pixel[0x200]; /* Graphics operation dot offset lookup table */ uint8 lut_cell[0x100]; /* Graphics operation stamp offset lookup table */ } gfx_t; /***************************************************************/ /* WORD-RAM DMA interfaces (1M & 2M modes) */ /***************************************************************/ extern void word_ram_0_dma_w(unsigned int words); extern void word_ram_1_dma_w(unsigned int words); extern void word_ram_2M_dma_w(unsigned int words); /***************************************************************/ /* WORD-RAM 0 & 1 CPU interfaces (1M mode) */ /***************************************************************/ extern unsigned int word_ram_0_read16(unsigned int address); extern unsigned int word_ram_1_read16(unsigned int address); extern void word_ram_0_write16(unsigned int address, unsigned int data); extern void word_ram_1_write16(unsigned int address, unsigned int data); extern unsigned int word_ram_0_read8(unsigned int address); extern unsigned int word_ram_1_read8(unsigned int address); extern void word_ram_0_write8(unsigned int address, unsigned int data); extern void word_ram_1_write8(unsigned int address, unsigned int data); /***************************************************************/ /* WORD-RAM 0 & 1 DOT image SUB-CPU interface (1M mode) */ /***************************************************************/ extern unsigned int dot_ram_0_read16(unsigned int address); extern unsigned int dot_ram_1_read16(unsigned int address); extern void dot_ram_0_write16(unsigned int address, unsigned int data); extern void dot_ram_1_write16(unsigned int address, unsigned int data); extern unsigned int dot_ram_0_read8(unsigned int address); extern unsigned int dot_ram_1_read8(unsigned int address); extern void dot_ram_0_write8(unsigned int address, unsigned int data); extern void dot_ram_1_write8(unsigned int address, unsigned int data); /***************************************************************/ /* WORD-RAM 0 & 1 CELL image MAIN-CPU interface (1M mode) */ /***************************************************************/ extern unsigned int cell_ram_0_read16(unsigned int address); extern unsigned int cell_ram_1_read16(unsigned int address); extern void cell_ram_0_write16(unsigned int address, unsigned int data); extern void cell_ram_1_write16(unsigned int address, unsigned int data); extern unsigned int cell_ram_0_read8(unsigned int address); extern unsigned int cell_ram_1_read8(unsigned int address); extern void cell_ram_0_write8(unsigned int address, unsigned int data); extern void cell_ram_1_write8(unsigned int address, unsigned int data); /***************************************************************/ /* Rotation / Scaling operation (2M mode) */ /***************************************************************/ extern void gfx_init(void); extern void gfx_reset(void); extern int gfx_context_save(uint8 *state); extern int gfx_context_load(uint8 *state); extern void gfx_start(unsigned int base, int cycles); extern void gfx_update(int cycles); #endif gcw0/opk-data/MCD.png000664 001750 001750 00000145256 12702465756 015406 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATx̽8n- P=3lKX )WL{nD "Ǐo_"$D'"bR+8WYI%";BN }I$>cN-}@'y[D']Oc,G &O 6nua,|f̢oyu^+|'x>0sfrNw:-?1^MbLV;X?OM 36+ޞH+.~߿ a4uan= _5tBr5o KRܜM6V(75y%."ڵrO)vz"Ao"^FP qްz*IM US+^(,MRݹ6|&ac.^:a@;N0JȤ<Ĺ FS;?v`_7*辽ΏqILPJ rN}u/4ٙ1[B47^h8|tjܬ [=tua4Ude2\ qhv`c32%u3_c a:˰w]!IV*OeZtȴx@s7j0Ԑ@kVEQrID5 $9Ng]Ug~ZG :&n 3XLU'SZѰ` # Yt3-zAu"< >B!vJ-֧7^ʣq`Z Rd7"me3hIS^qGw2C1(zO_~wq]1/)B1d87*!>:ڤV!;}UP|w2Drݘe&%˼Ʊp'L2xFOӰ3xk ?) _WϓN z{ ܬ ogՂ"h!%70FF;+AȾ b7bfi`TT@`>p[sw0 푼8y> EOIa f]Wm>a~\#__|h(Kw56E@ K*[ "ՓUz8&>HۊdViqV,|02g֥o8A/M10٦XȘz@ 'کȬD-ԗ/eǢC"Xȭ.v}v>bs+l3.4cnvB| 2\A02J"{()$>+hi7tI_3%g|Ov1~s0hу}V~" 4I\lJlK,Uf6P9[rt9 af4!0xW?-t@c.(b!![Q -q액 ^C3e:14Ǜmdѯ%̿ 5eL-328Db]~2c#|3La3y4 33R!Hیa TW@rI zx$3ss)^:&"S*^_JᎽ9Nm⢉rFb K[CfТABߛNi5 M u:f,h $V5a#Dz4q#N]?-wcl0]+ Mx_LI BVv woB%`hbPu1&Ql8\a8 {*d9#`#cI[+`hјh$u9ێ|ּU暓|XRrn~9g#y EJL{lHGiN4P#V3dĠ<ՔnD^!IoWϺХ@p{t:<.uITHa 5mӦ:\>;s_w觰&0ȿAF1XN4Ӣ/.JÁ>$BD˶]lRj U29V%U֬>!^KADa2sҚlH@;zoɂUrE];d&cn*u8LJlu{V'_L<2@EηtF(9U3k-i85HrB ]AӀ#jBݰ(}-b(gݺG^1I|l]hҔ)ـij[l"uAYæ;Oɟ]Й J 7FBr7@?R&;&nʣN>">-L8)%EŀB8jCc xtӽH-ԆMBZaFOX*Q?I)A4{ b8_%箼thN`xy;I8{.oUG)Elg9.#aM;sƅ\ʝ6UBWfֻ$Vna@ iTSEH%Dl$&=lv}3̎R!ߛoP/_ 2߰Ʉ}g3aF;"{j="L|e4|HX+qCסGEgߎ: 5u ga) $x 誴)@2!uPMDv oSr@r?)NτDҠ۫U""RwdwVsNEh4s!5-j 2?/ZǾa8QS 靹isDd _?^VL@5ڀh1t5jc:p&~S&3;s ORp.PHkamz*X*+]؇<3^_H`)L_M6Yli6UMQ&l .mNV,97'$uuIoH# |s2ݱRtlw/ HKrMAXĨa2N?5F@ko\:slUY1T`2̓q$NMvnۿc\f4u`LǤQO 'fwBTs Rɖ(l{bgu-Chhjl&歠>f_g3"pN: Đ~ʽ*D?jYݹg/HVڶyRUɔ79 XϡJPIݓ'Nw w NGLנ;HYEԯ@e."H$d?!(υ[(MH 2BI*!tEE/l^xlh[zB&fnН $# Dش A ȅ5Gԫmn$Б&v@hJNRӼ=8=tQ'D*5cg 7j@04p3%.z5. Q26yyd*xSZ'l*nC.~ *^ML)T:F /'8uu|Vqio/ZY_az5 |oYH~`4dS;0-^ɰGZ02 mNmXT: 띔G_,? f.4N z.'WZ ee(zp-whrRp0+ԾHk/lJJn:GgMz-P&AS(C p/9J_ԂGo ]Y0 J MS}ۤBW$/CM6@ fl@rkf瘸1Ӈ L65!j@\icfsQk;W>6l}D#,4$Upj)Ăq3[a6Qph![gp\`E,|7Fj^kJC]rJ$TxaZKR1 eS89ˬ0?(n{3|t"T#˲RQQ>љeѽᦄnދOL`dc%C/4tƺJgn: QgmR'2DKv> Fy5mGSqPeT 1VR r{WHJq3~*ǡYK)RE驵6.…kc;PLᨫL۩:;c'+7,˲ֹ %7~ـS<:!t~-h._e]McG:MkUm:NONm^%^Aǩlt/a|&%dE`\ΈZ(e2ًy+i4Yм+GEUe&޻8}Uj*!,Dl.N}q('#⚮RZB=ع$[ -_'4uW=Xn{9Kܓ8`AE oE0O[uwgnu˫u& t$\L#1Za)'m30KYPm4V @iB6 _8Ta΄ w6a2DD'Zw\s:]kq @̼,˺dl\N`(3R$uz$@nD&-aMql_C].9 FKqftZW0Q#Y߀uDZ ? "^ P*p0:١`W3Ax$s{n_gV> @# sBȷADWeFjeY^\%eZێ9>.V%,r\ǜ& +2ϝZ쟞#^[*Ys̯U=pyWcCP~SUُZ㥞윈b m.K?}ߏ6$;V|)FR.,-wp0(ف:{,7!/$rDڪ]LHj$uz=jz37Geao(0jvu[!Ut;{TW>+l ()s[1hL{EP)eYh^qfON:A-YNKw6(/-ItU=آq_^#3a\.YSO Lܯ宗eٶ Ț Z;yc=I܋M{Ñ[uNP.:D+am.ESPZE5zÎ b1w J'4۝q;&kv AD)JD_tV\܄vںO:x8<^6 %jmۼ4L 9n!&bYy`N M<|'Y+/eB;j^V.r]fe{)v K#\ʲm[iCKrߏzt5QS![~pyT~4iP7"dOj$D)N'R+ 10Dϭm(sY0UbnV:ĵ80KD:2e "Šx U&%hS8ZBĴ2SH$+9T=F'â/Dtq(Hn|qQUqODP̩ƄD2>}a@ ֍c*YNNif0qd^tbdOϮ (L$V.hs!}0#o6¤JY[Jg <9Esxs)UK* S:x!L^dLnJմRjq=@,qO;q/3C(>G2&(|dlp{V@9# 6;](-ػ$~0ӨQ-VgX Ka'AvTgDCbDD?'fa vVfjb.!y' ^RmYV#/k P;/zB~fq1HmauOD\u3l=V b^+rPHWFsc$A`b&b脑^_=6Z+ςʠeo&.l`MzRg6qF!A&!t#"NPJYUq23?cOw+q8{-.4Jssjws97Dd6-tGHKYdAG9ga:FbBط.sc4ɵne&Zi&JSGLH) |Xh 6#DeiAӮfb+?b.B=V1BA6E.j+YPE9`Gr7\hz@vq̴,.Ujl^͸ha6[[@_2x΢꺖Ůu]'.Cc.TLV%*5x`PDr,Bz)ҝCz2Б1t@"u8MMĥm|bC ܜ\" WT>`-`#/Ŏb%KC3'1&-fE)z6n9 [iD Ӌg,߲ԣc?hQkaM((^.mۖeE*=BM&!|դ |>:EMAEidהY̗ N.6)kiZ ٗ7U ᪥SIZg\g9Y\RDA6>sMY Z{tW.4Stw6u fkAYIˑe뼮vUGmT WZLDUo1'x<5z:(juִ[:ܬy#9XojA|TL[#U0%sL̼˺~ )3E#LHuBj_&t]a =H]uA^ 3:pƈnqn9@wI]7NGZ/Bk[kĔ?zץ,*W,:%`P:ӥicZx>w:BЦXh(h h~m_삗.sEmv]}g" #Ҵwm*A ̈́YI{;-%RMvvc~D7՟7`q|4FQ>fiجCtVĔo0㑭Z;Nf̲󽘈:Gry߶KXc*UץJLpBqy~ش~2% LEk.W,u]}VԲxYd$)R]߱Ƭm]K) :q# f% ,d&s Ʒ_#}ye(Ӎa7N^FoVt)̆$R,~Lp qAӿr]r^}G9pJFP;4hWOwj-<cC ^Jz(Du&5  M-:+xKm˘qBSH`Ss=x1m5 I= g N$- b_A܏#up{ԎS Q$ih~\߯$5 [DUtj?սm{>G;*H;yޢca25h:Ff[ItO]N9#U]ҦsXjR^wXeL٨%a eY/v^Pg,8(\W֙ԣa6|%V$$Sm&`%no^p>30AW4\{/S며#'(U;t|N{xMBLLF:5F ǶT}+-,s068vtر¬ KlO(BDܖT$gl{}\/rώHKR)`>Ѝ>0 "BD*Šc42|?OxNt ?yuz f7:$$3jr؟; qQw7jo3x KoO!5^'7  fR1 Œ̀Wd qߦ{[矟6)'dn &8s9!&fپIҲ;rH!":xdOK׵Gھ.WcH;@""en(bH,>mVF:&Nisxwp@'G7 ̼.뺮:!ГY(k-} uZ!SbAّk7v4Ott,̙34WD \I8x>q>#8W$j-Zݮ`Kp,&urJ""QnpU*bq*va6D)o~jb?T뛚?̳QԧoQj(\.ڙ j\9dv|vzL776r3*qYZ=1I{Rt={߷M3VJy]W~~)6GOKAa{7SRLLa9'Eވ{bi!uY2WXkݏ}=Y{:uf<3-Zgx/e(PM?rx蜙w"c$[{VBoYZyVf` SO /,-(N.=uݎDӭh\"kv߮Y[]uˊ4e\g|*U=ybǽqd%3DFv8:E=%I d,7r\ 'lğ9h/䒷mzqMFA 5@gm_Jw 1jZԱn%uH1eK>',wW_!?sWkuR*@& VLl8J΃&L-5dFH:=:7U '7胵Ehu^~~{Pzx<G^W0l{Y7lQ抏]-3.DVUM,~6jKh%oZF I5혟jø-`&&Y:Am[ֺ&NPGjɼj[J2],2 5mPHz8 ˘aP&l^I,_~W^3tk&,/D6N\?m..$9{Fqo|@7]vTTr\Ԋ;(9[ph{֕yA2xu<@S߸_cn{=ֻ]Y$жٵWƳm!j3 oY5<=WgU|u i*N}~wL^Ѷ67JPӧ0z뺾߮ROl2/6!*XRɦsj oVMLBX9lt 7E:%RKIf5o<SfKF. {tK58ϖJz!TVfy=Wxd+_0XU ,[0nY| cS*Qke.:} WQp q3 #e]kĶIu\E@}' ?T \o]i}IvG[U:E黓ˣ $noiW;xU,Ecߏ<Ƨrhmܩw>#Qk%Uw11 ΦGvGwz/w*ϨS 0՜RL#yS':xn4#BlƫƤ۰QA38! kSym=du駌nsG3*UI2@Up0g솾%Ծ˺jK Y`gb[zJqҵwYV2"mCryƺNf¬i$s:qDa&(c.˦ms_H!qvzZuViYoqHԦb׊ԦsU*%թ}cMg-t.քhRFᖺ珔;6s|@ / fx@srv-Ky>ggpA6Ɣ9w!Rf).rb#X O-q-X"z eeYt?iWBƨ3ٚ1OD|l8Q̚l 'HX!~W{KG: Dtr/v֑r` mj?]ֵ" Z,TgY!m WDDjdRl&LIp\Lnrݮ׫|>OfU-n, k/|{6N4Pw߃Vx{, RmeۺUȂWb`ފ]:exuu}znVk}jp9Nc!W"QګX zɤcHFt#EG] S2d?3LV`ʵg*-Y! }x iʓ,4Ь06z,J"*Ұjxb.8ֽIJ;iin3sE!RvhJ|fyVfԺWՕ+Xe%1jgqq=_a: Lv&m[YPq0mV 1 q"b.˲Soۦ}6M`B |Bڪcf=/OOz4?Lͯr$"\.&* '*@'Lg?^@t:]L7:>}%lKht>UmUBLv~ s^/۟?m}! )O/r\.YP!Le 30*@ W=o1범r']LF'gB<;8JVcdSY]x/ : IDAT`PT{-9kTg01'Ԯ#w6AJ$s0NG] 9Kp{ٵpfJBv݄q8, WL$R'Ѵm nA_?ׯ_uH'0Q,UɅbzm ̔=s:Q5n2mVJ~asug A 'D|^ׯ_'K 6ʓH$B}ɯcPM'x%$Ӻe8x`P WR>XɨPA##6<AӜU~t,l=4:n۞#DݺnDRJßZ~ӪPi,:ϣvkWULg,g/K^녈y? AlG7hhoB"RΨbfs|0]3@ tĔ/_7 5"g2vS;AsvoF 3S}E0:.wcUI]Okn+lN ;nCt i$ #y=S%"yR=! xmdFɼ =TWↃ ;5{jvB nGJH}h6cPD% BJX|S5@+}<S߫Ls\kE L &b횶 J70ϬUjx mmUyv=5h(H^0r{Io FeYpzp4yYV5B"ɩZIVH1z}?yi6UadF-7=ܲLJ*̫|󓹼ݖeٶQCp21RC꽽>??}h ڤ-w;t !:j.bno'ʶk\e[7mׯ_= b7x|%6?ʥiMʧz,07#9AJGE;`&ui!%DĎ m%Ӻxb5uDZ3-umW+jf [eVIO]X_YU沮H@btMd[Dy?oW\8ѽd{EBŸ5pRiaW ~{&Ez7U7ЯgLQeN3;% F-RO]Fƨg/Ѻul̬G4i I/ra描qxWMOYy5+/af'%a4z]y1Jy,ue\ :Ju- Jѐ _#Ō MBMuv~*OUӉ!\g 0-/ ""߷'"T^CWzI,0 G:0mLvn7n;6l'݁$=J)O| t]`^E?,AZ8A pqK1wrDDc Y@|/ Ә~̓~$>_>h!lڑWʼnT6 IZҾ!;HfbUVDh$\hk&nk fow,AyN}"Aeﶈw9$4WS}W!On`H*PPRڀPDf]`J1K>+ 0\ߤHe4+:p>U޻um<wM5`>FXF&lowfB t$$#"sSnf |:d%WIt-Fn(w50 SbhOwe4~&s@mׂXSE68ٍ€@9 },j3@~8eo!^s{qvx0{1py)EOKg}~~ޏc7 :]0ֿ5 xzCSV=^^y9NfMϟ}'%JFt^vl^ [x  S^̝k? 8 4 ] ` ]Ez.˯_{sy6wzDf`#Rl݃Jr>?qض/pZ 0HIQ{olF.솶< ؁vղ@l*#}Ld<)h \R6bl?g6^o}Co(Ӭ.3T^ݪk=|'lmn[ RRnr-D?lg|(.2ImRdoooo˲]QR!5\me.j٘;LL̤ vtv(A}t#> ILGRu$ݧdwo¶6_`Zyv0D^{4  @P]$Ћ6<#v07t;7D3kf۶,q쟟O G83@2мmmێc?m<jb egz#+\> cҖ QtpTQⲮ y!†DF;olm7ke;~z9yzJ!u?`>Ac*VuOB't`f}>w;>B^t5K,ղ^D~ z;KK-T>vh?~Ry_ "P/h#9b]xT"^ʶIR9ZGndӟ@Muy{{ݮ?cPsL<-D!&"^um$ZulӸZtT8/ղ3d4jT^6.|0~iHcGpWԐT@DR4 cJ$tw ]1^OQ "^/^Sid)'$a_ʓ4^o̶JǷej/YxzNєr}_㗝Vib~2K]5d#VJY$";=,)e8SE`LFuBhS52mhw`<}etG:3n\m1DJִ-V',e]7}ߟz#^ΰii=\b{MBeY>>>>>>##HOS  _2&$nRߎBf\>?Rnv{c\ Me L,Q?ӏ=ss')d-7*lODzfLnG&j;vR, IX\:{`ϥQ^(0S (D)L3ս]:sCw|l{ۊ8LPHzM|ڛm*XmАPiI)D܉OR^v~5XmT V3ɷۭ, [:eǏSOPDIr1FS=ii%BuDk7K)붪ѱPAhE >e.DDgzmW]09{~WRoo7bZ" l鍟?(nZEW9Z lD32L#p'E9y@=b*B>xmbvsI%1H򚙀WngYrvnJLu^ SwŒb"rl?j=~uAeYJY.fX#6YeZпndiE8?OoA'I3Gu].KrK18@ZkY DI,S x%~j;N/ꃮ q|nuprewh/c9qP[/q^&(V㡎CxNWy1r6hu}oϟ wdTʢNEQiw۶o]}C%YA:<쵑hf.qDK:~Emk{V̠NRG < s &o3\ C1ctn*%i%GH,Ν2(ULJm 9:b74' DeƟZɶ~.0=euM gϬJKB2CxiZ?*"+kQc |eY5{TN#1UWZXezuߟx^ocg v, qv{<.nj06Wݗ[QY=҈DP\Bxg/:<>gzۿ̼m.c;W8 yPW(rfNjdffZ Be9{_~q:\TB8!bOVD Q)3mǏ|>???tOas+̩U q-zlRE'/r*eՙb՜,Bi@q]m,ACGE&d! ?%nZT W! |F0DҡG{v }j*m?ݜ^"z<4/%~o>ֽp1>"C=Tu-=Pvޮ?ێs8ƣ%jG l{;FC'LJala$AŅJуԌ~~B471[4Bn4 '/LP1wft`tK$ GP%0^+b a7;:KDE4P'Rk*Uմ& ֗=Zrޖ>-qr>'b| Ht>ʃ#ug~Qp~<`"*M?W>2ۧײ,y\ }#k﯐<^o`f˶ B}oKvw֮? rK< Ն`LgBs],ڄ6RtHh('5Jcaf[jR4e>lSXŀ=ȞC%chhNJ+x8vS7\ewݥ9ln?1S)FDi0&.WDStmDz,#\Rz0Mcr]5dMbR.-ƚ#$~o|J#~3/g@h15>lDaW/fR;KDڎ8|k1C^+sˈ;cn,eޮ۶=}JjqJYEOEҌL_5'enŶm{v? z|IZ1(+p<2'~ .y^a)IbZ{5'ۦ'l>rXCk(WȽ!s8*D5SyG~~x@D5Fyt"6/K[M'y<`-˲m 2qCЩ[o].qBtpg& IDATV.RN,rtKdk\SNOD3NрGr7Bp\W(Kä|Hn*~^ĩ-c&;WE8?~2 y0,5b/$cuب֦ܲc =@?cDqo9y wNm[o7f~>ȱUnK ̮-e!vзo򚊹άj)9v߫R]X7^eRm E?y?mK;TIb2=>7[yۦмn Bfڪ d6i)WdLZ^i]W= H0h;2z ڸֶQ ٠hv1?5aZeQ[ڋ,5|C<8 +u/\#q/h}?aLmD*Uƥm&˅v2[/^-FQU/ ;ƶɳ@D}aeY/.~0 B ^- 4j BmڋćLO` tݫVvzq^ogy^|>@FFbPԺ#lno~x/}K)jb3lcGD$k5n]J)zjp~!YgiFgm 0Io/ ّl_K) 2Q*` 3-eR5$zF$A<$Y4ٻrQdRJYq|CPSW b;&6g۔aICvvx,e\?~+{>CO)UKD݆X4→s"/Ѵeu ROE$yYB\"$f5@8)rl7#]O|k68|}S8I&3Q,O@󓕪*{i}~۶oCOʨk-%N:\ԵaRP ?K@X`ՇPUl>}e@fd]BwG|,Bѱ#*l=3<1ԹȎ>JV,E˶m~{8]xͿMҿ?]<=tdgq}:h v]k oDLnhc~df$%=&ΤV֪vR/jKO؍vrHOp@C ҭ󧗗"ڶm}߭vXf"hC?5:Uۆ/R[+5 Pz[VJ9Ř'%W4$4?F9ˌ:aFCgzZ<$yfU%5B% Qa}Pp5.81DD}W{ +UED>/̓kƉ_\n~ڪlۦ?}}rhEˋ:kel[ցrcb̯_?X؏q?`RK fOoyH}6@Od}#dr0 3GKMny Ӛ_:i Rҿ1Vn=E+^2uAB=,SZbPs\V~o -}U"oE k. (G"JaKCIԳ/<@Jf/˲kx< Ǝ҉H>3O4~31h$ញΐ8UkjK̎}Ja>QMy")vMhĶxuu VM>8 !g//3t{̾۾2#2a BDUO_)%MbW2> ח/_>y< fY)׊z%yC]Ȝ8&$vٓFgsYlŹ=۹{NaL: %-1!iriPlm-ܣyv\D>6m'iٹ 1S*d(sќ "V>r S~_cĺ#IlƩ/}pbeР}OǮ_(dYNAMM0I2>yx=xL6*F2KN~i)[j 9*n]q>ޡLؠ0YӠ}BM@Jk~k>]WjT~5^yqQ uIlus=9FӧׯOoZMZf [DLM^uݴi^,~03kCyD2Fb8Yv'Ir˾"2k~&HST@(kc~ 4 tHhwߞ)y}V".!xzUcgFT'ŀ{\b5ԇșueYD#UET<*68Bqv/՜ĺqʘ]\hg;Q9o>M{y)~-6|?EF |Yt&M7Vwg57Ui&3㋂\iVӈ 4I/a?$D-ɬ& ̚zSSہxcƞ*Q *}B`B˧^Kҷm..,$fRn (!sVp.WeSne`jg89&j9չJI#y`2%O|+Q4SlfIPpxdXR}xFT!~ UmX26Ϭ-DG- !NޕG!$x<,m'!0Dg_I0'ğ> Xp:ጚٮ?ui9zcǡ_iTcY'$t BLoLHߜq鵔ʼn'L}X1 }8X!t<'\18Z0vE^_ 6L݆]V$+uΤAՓ>}RKuVv$9g+xDDԴEO:u֡bzLR~!D˳F)@,O,…7t{P+ܐrƗpn!7I2pNlG<@Wʿ<Ž3qdڈlvII,:bD--V7;.0 .MqV~ lPL@xwQLEDJܦDiig<?]$nGW¥HOQmf"fm oDYޙ4>0kk$|' ̉K*Y? ɚTZ5O l!n" *rɰU]A܏(wIwAEPLӯ)bytJ8)!&;`΄ L~%>jYK1 FJY@cS$uVFV0if{}(0BBo(qy" Ewp[y#sj0׹0#.O z `L@z:' `]2h9:4&Wp)ǍkZ,vB# zEٚB LDLp^4S(#"$S㸝=K|*,_9j~n IJiѶsءlEmdR3:& Ha{hw(pKV|&1&CDJalQVdHFFH?gB4ۼ,㈹Bq1&DQSK~J _I JO$f[}z3p\П(:7…QD~t ܫp."h3g Oi"=I%LDStbN),Ӑ$ ~>>Oϑۤ %cuz} ;A.kR^z @z=?Z/_zĄC/.!!齷]ZP!hn4o3!/ՒE)RB2 7 g32wK[<'?_N ~GÔ)ϢlRc0ErNRrdnf~hfWG 8lҰ'q/q<&)'f I= }Oވヹg8Q;L$ !rҧ͠OJ޵?\G/@}O%d hv_U=@O̍kO8+>Nd6Y+vNƖ,am erO~jihBl>ϗtU0 yR9{sSϽ+2ʜO)+ n䮤3=Qvwf̊F<?D,Di^OrHV8̀Ā_w@<;%2{iPwn뺮Zh.!QH>!r/>4yZpdwmmqO~2NU2d@]#8Y|1vӣE]a<@m]zF=* >@ 9S "|Y9=҉|3Pp?VYZ}2.Wѷ!|eYxѤC9J2?鬯,TJmu]6͈WڻD]}w253ХK?.Ա5EX{u,k4Ĉk4Г=pCYŧz/D厞\4y7rMQAP8 55%YH\X´=LecB2'z*=eFrsXYdXd N8@ɼܔ׺<<ץڢk-BL~8"ɬtgec+ᬢJDRJU^Ju䢜PBB]@|O\(y]WT4~ڰ4,$s&dx3%sR;Z`dNw$x#rjhys*!=kSk[8!̝1ykD<o/0qQAMCRfvˢ-F-ށHȱǰsLҏf칢i@Y, @*{|R0Lᑅ-2O^+%L6.7`](M}mzuه:#O#ȔX ԍ(~|6?&+#ov `3qafCr@NVa'@h2HcGձRzi=e#.K0U<uF@<* mY TޭJʗW+fR5qD`HaG0K\uYV*tNY<㕐OGŀܓK0.{HHxdh&hg.yW%4 1"N16݋Oj<ϡ#;1N;7qgN!̋+537 r֘ٵ_)m]eYet ]NZLGBDZKq{?-UKe\\> ] WR  O~(|lwqL}_#>;$%ӄRؙbOa~H |f+<(qƃGHԹO, -͆"40?̈́\KqSp7 A;Qyީ2ZY([4-kA D$3jm,c K^qaK Gw5.va@Wrv:/9;焉T_^^eYOնUWB d1F]e{ɸ1cD'd0$LV֛A&&@Yyx{!_ "d`(WJP܇c`u+= Lpe~96#b/xqyĖsR"҄bbbj.WҥA$5nͭ`j/!).RK-q@O DU;߷Vo[N`0/ uq@"a3 RVp}4!HznV:=kR%.xLy"-$  d>prM*vѓk4&P7#82{|fn뺮 Nwˉ~.H֥DH<ĵ{}whOF)sնQC["D1yj`t%Jp*O2u;c]h1N.OR< Ӭ]d KL bil i`"q&1.mhZ$B7Ue9bd2Ȕd,[@HF} 8mh*2hg2÷|cuI$@đbI|N(FM] bEbr貴֖* u}n Qdb/| u Չ^r IDAT9:;_3DOhBqx&#~ĜfedNvom'.WGTg- JZcӓ3@ l" d#<^ap!n΃:9eCh!G#܈՗D^F 1<`S=_Ъg$0oEh2i ZlM<+$,t3 ""`u]w] uY䞠q}߼Ro:`j sGa'^OzZ"yѽZJv 3m+{6 HGϦ-Y|Q62X  L2@I.ϐ8L+ReFr%ig;~&#,hTPK*Zn)92JrJT~|f;2Jag5K##)帏=% 2dR=R|. ?{?D,ĥXEK{/rvhu!f֩]"^LFh#MhߖنjDd#DypغIa7+U#ag:ޘDJR$%!n8w/vj9F JC#{Xg * Gs!E0,Rͯ䤂6Q^s Y $$e]|L;:,׉5.Ѧ+ajB<͵"WZqƆy'TPuR{AT.&YŗNf"Q:%3RjBj[p|}>Rb]'igte'`BK"Dўm;%>2F; GRgB=VZ æ8H̻Ep'ovHլ\}DIYοH'aG(&'s-y#(\aH) n^sԴy:"0@t`i=]7jYm8 N(m(J_̖`=, =nܤ(t?o~֚mcb|9Y$?9,))¿I1K'Lڤ&^RPe@ u~o&3֧JJ6"2)UYqq>%f)딴EE?b"2A~]͵Rd_`~_ks7c|a'kӴv5 yK<&?h_BR.AֱNyܪ" Hj&t rR018J֬Fod cG$f"ʘ9@$ :y҈J,>gncViUQt&ʠ!P~͇6j7rCLRtAL6o8i!Z Vq-q)\ʬ/ro艧O(±S@Af^H<6I/Ga]r^ÓTھ|_~?~;9|:|ʿfZu]ȋΒ̶ҥDuTo6 +yE5#fFˠO7wVYf.D]# 1S񶭅`QS \h6Ϭ@kѿ:3Q{KjC2^8BCRL@6aw]fv2q$f9f"[4;=BN(U@nhh bfNa.vccS׀8MN㠠uC,4N$E9g& bê>A W B1+kOnO?oN6z$Qw믟?ڶn8RkeY0Sa ;V:5C Q谉TFk;]!@aٜP%p" d|O)2Vc@z:-F/stOx Wrneh;!% ǯznVH (5U}ƦP0ېhDs5[g^<l>龇ĉLXUQ)j)8Xk:I9ڕG7Q{NyW^jn_?x<DT& |RʕR۶>S!O@4AD_Z%7BG.>=|4N!!Ű HƤNQ:a.,Z-ؽe w%X g1Gns xB=qXf?:`iDLEV䙀p|CZ,eTy} L@G՟x>+̉ ' kDS(/$9DLq{d.Ƞ:3&H_]۷o_۾*ir|OPUsaꙝeimh:L2_HnÃ҅vZW !`sv'Yg'MG-gf5xFiR"ȁ=7Ǫ mV4"nYͨ}D Jm+O}53:NfG>޾)vuV^X@hη̡"g-JR8c (6ܥ,>:fzI_~u]*Xt-j j(`+K~x(h& FHA6Dna-p"$n,2F:D'"?S0.JېǡML9l#?I &ټ,9`2ˀ#:Y"KB,duKr,IRY rNI3Jx6~ _dO2sz1~Mafvo4u1o22Q"ɽ奼|nRkj`'cBd[Jw°Q`W AtZ˯Rr~"7bw"M'(\XUeYҫ&ŏ֏HL U]_'¸K/'y j-ostBi>a{XK'>k09! —8g Ԫі+us9dXǫaFh]MG%U869ɖMiѠM4uWAP;;) gŠ\=F 2y+0 m8Hպjxp Cqs}]ַ?۶z$(0!Ŷjk)ף\-N3cp~Q>~w͈x: @r,x禦?Uv6 nخ8&,*Q&@Hf hĥ5e\~=(2Jz *o2(TɶjL3w=H0!idjlOLe]}CE&EZ}.`wi! "e[t0bfB$z%Bg6e[RuP/BD)-Ҫr\Cz zrql8vݙt[oMs#9b4gP Vo'fn) hDʺlgm4<f_͛{hЫ'8't*{zfCx/XQ&R? d♰;  Pxx0\j6&CsCҢIk0o-6{۝~d*T8N$!_'ׯa,nYV8_bbeY4)wyy۶BFG/m)gɷ{Z%[đi~fKbYix]NH#ugEp 3qK \xnSj>ӆ%廩A:} zbϐ詖"IѤCa  sD  pf(mq1tM~R"jmۖ+G+AQo}+1}魅1h3"n_x<~q;1Mzgcprdщ޻/v!PQn&X'W lNal$머]QEa%%lU$̵._2|8 `-BCiz[HY$kϤ@™BTrG]UY383en޶LQD5ʢ̪v~~kؗe]k6-2M/]L*r 2ebZ_{yoퟣ̬kN&Ũ}&{_K?߷}'֖ !ElvW}"q|RKN"#b`R-nHc[h<YmxŎl}Fs](1:KWel<򚝅DvW91yQWEUh/Bk9W {?a6i(6.oʇ9 n| PJ5>Rjhg\Y hkt̨_2.Zov߿icsF+[yo뺮۶.˲|}뺮j pɈ๙W{]{4M*ߎ /} |xeG ?$c m4jD6bV@ٱp=K Dʺ:q_os:80,YR AuOM/LGO)JP"\K٤3 ADu]m6Me۶R/|^~3[mqG ")r_~_nNA ?p~o|}}e]/˲+lg>nd;GDjp^k63 aB'1C|!<4A$v?eXУg_Vރ-Ay@K@#2_Ik?$ODi+l'ٻ#vG%\#8Ğ-u:@$GlڸxI31e1w1 *vآDضmYںN&X}=˗/_Z[m+A:C2c Y`AUͺG?M` 8ue?~h~#[rݓT,8O/ [K̴آ$e44bHR)]l:PT qmes PS̈wp[FSޤ4{q(ddH>ضt)YΨM :f06 >'J%t9 d;7O=aJNAc5 7N$9Z~!u])UapqK}6"Rk]򱴖m_V.Zmjx)I/;Ը#*m޿K5K/'ɫgwz&NB~Ac6"Z z4p (b<%MQ _F@Vެz1TЇ\4C\H Q=ʆԢZ&Qۀ%\(ӱ"=mDut&aFJ" vcD&XLum(!TkUSV)`)sk~ׯ_Rxa 0DȞLҢ DW2_=]u"RA`#1_ljyٖd^,W{b9BG=1$o8QD<sצulq۶Z9Rxߏ8~֗b:, Kں,V?/"$ 1@9͗;,$Yz&3l\nׯD۷{KsKkx@tM "|KJkTJZ__Y1 Y*D$4N!  >{K7-a<h0+wᎢmVi%d0=RD y XC$o*?ɹ]9\PZܣZqPhW'@ w$ƴE)eӰĚ C x_#krd4T}3Nж.x&ZO0%#LP~QBS{Hnt54U&$?R4@ךrv#0I%>{:/fE DDԗϟmx1Hf*:LgO&2 iZx_::q^^>)_ǼXT_@H(;Lv!IѹP ɋQe -bʴ\cpnp9n1wK{Sl|nT0EN~^|}(h09Z{qvc%8N~5ؘviuV1TdEjKs+u>cx>.Xp˾oo?mӣoO:5ĉQ$yk&$TD8F nfZ{ 5ׯٓ$CB˃nȪ8GwK=I~ B]D>z(; 6NӢLWZJ>375wmLK'5 OV8vDT#A|kMZ^^QѺ^π D ~0n,ܨ*È[{uI|u>5ǃy' &5Ngf̙b 2⛦a@ԣ<5h"Z*r.".,K;t}iK-6UG?B@4 7bV;hšgb~ >j}lxteYu1P92 2/x3&"]M&53/˪kѶkD}`v'J2ˈ Id(4D[a$F;'J'[NCMCi;2=w;l3$ 3(dB$8坭@X# 1S32euV4[k]8ǦD7lvݙVK6Zf8z>.r[';O0;Uu}ݾ|?=x]eiyOxKlܽy慎׊EpNbAfW<Y>Rl"F`{SP6LpN*tfZcv /Ioa-@RgMi\NiR真R%yH ZRvl[DWtC鏌CGG(Q !-$9*T dY @ѥb Zk5]R~.f^ץEbϟ?x6KS IÇ_\"KxB?}0zݽK-05Ei+(!q7,u1$4~>vrl7%H_r@=epX'"vȘ Ʋ+_+<syRLD(+{|Cxdx9 zP"]ܚ{^-X]RJu`n7-ókoJ'dg Q7wm[)eYVTf߸?@._G5sC)*d~|V{mV(\_&gpdF9#|A9T0Tai7g 1ˤ [cT,B̽LD9we#&,;%GS8{.>@_ԨFs D4@hFY p 5Nn"8 smL ~nv2j^;39\뺔gv5rUkaϟ?+{{Tu]5M)dQ)4b gJڞAĮDLa$.nmy]\>4}-Cb0?qVZf" ="%*v;ob cjS)nO>1m{mYzi'g%r)Hϣ~c/YMՐRW.qvmΝ>"Υ!jwV˨bМ۰ \9aɼofr@ᴃavAYۘ?2*0~FwM,~1<,ALN{?j.l׈Y.2&'CG Ssj"{i6P}JnuHlLƒ!b,҅8|oA憛K-VUj&auޛ/0Q| "+Rpxcٖ|=N?&ia"WA0SuaAdP3:},y%gQÜ[S /2Ӌ~)'Ai݇ `_ X\zceqkj&ru6V"jV0RI]UUYe$&sbXZUtm'uYkkOcH6o$S޹qE Pǎ_m FI=TE /˲ "ya+~ *ڊVX> VsE.B%Ed[>O{WT[](RG. !@AfIp0J CS𹐨Lmw%B0Ru{,`lf`r#|dĪH Ppqݨ^-NgR4X6"ںff2}x<63󺬵MP44D'K$d#"ݫ@~mU]ZB8jK (vf,8"~g9@N[=Z)/3f]JxRayu.o%$bvw))T83\e^lA,-~7y0M"ҹࡲ(*Bdv-) EV360PvB[@K(adq)`-V/YGBui7IyM!̠fPMKF N3;;dmOt$`ݒӔe33H Y.1fD-˲zj}xC%nek a~A/\)T )^YdS33YXq<1̶`=Сv٫Rg@Z["r_Cu?j$wQ")B{-5~89It(]89CӉ3bFTp LVk Z% HRDU]' " TO P2EL(P lƝס"WcXCDōKՌ֪M fV_4~_0yWI$rqđOZX=]!n/<te$q76 Je*V;*aK&l['mRo"/sں 1)`Gٙ@.yNF7nqoɖ7HVؿ$A$4.>Ai$qufބHerˬ!xٯUOĞ @?>p4CIsנ rXZ%$qq-vA=O;Ql)G]ϠR+0tg='_ޟ)5ŚHvΎ>,P\0γ MѼW%l&훝j?h+2r]c̽ sO[f3!ңRF SQ+`q\(R϶8PE`(h"eZR37;gt( yΰn`8@aH7H fJyfȰ/U`WQrDd"qXpx9!tfz5J3dratZΟajILGK()<6+Ⱥ8Ǿwbz鏙 0'@|C+9؈H+]f)3. J Մmy hgc5/%VYFj5q%i`|7?[jmRQ_rI)E3=>gќh7Ek/v$Ki\p/|1R0d>q"F5R=-<12t@Ef~B8M.Er,Zgm(=Ngnkzn3qD};`BZt@$Ȓ"8~BTVZd: +x륽w|*UyqODpkuݶ]7-Y;7&͉RڙGX5Cfל Q̿ő+&cBhg%ئ;8Uv3a_%RZȡ/^ugÒ51P9L9ȵbҴ4owZFv`*r̜!(,BIFgYe^8/\VK)xW+arPg:ALµGΈlf^EѓTkؙRAh,ۨ_'E ػi =`V faݑчzM&&~OYtGOjIIu $-:!Z 1LL]F*iX$r2=>u"vJ̒ NLy&^,WsΣuSԜojiM*pr`jȇ}Hա:A:Q)iFu2I:|#dr̥ҖVkծ}E#"=TuigSr';t.me>K>[G`j%Ԛt@lqK9H2l[q-9Ȉ!ho^ Č!ƃMP%{J F@|QD%2y! /ɜX?cњ8 _OFN-]bRNIhgU{&4we\e[zCwRA &1=dHq-4b 0g|d'lH"LNɯZBTO&|qn:j[K ]S̟G;~ +fOR9I@]ib8uwe6sǡ1Qt/?;HrܶEX}N.6AN:WS,L}㧀M0mX,Pݏٺs9I2A/3?-sF ^GL_Hu}\qW[,!cxΉS^4-:/~>yyʦlG~'<6d(~ ÛX)(v4"q%my,I>gB4[!$)E=2|a!FTvd2q{= deJ"6Z>ޢNjtSCGJLM4ɼ4Z_-Y 9`miY7#|8D srB,+"!BxC/p~ v9͒ >?OtZE]QNP_Ղ#UҫPc]Xu>ϙJ+>@2w쨵A6UZj7sjc]0IUͷfɟ K%inPZ!+{7WVމ"w2U[T]VZ^g$r KӄsPJdr$lpӎ;`wUuD" H?2(e)yT$~[-LmR2vz%jK9Zfdݶ}۞i eY -d"`,!rC_NW\e1H=|gh?4%(gVWn]#ڡ7QmDV TGWo mB+wՐO? d؛^TT|#^L52,[. VX2A5=#b[ Mc| VvYFI7zk ճʵvIENDB`libretro/jni/Application.mk000664 001750 001750 00000000017 12702465756 017114 0ustar00sergiosergio000000 000000 APP_ABI := all libretro/scrc32.c000664 001750 001750 00000007715 12702465756 015017 0ustar00sergiosergio000000 000000 #ifndef _S_CRC32_H #define _S_CRC32_H static const unsigned long crc_table[256] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL }; #define DO1_CRC32(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); #define DO2_CRC32(buf) DO1_CRC32(buf); DO1_CRC32(buf); #define DO4_CRC32(buf) DO2_CRC32(buf); DO2_CRC32(buf); #define DO8_CRC32(buf) DO4_CRC32(buf); DO4_CRC32(buf); unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len) { if (buf == 0) return 0L; crc = crc ^ 0xffffffffL; while (len >= 8) { DO8_CRC32(buf); len -= 8; } if (len) do { DO1_CRC32(buf); } while (--len); return crc ^ 0xffffffffL; } #endif core/cart_hw/eeprom_spi.c000664 001750 001750 00000025155 12702465756 016615 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * SPI Serial EEPROM (25xxx/95xxx) support * * Copyright (C) 2012 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /* max supported size 64KB (25x512/95x512) */ #define SIZE_MASK 0xffff #define PAGE_MASK 0x7f /* hard-coded board implementation (!WP pin not used) */ #define BIT_DATA (0) #define BIT_CLK (1) #define BIT_HOLD (2) #define BIT_CS (3) typedef enum { STANDBY, GET_OPCODE, GET_ADDRESS, WRITE_BYTE, READ_BYTE } T_STATE_SPI; typedef struct { uint8 cs; /* !CS line state */ uint8 clk; /* SCLK line state */ uint8 out; /* SO line state */ uint8 status; /* status register */ uint8 opcode; /* 8-bit opcode */ uint8 buffer; /* 8-bit data buffer */ uint16 addr; /* 16-bit address */ uint32 cycles; /* current operation cycle */ T_STATE_SPI state; /* current operation state */ } T_EEPROM_SPI; static T_EEPROM_SPI spi_eeprom; void eeprom_spi_init() { /* reset eeprom state */ memset(&spi_eeprom, 0, sizeof(T_EEPROM_SPI)); spi_eeprom.out = 1; spi_eeprom.state = GET_OPCODE; /* enable backup RAM */ sram.custom = 2; sram.on = 1; } void eeprom_spi_write(unsigned char data) { /* Make sure !HOLD is high */ if (data & (1 << BIT_HOLD)) { /* Check !CS state */ if (data & (1 << BIT_CS)) { /* !CS high -> end of current operation */ spi_eeprom.cycles = 0; spi_eeprom.out = 1; spi_eeprom.opcode = 0; spi_eeprom.state = GET_OPCODE; } else { /* !CS low -> process current operation */ switch (spi_eeprom.state) { case GET_OPCODE: { /* latch data on CLK positive edge */ if ((data & (1 << BIT_CLK)) && !spi_eeprom.clk) { /* 8-bit opcode buffer */ spi_eeprom.opcode |= ((data >> BIT_DATA) & 1); spi_eeprom.cycles++; /* last bit ? */ if (spi_eeprom.cycles == 8) { /* reset cycles count */ spi_eeprom.cycles = 0; /* Decode instruction */ switch (spi_eeprom.opcode) { case 0x01: { /* WRITE STATUS */ spi_eeprom.buffer = 0; spi_eeprom.state = WRITE_BYTE; break; } case 0x02: { /* WRITE BYTE */ spi_eeprom.addr = 0; spi_eeprom.state = GET_ADDRESS; break; } case 0x03: { /* READ BYTE */ spi_eeprom.addr = 0; spi_eeprom.state = GET_ADDRESS; break; } case 0x04: { /* WRITE DISABLE */ spi_eeprom.status &= ~0x02; spi_eeprom.state = STANDBY; break; } case 0x05: { /* READ STATUS */ spi_eeprom.buffer = spi_eeprom.status; spi_eeprom.state = READ_BYTE; break; } case 0x06: { /* WRITE ENABLE */ spi_eeprom.status |= 0x02; spi_eeprom.state = STANDBY; break; } default: { /* specific instructions (not supported) */ spi_eeprom.state = STANDBY; break; } } } else { /* shift opcode value */ spi_eeprom.opcode = spi_eeprom.opcode << 1; } } break; } case GET_ADDRESS: { /* latch data on CLK positive edge */ if ((data & (1 << BIT_CLK)) && !spi_eeprom.clk) { /* 16-bit address */ spi_eeprom.addr |= ((data >> BIT_DATA) & 1); spi_eeprom.cycles++; /* last bit ? */ if (spi_eeprom.cycles == 16) { /* reset cycles count */ spi_eeprom.cycles = 0; /* mask unused address bits */ spi_eeprom.addr &= SIZE_MASK; /* operation type */ if (spi_eeprom.opcode & 0x01) { /* READ operation */ spi_eeprom.buffer = sram.sram[spi_eeprom.addr]; spi_eeprom.state = READ_BYTE; } else { /* WRITE operation */ spi_eeprom.buffer = 0; spi_eeprom.state = WRITE_BYTE; } } else { /* shift address value */ spi_eeprom.addr = spi_eeprom.addr << 1; } } break; } case WRITE_BYTE: { /* latch data on CLK positive edge */ if ((data & (1 << BIT_CLK)) && !spi_eeprom.clk) { /* 8-bit data buffer */ spi_eeprom.buffer |= ((data >> BIT_DATA) & 1); spi_eeprom.cycles++; /* last bit ? */ if (spi_eeprom.cycles == 8) { /* reset cycles count */ spi_eeprom.cycles = 0; /* write data to destination */ if (spi_eeprom.opcode & 0x01) { /* update status register */ spi_eeprom.status = (spi_eeprom.status & 0x02) | (spi_eeprom.buffer & 0x0c); /* wait for operation end */ spi_eeprom.state = STANDBY; } else { /* Memory Array (write-protected) */ if (spi_eeprom.status & 2) { /* check array protection bits (BP0, BP1) */ switch ((spi_eeprom.status >> 2) & 0x03) { case 0x01: { /* $C000-$FFFF (sector #3) is protected */ if (spi_eeprom.addr < 0xC000) { sram.sram[spi_eeprom.addr] = spi_eeprom.buffer; } break; } case 0x02: { /* $8000-$FFFF (sectors #2 and #3) is protected */ if (spi_eeprom.addr < 0x8000) { sram.sram[spi_eeprom.addr] = spi_eeprom.buffer; } break; } case 0x03: { /* $0000-$FFFF (all sectors) is protected */ break; } default: { /* no sectors protected */ sram.sram[spi_eeprom.addr] = spi_eeprom.buffer; break; } } } /* reset data buffer */ spi_eeprom.buffer = 0; /* increase array address (sequential writes are limited within the same page) */ spi_eeprom.addr = (spi_eeprom.addr & ~PAGE_MASK) | ((spi_eeprom.addr + 1) & PAGE_MASK); } } else { /* shift data buffer value */ spi_eeprom.buffer = spi_eeprom.buffer << 1; } } break; } case READ_BYTE: { /* output data on CLK positive edge */ if ((data & (1 << BIT_CLK)) && !spi_eeprom.clk) { /* read out bits */ spi_eeprom.out = (spi_eeprom.buffer >> (7 - spi_eeprom.cycles)) & 1; spi_eeprom.cycles++; /* last bit ? */ if (spi_eeprom.cycles == 8) { /* reset cycles count */ spi_eeprom.cycles = 0; /* read from memory array ? */ if (spi_eeprom.opcode == 0x03) { /* read next array byte */ spi_eeprom.addr = (spi_eeprom.addr + 1) & SIZE_MASK; spi_eeprom.buffer = sram.sram[spi_eeprom.addr]; } } } break; } default: { /* wait for !CS low->high transition */ break; } } } } /* update input lines */ spi_eeprom.cs = (data >> BIT_CS) & 1; spi_eeprom.clk = (data >> BIT_CLK) & 1; } unsigned int eeprom_spi_read(unsigned int address) { return (spi_eeprom.out << BIT_DATA); } core/ntsc/sms_ntsc.c000664 001750 001750 00000011616 12702465756 015621 0ustar00sergiosergio000000 000000 /* sms_ntsc 0.2.3. http://www.slack.net/~ant/ */ /* Modified for use with Genesis Plus GX -- EkeEke */ #include "shared.h" #include "sms_ntsc.h" /* Copyright (C) 2006-2007 Shay Green. This module is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ sms_ntsc_setup_t const sms_ntsc_monochrome = { 0,-1, 0, 0,.2, 0, .2,-.2,-.2,-1, 0, 0 }; sms_ntsc_setup_t const sms_ntsc_composite = { 0, 0, 0, 0, 0, 0,.25, 0, 0, 0, 0, 0 }; sms_ntsc_setup_t const sms_ntsc_svideo = { 0, 0, 0, 0, 0, 0,.25, -1, -1, 0, 0, 0 }; sms_ntsc_setup_t const sms_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.70, -1, -1,-1, 0, 0 }; #define alignment_count 3 #define burst_count 1 #define rescale_in 8 #define rescale_out 7 #define artifacts_mid 0.4f #define artifacts_max 1.2f #define fringing_mid 0.8f #define std_decoder_hue 0 #define gamma_size 16 #include "sms_ntsc_impl.h" /* 3 input pixels -> 8 composite samples */ pixel_info_t const sms_ntsc_pixels [alignment_count] = { { PIXEL_OFFSET( -4, -9 ), { 1, 1, .6667f, 0 } }, { PIXEL_OFFSET( -2, -7 ), { .3333f, 1, 1, .3333f } }, { PIXEL_OFFSET( 0, -5 ), { 0, .6667f, 1, 1 } }, }; static void correct_errors( sms_ntsc_rgb_t color, sms_ntsc_rgb_t* out ) { unsigned i; for ( i = 0; i < rgb_kernel_size / 2; i++ ) { sms_ntsc_rgb_t error = color - out [i ] - out [(i+12)%14+14] - out [(i+10)%14+28] - out [i + 7] - out [i + 5 +14] - out [i + 3 +28]; CORRECT_ERROR( i + 3 + 28 ); } } void sms_ntsc_init( sms_ntsc_t* ntsc, sms_ntsc_setup_t const* setup ) { int entry; init_t impl; if ( !setup ) setup = &sms_ntsc_composite; init( &impl, setup ); for ( entry = 0; entry < sms_ntsc_palette_size; entry++ ) { float bb = impl.to_float [entry >> 8 & 0x0F]; float gg = impl.to_float [entry >> 4 & 0x0F]; float rr = impl.to_float [entry & 0x0F]; float y, i, q = RGB_TO_YIQ( rr, gg, bb, y, i ); int r, g, b = YIQ_TO_RGB( y, i, q, impl.to_rgb, int, r, g ); sms_ntsc_rgb_t rgb = PACK_RGB( r, g, b ); if ( setup->palette_out ) RGB_PALETTE_OUT( rgb, &setup->palette_out [entry * 3] ); if ( ntsc ) { gen_kernel( &impl, y, i, q, ntsc->table [entry] ); correct_errors( rgb, ntsc->table [entry] ); } } } #ifndef CUSTOM_BLITTER void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline) { int const chunk_count = in_width / sms_ntsc_in_chunk; /* handle extra 0, 1, or 2 pixels by placing them at beginning of row */ int const in_extra = in_width - chunk_count * sms_ntsc_in_chunk; unsigned const extra2 = (unsigned) -(in_extra >> 1 & 1); /* (unsigned) -1 = ~0 */ unsigned const extra1 = (unsigned) -(in_extra & 1) | extra2; /* use palette entry 0 for unused pixels */ SMS_NTSC_IN_T border = table[0]; SMS_NTSC_BEGIN_ROW( ntsc, border, (SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2, (SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 ); sms_ntsc_out_t* restrict line_out = (sms_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]); int n; input += in_extra; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 0, *line_out++ ); SMS_NTSC_RGB_OUT( 1, *line_out++ ); SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 2, *line_out++ ); SMS_NTSC_RGB_OUT( 3, *line_out++ ); SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 4, *line_out++ ); SMS_NTSC_RGB_OUT( 5, *line_out++ ); SMS_NTSC_RGB_OUT( 6, *line_out++ ); } /* finish final pixels */ SMS_NTSC_COLOR_IN( 0, ntsc, border ); SMS_NTSC_RGB_OUT( 0, *line_out++ ); SMS_NTSC_RGB_OUT( 1, *line_out++ ); SMS_NTSC_COLOR_IN( 1, ntsc, border ); SMS_NTSC_RGB_OUT( 2, *line_out++ ); SMS_NTSC_RGB_OUT( 3, *line_out++ ); SMS_NTSC_COLOR_IN( 2, ntsc, border ); SMS_NTSC_RGB_OUT( 4, *line_out++ ); SMS_NTSC_RGB_OUT( 5, *line_out++ ); SMS_NTSC_RGB_OUT( 6, *line_out++ ); } #endif core/cd_hw/gfx.c000664 001750 001750 00000053524 12702465756 014675 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * CD graphics processor * * Copyright (C) 2012 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /***************************************************************/ /* WORD-RAM DMA interfaces (1M & 2M modes) */ /***************************************************************/ void word_ram_0_dma_w(unsigned int words) { uint16 data; /* CDC buffer source address */ uint16 src_index = cdc.dac.w & 0x3ffe; /* WORD-RAM destination address*/ uint32 dst_index = (scd.regs[0x0a>>1].w << 3) & 0x1fffe; /* update DMA destination address */ scd.regs[0x0a>>1].w += (words >> 2); /* update DMA source address */ cdc.dac.w += (words << 1); /* DMA transfer */ while (words--) { /* read 16-bit word from CDC buffer */ data = *(uint16 *)(cdc.ram + src_index); #ifdef LSB_FIRST /* source data is stored in big endian format */ data = ((data >> 8) | (data << 8)) & 0xffff; #endif /* write 16-bit word to WORD-RAM */ *(uint16 *)(scd.word_ram[0] + dst_index) = data ; /* increment CDC buffer source address */ src_index = (src_index + 2) & 0x3ffe; /* increment WORD-RAM destination address */ dst_index = (dst_index + 2) & 0x1fffe; } } void word_ram_1_dma_w(unsigned int words) { uint16 data; /* CDC buffer source address */ uint16 src_index = cdc.dac.w & 0x3ffe; /* WORD-RAM destination address*/ uint32 dst_index = ((scd.regs[0x0a>>1].w << 3) & 0x1fffe); /* update DMA destination address */ scd.regs[0x0a>>1].w += (words >> 2); /* update DMA source address */ cdc.dac.w += (words << 1); /* DMA transfer */ while (words--) { /* read 16-bit word from CDC buffer */ data = *(uint16 *)(cdc.ram + src_index); #ifdef LSB_FIRST /* source data is stored in big endian format */ data = ((data >> 8) | (data << 8)) & 0xffff; #endif /* write 16-bit word to WORD-RAM */ *(uint16 *)(scd.word_ram[1] + dst_index) = data ; /* increment CDC buffer source address */ src_index = (src_index + 2) & 0x3ffe; /* increment WORD-RAM destination address */ dst_index = (dst_index + 2) & 0x1fffe; } } void word_ram_2M_dma_w(unsigned int words) { uint16 data; /* CDC buffer source address */ uint16 src_index = cdc.dac.w & 0x3ffe; /* WORD-RAM destination address*/ uint32 dst_index = (scd.regs[0x0a>>1].w << 3) & 0x3fffe; /* update DMA destination address */ scd.regs[0x0a>>1].w += (words >> 2); /* update DMA source address */ cdc.dac.w += (words << 1); /* DMA transfer */ while (words--) { /* read 16-bit word from CDC buffer */ data = *(uint16 *)(cdc.ram + src_index); #ifdef LSB_FIRST /* source data is stored in big endian format */ data = ((data >> 8) | (data << 8)) & 0xffff; #endif /* write 16-bit word to WORD-RAM */ *(uint16 *)(scd.word_ram_2M + dst_index) = data ; /* increment CDC buffer source address */ src_index = (src_index + 2) & 0x3ffe; /* increment WORD-RAM destination address */ dst_index = (dst_index + 2) & 0x3fffe; } } /***************************************************************/ /* WORD-RAM 0 & 1 DOT image SUB-CPU interface (1M Mode) */ /***************************************************************/ unsigned int dot_ram_0_read16(unsigned int address) { uint8 data = READ_BYTE(scd.word_ram[0], (address >> 1) & 0x1ffff); return ((data & 0x0f) | ((data << 4) & 0xf00)); } unsigned int dot_ram_1_read16(unsigned int address) { uint8 data = READ_BYTE(scd.word_ram[1], (address >> 1) & 0x1ffff); return ((data & 0x0f) | ((data << 4) & 0xf00)); } void dot_ram_0_write16(unsigned int address, unsigned int data) { uint8 prev; address = (address >> 1) & 0x1ffff; prev = READ_BYTE(scd.word_ram[0], address); data = (data & 0x0f) | ((data >> 4) & 0xf0); data = gfx.lut_prio[(scd.regs[0x02>>1].w >> 3) & 0x03][prev][data]; WRITE_BYTE(scd.word_ram[0], address, data); } void dot_ram_1_write16(unsigned int address, unsigned int data) { uint8 prev; address = (address >> 1) & 0x1ffff; prev = READ_BYTE(scd.word_ram[1], address); data = (data & 0x0f) | ((data >> 4) & 0xf0); data = gfx.lut_prio[(scd.regs[0x02>>1].w >> 3) & 0x03][prev][data]; WRITE_BYTE(scd.word_ram[1], address, data); } unsigned int dot_ram_0_read8(unsigned int address) { uint8 data = READ_BYTE(scd.word_ram[0], (address >> 1) & 0x1ffff); if (address & 1) { return (data & 0x0f); } return (data >> 4); } unsigned int dot_ram_1_read8(unsigned int address) { uint8 data = READ_BYTE(scd.word_ram[1], (address >> 1) & 0x1ffff); if (address & 1) { return (data & 0x0f); } return (data >> 4); } void dot_ram_0_write8(unsigned int address, unsigned int data) { uint8 prev = READ_BYTE(scd.word_ram[0], (address >> 1) & 0x1ffff); if (address & 1) { data = (prev & 0xf0) | (data & 0x0f); } else { data = (prev & 0x0f) | (data << 4); } data = gfx.lut_prio[(scd.regs[0x02>>1].w >> 3) & 0x03][prev][data]; WRITE_BYTE(scd.word_ram[0], (address >> 1) & 0x1ffff, data); } void dot_ram_1_write8(unsigned int address, unsigned int data) { uint8 prev = READ_BYTE(scd.word_ram[1], (address >> 1) & 0x1ffff); if (address & 1) { data = (prev & 0xf0) | (data & 0x0f); } else { data = (prev & 0x0f) | (data << 4); } data = gfx.lut_prio[(scd.regs[0x02>>1].w >> 3) & 0x03][prev][data]; WRITE_BYTE(scd.word_ram[1], (address >> 1) & 0x1ffff, data); } /***************************************************************/ /* WORD-RAM 0 & 1 CELL image MAIN-CPU interface (1M Mode) */ /***************************************************************/ unsigned int cell_ram_0_read16(unsigned int address) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10002); return *(uint16 *)(scd.word_ram[0] + address); } unsigned int cell_ram_1_read16(unsigned int address) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10002); return *(uint16 *)(scd.word_ram[1] + address); } void cell_ram_0_write16(unsigned int address, unsigned int data) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10002); *(uint16 *)(scd.word_ram[0] + address) = data; } void cell_ram_1_write16(unsigned int address, unsigned int data) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10002); *(uint16 *)(scd.word_ram[1] + address) = data; } unsigned int cell_ram_0_read8(unsigned int address) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10003); return READ_BYTE(scd.word_ram[0], address); } unsigned int cell_ram_1_read8(unsigned int address) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10003); return READ_BYTE(scd.word_ram[1], address); } void cell_ram_0_write8(unsigned int address, unsigned int data) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10003); WRITE_BYTE(scd.word_ram[0], address, data); } void cell_ram_1_write8(unsigned int address, unsigned int data) { address = gfx.lut_offset[(address >> 2) & 0x7fff] | (address & 0x10003); WRITE_BYTE(scd.word_ram[1], address, data); } /***************************************************************/ /* Rotation / Scaling operation (2M Mode) */ /***************************************************************/ void gfx_init(void) { int i, j; uint16 offset; uint8 mask, row, col, temp; memset(&gfx, 0, sizeof(gfx_t)); /* Initialize cell image lookup table */ /* $220000-$22FFFF corresponds to $200000-$20FFFF */ for (i=0; i<0x4000; i++) { offset = (i & 0x07) << 8; /* cell vline (0-7) */ offset = offset | (((i >> 8) & 0x3f) << 2); /* cell x offset (0-63) */ offset = offset | (((i >> 3) & 0x1f) << 11); /* cell y offset (0-31) */ gfx.lut_offset[i] = offset; } /* $230000-$237FFF corresponds to $210000-$217FFF */ for (i=0x4000; i<0x6000; i++) { offset = (i & 0x07) << 8; /* cell vline (0-7) */ offset = offset | (((i >> 7) & 0x3f) << 2); /* cell x offset (0-63) */ offset = offset | (((i >> 3) & 0x0f) << 11); /* cell y offset (0-15) */ gfx.lut_offset[i] = offset; } /* $238000-$23BFFF corresponds to $218000-$21BFFF */ for (i=0x6000; i<0x7000; i++) { offset = (i & 0x07) << 8; /* cell vline (0-7) */ offset = offset | (((i >> 6) & 0x3f) << 2); /* cell x offset (0-63) */ offset = offset | (((i >> 3) & 0x07) << 11); /* cell y offset (0-7) */ gfx.lut_offset[i] = offset | 0x8000; } /* $23C000-$23DFFF corresponds to $21C000-$21DFFF */ for (i=0x7000; i<0x7800; i++) { offset = (i & 0x07) << 8; /* cell vline (0-7) */ offset = offset | (((i >> 5) & 0x3f) << 2); /* cell x offset (0-63) */ offset = offset | (((i >> 3) & 0x03) << 11); /* cell y offset (0-3) */ gfx.lut_offset[i] = offset | 0xc000; } /* $23E000-$23FFFF corresponds to $21E000-$21FFFF */ for (i=0x7800; i<0x8000; i++) { offset = (i & 0x07) << 8; /* cell vline (0-7) */ offset = offset | (((i >> 5) & 0x3f) << 2); /* cell x offset (0-63) */ offset = offset | (((i >> 3) & 0x03) << 11); /* cell y offset (0-3) */ gfx.lut_offset[i] = offset | 0xe000; } /* Initialize priority modes lookup table */ for (i=0; i<0x100; i++) { for (j=0; j<0x100; j++) { /* normal */ gfx.lut_prio[0][i][j] = j; /* underwrite */ gfx.lut_prio[1][i][j] = ((i & 0x0f) ? (i & 0x0f) : (j & 0x0f)) | ((i & 0xf0) ? (i & 0xf0) : (j & 0xf0)); /* overwrite */ gfx.lut_prio[2][i][j] = ((j & 0x0f) ? (j & 0x0f) : (i & 0x0f)) | ((j & 0xf0) ? (j & 0xf0) : (i & 0xf0)); /* invalid */ gfx.lut_prio[3][i][j] = i; } } /* Initialize cell lookup table */ /* table entry = yyxxshrr (8 bits) */ /* with: yy = cell row (0-3) */ /* xx = cell column (0-3) */ /* s = stamp size (0=16x16, 1=32x32) */ /* hrr = HFLIP & ROTATION bits */ for (i=0; i<0x100; i++) { /* one stamp = 2x2 cells (16x16) or 4x4 cells (32x32) */ mask = (i & 8) ? 3 : 1; row = (i >> 6) & mask; col = (i >> 4) & mask; if (i & 4) { col = col ^ mask; } /* HFLIP (always first) */ if (i & 2) { col = col ^ mask; row = row ^ mask; } /* ROLL1 */ if (i & 1) { temp = col; col = row ^ mask; row = temp; } /* ROLL0 */ /* cell offset (0-3 or 0-15) */ gfx.lut_cell[i] = row + col * (mask + 1); } /* Initialize pixel lookup table */ /* table entry = yyyxxxhrr (9 bits) */ /* with: yyy = pixel row (0-7) */ /* xxx = pixel column (0-7) */ /* hrr = HFLIP & ROTATION bits */ for (i=0; i<0x200; i++) { /* one cell = 8x8 pixels */ row = (i >> 6) & 7; col = (i >> 3) & 7; if (i & 4) { col = col ^ 7; } /* HFLIP (always first) */ if (i & 2) { col = col ^ 7; row = row ^ 7; } /* ROLL1 */ if (i & 1) { temp = col; col = row ^ 7; row = temp; } /* ROLL0 */ /* pixel offset (0-63) */ gfx.lut_pixel[i] = col + row * 8; } } void gfx_reset(void) { /* Reset cycle counter */ gfx.cycles = 0; } int gfx_context_save(uint8 *state) { uint32 tmp32; int bufferptr = 0; save_param(&gfx.cycles, sizeof(gfx.cycles)); save_param(&gfx.cyclesPerLine, sizeof(gfx.cyclesPerLine)); save_param(&gfx.dotMask, sizeof(gfx.dotMask)); save_param(&gfx.stampShift, sizeof(gfx.stampShift)); save_param(&gfx.mapShift, sizeof(gfx.mapShift)); save_param(&gfx.bufferOffset, sizeof(gfx.bufferOffset)); save_param(&gfx.bufferStart, sizeof(gfx.bufferStart)); tmp32 = (uint8 *)(gfx.tracePtr) - scd.word_ram_2M; save_param(&tmp32, 4); tmp32 = (uint8 *)(gfx.mapPtr) - scd.word_ram_2M; save_param(&tmp32, 4); return bufferptr; } int gfx_context_load(uint8 *state) { uint32 tmp32; int bufferptr = 0; load_param(&gfx.cycles, sizeof(gfx.cycles)); load_param(&gfx.cyclesPerLine, sizeof(gfx.cyclesPerLine)); load_param(&gfx.dotMask, sizeof(gfx.dotMask)); load_param(&gfx.stampShift, sizeof(gfx.stampShift)); load_param(&gfx.mapShift, sizeof(gfx.mapShift)); load_param(&gfx.bufferOffset, sizeof(gfx.bufferOffset)); load_param(&gfx.bufferStart, sizeof(gfx.bufferStart)); load_param(&tmp32, 4); gfx.tracePtr = (uint16 *)(scd.word_ram_2M + tmp32); load_param(&tmp32, 4); gfx.mapPtr = (uint16 *)(scd.word_ram_2M + tmp32); return bufferptr; } INLINE void gfx_render(uint32 bufferIndex, uint32 width) { uint8 pixel_in, pixel_out; uint16 stamp_data; uint32 stamp_index; /* pixel map start position for current line (13.3 format converted to 13.11) */ uint32 xpos = *gfx.tracePtr++ << 8; uint32 ypos = *gfx.tracePtr++ << 8; /* pixel map offset values for current line (5.11 format) */ uint32 xoffset = (int16) *gfx.tracePtr++; uint32 yoffset = (int16) *gfx.tracePtr++; /* process all dots */ while (width--) { /* check if stamp map is repeated */ if (scd.regs[0x58>>1].byte.l & 0x01) { /* stamp map range */ xpos &= gfx.dotMask; ypos &= gfx.dotMask; } else { /* 24-bit range */ xpos &= 0xffffff; ypos &= 0xffffff; } /* check if pixel is outside stamp map */ if ((xpos | ypos) & ~gfx.dotMask) { /* force pixel output to 0 */ pixel_out = 0x00; } else { /* read stamp map table data */ stamp_data = gfx.mapPtr[(xpos >> gfx.stampShift) | ((ypos >> gfx.stampShift) << gfx.mapShift)]; /* stamp generator base index */ /* sss ssssssss ccyyyxxx (16x16) or sss sssssscc ccyyyxxx (32x32) */ /* with: s = stamp number (1 stamp = 16x16 or 32x32 pixels) */ /* c = cell offset (0-3 for 16x16, 0-15 for 32x32) */ /* yyy = line offset (0-7) */ /* xxx = pixel offset (0-7) */ stamp_index = (stamp_data & 0x7ff) << 8; if (stamp_index) { /* extract HFLIP & ROTATION bits */ stamp_data = (stamp_data >> 13) & 7; /* cell offset (0-3 or 0-15) */ /* table entry = yyxxshrr (8 bits) */ /* with: yy = cell row (0-3) = (ypos >> (11 + 3)) & 3 */ /* xx = cell column (0-3) = (xpos >> (11 + 3)) & 3 */ /* s = stamp size (0=16x16, 1=32x32) */ /* hrr = HFLIP & ROTATION bits */ stamp_index |= gfx.lut_cell[stamp_data | ((scd.regs[0x58>>1].byte.l & 0x02) << 2 ) | ((ypos >> 8) & 0xc0) | ((xpos >> 10) & 0x30)] << 6; /* pixel offset (0-63) */ /* table entry = yyyxxxhrr (9 bits) */ /* with: yyy = pixel row (0-7) = (ypos >> 11) & 7 */ /* xxx = pixel column (0-7) = (xpos >> 11) & 7 */ /* hrr = HFLIP & ROTATION bits */ stamp_index |= gfx.lut_pixel[stamp_data | ((xpos >> 8) & 0x38) | ((ypos >> 5) & 0x1c0)]; /* read pixel pair (2 pixels/byte) */ pixel_out = READ_BYTE(scd.word_ram_2M, stamp_index >> 1); /* extract left or rigth pixel */ if (stamp_index & 1) { pixel_out &= 0x0f; } else { pixel_out >>= 4; } } else { /* stamp 0 is not used: force pixel output to 0 */ pixel_out = 0x00; } } /* read out paired pixel data */ pixel_in = READ_BYTE(scd.word_ram_2M, bufferIndex >> 1); /* update left or rigth pixel */ if (bufferIndex & 1) { pixel_out |= (pixel_in & 0xf0); } else { pixel_out = (pixel_out << 4) | (pixel_in & 0x0f); } /* priority mode write */ pixel_out = gfx.lut_prio[(scd.regs[0x02>>1].w >> 3) & 0x03][pixel_in][pixel_out]; /* write data to image buffer */ WRITE_BYTE(scd.word_ram_2M, bufferIndex >> 1, pixel_out); /* check current pixel position */ if ((bufferIndex & 7) != 7) { /* next pixel */ bufferIndex++; } else { /* next cell: increment image buffer offset by one column (minus 7 pixels) */ bufferIndex += gfx.bufferOffset; } /* increment pixel position */ xpos += xoffset; ypos += yoffset; } } void gfx_start(unsigned int base, int cycles) { /* make sure 2M mode is enabled */ if (!(scd.regs[0x02>>1].byte.l & 0x04)) { uint32 mask; /* trace vector pointer */ gfx.tracePtr = (uint16 *)(scd.word_ram_2M + ((base << 2) & 0x3fff8)); /* stamps & stamp map size */ switch ((scd.regs[0x58>>1].byte.l >> 1) & 0x03) { case 0: gfx.dotMask = 0x07ffff; /* 256x256 dots/map */ gfx.stampShift = 11 + 4; /* 16x16 dots/stamps */ gfx.mapShift = 4; /* 16x16 stamps/map */ mask = 0x3fe00; /* 512 bytes/table */ break; case 1: gfx.dotMask = 0x07ffff; /* 256x256 dots/map */ gfx.stampShift = 11 + 5; /* 32x32 dots/stamps */ gfx.mapShift = 3; /* 8x8 stamps/map */ mask = 0x3ff80; /* 128 bytes/table */ break; case 2: gfx.dotMask = 0x7fffff; /* 4096*4096 dots/map */ gfx.stampShift = 11 + 4; /* 16x16 dots/stamps */ gfx.mapShift = 8; /* 256x256 stamps/map */ mask = 0x20000; /* 131072 bytes/table */ break; case 3: gfx.dotMask = 0x7fffff; /* 4096*4096 dots/map */ gfx.stampShift = 11 + 5; /* 32x32 dots/stamps */ gfx.mapShift = 7; /* 128x128 stamps/map */ mask = 0x38000; /* 32768 bytes/table */ break; } /* stamp map table base address */ gfx.mapPtr = (uint16 *)(scd.word_ram_2M + ((scd.regs[0x5a>>1].w << 2) & mask)); /* image buffer column offset (64 pixels/cell, minus 7 pixels to restart at cell beginning) */ gfx.bufferOffset = (((scd.regs[0x5c>>1].byte.l & 0x1f) + 1) << 6) - 7; /* image buffer start index in dot units (2 pixels/byte) */ gfx.bufferStart = (scd.regs[0x5e>>1].w << 3) & 0x7ffc0; /* add image buffer horizontal dot offset */ gfx.bufferStart += (scd.regs[0x60>>1].byte.l & 0x3f); /* reset GFX chip cycle counter */ gfx.cycles = cycles; /* update GFX chip timings (see AC3:Thunderhawk / Thunderstrike) */ gfx.cyclesPerLine = 4 * 5 * scd.regs[0x62>>1].w; /* start graphics operation */ scd.regs[0x58>>1].byte.h = 0x80; } } void gfx_update(int cycles) { /* synchronize GFX chip with SUB-CPU */ cycles -= gfx.cycles; /* make sure SUB-CPU is ahead */ if (cycles > 0) { /* number of lines to process */ unsigned int lines = (cycles + gfx.cyclesPerLine - 1) / gfx.cyclesPerLine; /* check against remaining lines */ if (lines < scd.regs[0x64>>1].byte.l) { /* update Vdot remaining size */ scd.regs[0x64>>1].byte.l -= lines; /* increment cycle counter */ gfx.cycles += lines * gfx.cyclesPerLine; } else { /* process remaining lines */ lines = scd.regs[0x64>>1].byte.l; /* clear Vdot remaining size */ scd.regs[0x64>>1].byte.l = 0; /* end of graphics operation */ scd.regs[0x58>>1].byte.h = 0; /* SUB-CPU idle on register $58 polling ? */ if (s68k.stopped & (1<<0x08)) { /* sync SUB-CPU with GFX chip */ s68k.cycles = scd.cycles; /* restart SUB-CPU */ s68k.stopped = 0; #ifdef LOG_SCD error("s68k started from %d cycles\n", s68k.cycles); #endif } /* level 1 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x02) { /* trigger level 1 interrupt */ scd.pending |= (1 << 1); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* render lines */ while (lines--) { /* process dots to image buffer */ gfx_render(gfx.bufferStart, scd.regs[0x62>>1].w); /* increment image buffer start index for next line (8 pixels/line) */ gfx.bufferStart += 8; } } } gx/images/ctrl_gamecube.png000664 001750 001750 00000002436 12702465756 017112 0ustar00sergiosergio000000 000000 PNG  IHDR$_NsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYrIDATxiUUAl4l4  PPT?"2B2* ,h9mfZ~u9] ηZ{w(hX)# 8 c 6`+`]MӸ2O8?X9TDꅋ:1 WƱ8{mJ]؄51$V\J)[Д`ܙp0Nv _'XJ)W͹pJ18i`aƬ3Vpl3"ti[X\a?yd2?; za-VĨR l)yStz!:i{S2 L۱&w@h^'Gޚa,׏0)o.ͼZ1o3SX]v}1rLPw)'3PZ2C%O;eOa^Tڤ <6 o;&܋y>SX33ָ]2i!54[)a+ ¯~87RNs6eމE\"6p=qb&t%M97.J/4TAW[KhPSDUUgCUU.-D]XC.Ϊ|݄v[Jy9+fZ#hk]"$5߻Z_ۂKq.3D2F=\'v=~gIT$xSĿז117d.hօك/˵* \hFeZFj?&\wXx}Zj@}[5~?6Z_pAD _a L 2x6@IENDB`core/vdp_render.h000664 001750 001750 00000014041 12702465756 015151 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Video Display Processor (pixel output rendering) * * Support for all TMS99xx modes, Mode 4 & Mode 5 rendering * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _RENDER_H_ #define _RENDER_H_ /* 3:3:2 RGB */ #if defined(USE_8BPP_RENDERING) #define PIXEL(r,g,b) (((r) << 5) | ((g) << 2) | (b)) #define GET_R(pixel) (((pixel) & 0xe0) >> 5) #define GET_G(pixel) (((pixel) & 0x1c) >> 2) #define GET_B(pixel) (((pixel) & 0x03) >> 0) /* 5:5:5 RGB */ #elif defined(USE_15BPP_RENDERING) #if defined(USE_ABGR) #define PIXEL(r,g,b) ((1 << 15) | ((b) << 10) | ((g) << 5) | (r)) #define GET_B(pixel) (((pixel) & 0x7c00) >> 10) #define GET_G(pixel) (((pixel) & 0x03e0) >> 5) #define GET_R(pixel) (((pixel) & 0x001f) >> 0) #else #define PIXEL(r,g,b) ((1 << 15) | ((r) << 10) | ((g) << 5) | (b)) #define GET_R(pixel) (((pixel) & 0x7c00) >> 10) #define GET_G(pixel) (((pixel) & 0x03e0) >> 5) #define GET_B(pixel) (((pixel) & 0x001f) >> 0) #endif /* 5:6:5 RGB */ #elif defined(USE_16BPP_RENDERING) #define PIXEL(r,g,b) (((r) << 11) | ((g) << 5) | (b)) #define GET_R(pixel) (((pixel) & 0xf800) >> 11) #define GET_G(pixel) (((pixel) & 0x07e0) >> 5) #define GET_B(pixel) (((pixel) & 0x001f) >> 0) /* 8:8:8 RGB */ #elif defined(USE_32BPP_RENDERING) #define PIXEL(r,g,b) ((0xff << 24) | ((r) << 16) | ((g) << 8) | (b)) #define GET_R(pixel) (((pixel) & 0xff0000) >> 16) #define GET_G(pixel) (((pixel) & 0x00ff00) >> 8) #define GET_B(pixel) (((pixel) & 0x0000ff) >> 0) #endif /* LCD image persistence (ghosting) filter */ /* Simulates (roughly) the slow decay response time of passive-matrix LCD */ /* Rate value is formatted as 0.8 fixed-point integer (between 0.0 and 0.99609375), a higher value meaning a slower decay */ /* Required for proper display of some effects in a few Game Gear games (James Pond 3, Power Drift, Super Monaco GP II,...) */ #define RENDER_PIXEL_LCD(in,out,table,rate) \ { \ PIXEL_OUT_T pixel_out = table[*in++]; \ PIXEL_OUT_T pixel_old = *out; \ uint8 r = GET_R(pixel_out); \ uint8 g = GET_G(pixel_out); \ uint8 b = GET_B(pixel_out); \ int r_decay = GET_R(pixel_old) - r; \ int g_decay = GET_G(pixel_old) - g; \ int b_decay = GET_B(pixel_old) - b; \ if (r_decay > 0) r += (rate * r_decay) >> 8; \ if (g_decay > 0) g += (rate * g_decay) >> 8; \ if (b_decay > 0) b += (rate * b_decay) >> 8; \ *out++ = PIXEL(r,g,b); \ } /* Global variables */ extern uint16 spr_col; /* Function prototypes */ extern void render_init(void); extern void render_reset(void); extern void render_line(int line); extern void blank_line(int line, int offset, int width); extern void remap_line(int line); extern void window_clip(unsigned int data, unsigned int sw); extern void render_bg_m0(int line); extern void render_bg_m1(int line); extern void render_bg_m1x(int line); extern void render_bg_m2(int line); extern void render_bg_m3(int line); extern void render_bg_m3x(int line); extern void render_bg_inv(int line); extern void render_bg_m4(int line); extern void render_bg_m5(int line); extern void render_bg_m5_vs(int line); extern void render_bg_m5_im2(int line); extern void render_bg_m5_im2_vs(int line); extern void render_obj_tms(int line); extern void render_obj_m4(int line); extern void render_obj_m5(int line); extern void render_obj_m5_ste(int line); extern void render_obj_m5_im2(int line); extern void render_obj_m5_im2_ste(int line); extern void parse_satb_tms(int line); extern void parse_satb_m4(int line); extern void parse_satb_m5(int line); extern void update_bg_pattern_cache_m4(int index); extern void update_bg_pattern_cache_m5(int index); extern void color_update_m4(int index, unsigned int data); extern void color_update_m5(int index, unsigned int data); /* Function pointers */ extern void (*render_bg)(int line); extern void (*render_obj)(int line); extern void (*parse_satb)(int line); extern void (*update_bg_pattern_cache)(int index); #endif /* _RENDER_H_ */ core/input_hw/paddle.h000664 001750 001750 00000004667 12702465756 016124 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Paddle Control support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _PADDLE_H_ #define _PADDLE_H_ /* Function prototypes */ extern void paddle_reset(int index); extern unsigned char paddle_1_read(void); extern unsigned char paddle_2_read(void); extern void paddle_1_write(unsigned char data, unsigned char mask); extern void paddle_2_write(unsigned char data, unsigned char mask); #endif sdl/README.txt000664 001750 001750 00000012535 12702465756 014206 0ustar00sergiosergio000000 000000 DISCLAIMER: THIS IS A VERY BASIC & UNSTABLE PORT WHICH ONLY PURPOSE IS TO SHOW HOW TO USE GENESIS PLUS GX CORE & INTERFACE IT WITH SDL IN PARTICULAR. BUILDS ARE NOT MEANT TO BE REALLY USED FOR ANYTHING ELSE BUT EASIER CORE DEBUGGING ON WINDOWS. PLEASE DO NOT DISTRIBUTE WIN32 BINARIES WITHOUT THIS NOTICE. END USERS SHOULD PREFERABLY USE LIBRETRO PORT WITH RETROARCH. ---------------------------------------------------------------------------- Genesis Plus (Windows Port) ---------------------------------------------------------------------------- based on the original version 1.3 by Charles Mac Donald WWW: http://cgfm2.emuviews.com version 1.7.4 backported from Genesis Plus GX by Eke-Eke WWW: http://code.google.com/p/genplus-gx E-mail: ekeeke31@gmail.com What's New ---------- see CHANGELOG.txt Features --------- * accurate emulation of SG-1000, Mark-III, Master System (I & II), Game Gear, Genesis / Mega Drive, Sega / Mega CD hardware models (incl. backwards compatibility modes) * NTSC (60Hz) & PAL (50Hz) video hardware emulation * accurate CDD, CDC & GFX chip emulation (Sega/Mega CD) * CD-DA fader emulation (Sega/Mega CD) * Mode 1 cartridge support (Sega/Mega CD) * highly accurate 68000 & Z80 CPU emulation * highly accurate VDP emulation (all rendering modes, mid-line changes, undocumented registers,) & timings (HBLANK, DMA, FIFO, HV interrupts,) * sample-accurate YM2612,YM2413, PSG, & PCM emulation (all sound chips are running at the original frequency) * cycle-accurate chip synchronization (68000s/Z80/YM2612/PSG/PCM) * high-quality audio resampling using Blip Buffer * basic hardware latency emulation (VDP/68k, Z80/68k) * full overscan area emulation (horizontal & vertical color borders) * optional Game Gear extended screen mode * internal BOOT ROM support (Master System, Genesis / Mega Drive, Sega / Mega CD) * optional TMSS hardware emulation (Genesis / Mega Drive) * support for Blargg's software NTSC filters * preliminary PICO emulation * support for raw (.bin, .gen, .md, .sms, .gg & .sg) and interleaved (.smd & .mdx) ROM files * support for CUE+BIN, ISO+OGG & ISO+WAV CD image files * 2-buttons, 3-buttons & 6-buttons controllers emulation * Sega Team Player & EA 4-Way Play multitaps emulation * Sega Mouse emulation * Sega Paddle Control & Sports Pad analog emulation * Terebi Oekaki tablet emulation * Sega Light Phaser, Menacer & Justifiers lightgun emulation * Sega Activator & XE-1AP analog controller emulation * SVP DSP (Virtua Racing) emulation * J-Cart adapter (Micro Machines & Pete Sampras series, Super Skidmarks) emulation * Backup RAM (max. 64KB), I2C (24Cxx), SPI (95xxx) & MicroWire (93C46) EEPROMs emulation * Sega/Mega CD RAM cart (max. 512KB) emulation * official ROM bankswitch hardware (Super Street Fighter 2) emulation * official backup RAM bankswitch hardware (Phantasy Star 4, Legend of Thor, Sonic the Hedgehog 3) emulation * support for all known unlicensed/pirate cartridges bankswitch & copy protection hardware * emulation of all known Master System & Game Gear cartridge mappers (incl. unlicensed Korean ones) * Game Genie & Action Replay hardware emulation * Sonic & Knuckles Lock-On hardware emulation * support for ROM image up to 10MB (Ultimate MK3 hack) Usage ----- The Windows version runs windowed in a 16-bit desktop with 48Hz sound using SDL but without joystick support. Controls ----- Arrow Keys - Directional pad A/Q,S,D,F - buttons A, B(1), C(2), START W,X,C,V - buttons X, Y, Z, MODE if 6-buttons controller is enabled Tab - Hard Reset Esc - Exit program F2 - Toggle Fullscreen/Windowed mode F4 - Toggle Audio (Turbo mode must be disabled first) F6 - Toggle Turbo mode (Audio must be disabled first) F7 - Load Savestate (game.gpz) F8 - Save Savestate (game.gpz) F9 - Toggle VDP mode: PAL(50hz)/NTSC(60hz) F10 - Soft Reset F11 - Toggle Border emulation F12 - Toggle Player # (test only) The mouse is used for lightguns, Sega Mouse, PICO & Terebi Oekaki tablet (automatically detected when loading supported game). A SRAM file (game.srm) is automatically saved on exit and loaded on startup. Credits -------- Core(s) improvements & additional features by Eke-Eke Original code by Charles MacDonald Original Z80 core by Juergen Buchmueller Original Musashi 68k core by Karl Stenerud Original YM2612/YM2413 cores by Jarek Burczynski & Tatsuyuki Satoh Original SN76489 core by Maxim Original SVP core by Notaz Blip Buffer & NTSC Video filter libraries by Shay Green (Blargg) 3-Band EQ implementation by Neil C TREMOR VORBIS decoding library by Xiph.org Zlib by Jean-Loup Gailly & Mark Adler Aknowledgements ---------------- The following emulator authors: Bart Trzynadlowski, Steve Snake, Stef, Notaz, AamirM The regular people at spritesmind.net and smspower.org. The MAME team for the CPU and sound chip emulators. Nemesis for the researches on the YM2612 and VDP. Tasco Deluxe for the documentation of Realtec mapper. Haze for the reverse-engineering of many unlicensed games protection. gx/gui/filesel.h000664 001750 001750 00000004466 12702465756 014730 0ustar00sergiosergio000000 000000 /* * filesel.c * * File Browser * * Copyright Eke-Eke (2009-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILESEL_H #define _FILESEL_H #define MAXJOLIET 256 #define MAXFILES 1000 /* Filelist structure */ typedef struct { u8 flags; char filename[MAXJOLIET]; }FILEENTRIES; /* Globals */ extern int FileSelector(int type); extern void ClearSelector(u32 max); extern FILEENTRIES filelist[MAXFILES]; #endif core/vdp_render.c000664 001750 001750 00000327063 12702465756 015157 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Video Display Processor (pixel output rendering) * * Support for all TMS99xx modes, Mode 4 & Mode 5 rendering * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "md_ntsc.h" #include "sms_ntsc.h" /*** NTSC Filters ***/ extern md_ntsc_t *md_ntsc; extern sms_ntsc_t *sms_ntsc; /* Output pixels type*/ #if defined(USE_8BPP_RENDERING) #define PIXEL_OUT_T uint8 #elif defined(USE_32BPP_RENDERING) #define PIXEL_OUT_T uint32 #else #define PIXEL_OUT_T uint16 #endif /* Pixel priority look-up tables information */ #define LUT_MAX (6) #define LUT_SIZE (0x10000) #ifdef ALIGN_LONG #undef READ_LONG #undef WRITE_LONG INLINE uint32 READ_LONG(void *address) { if ((uint32)address & 3) { #ifdef LSB_FIRST /* little endian version */ return ( *((uint8 *)address) + (*((uint8 *)address+1) << 8) + (*((uint8 *)address+2) << 16) + (*((uint8 *)address+3) << 24) ); #else /* big endian version */ return ( *((uint8 *)address+3) + (*((uint8 *)address+2) << 8) + (*((uint8 *)address+1) << 16) + (*((uint8 *)address) << 24) ); #endif /* LSB_FIRST */ } else return *(uint32 *)address; } INLINE void WRITE_LONG(void *address, uint32 data) { if ((uint32)address & 3) { #ifdef LSB_FIRST *((uint8 *)address) = data; *((uint8 *)address+1) = (data >> 8); *((uint8 *)address+2) = (data >> 16); *((uint8 *)address+3) = (data >> 24); #else *((uint8 *)address+3) = data; *((uint8 *)address+2) = (data >> 8); *((uint8 *)address+1) = (data >> 16); *((uint8 *)address) = (data >> 24); #endif /* LSB_FIRST */ return; } else *(uint32 *)address = data; } #endif /* ALIGN_LONG */ /* Draw 2-cell column (8-pixels high) */ /* Pattern cache base address: VHN NNNNNNNN NNYYYxxx with : x = Pattern Pixel (0-7) Y = Pattern Row (0-7) N = Pattern Number (0-2047) from pattern attribute H = Horizontal Flip bit from pattern attribute V = Vertical Flip bit from pattern attribute */ #define GET_LSB_TILE(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ src = (uint32 *)&bg_pattern_cache[(ATTR & 0x00001FFF) << 6 | (LINE)]; #define GET_MSB_TILE(ATTR, LINE) \ atex = atex_table[(ATTR >> 29) & 7]; \ src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF0000) >> 10 | (LINE)]; /* Draw 2-cell column (16 pixels high) */ /* Pattern cache base address: VHN NNNNNNNN NYYYYxxx with : x = Pattern Pixel (0-7) Y = Pattern Row (0-15) N = Pattern Number (0-1023) H = Horizontal Flip bit V = Vertical Flip bit */ #define GET_LSB_TILE_IM2(ATTR, LINE) \ atex = atex_table[(ATTR >> 13) & 7]; \ src = (uint32 *)&bg_pattern_cache[((ATTR & 0x000003FF) << 7 | (ATTR & 0x00001800) << 6 | (LINE)) ^ ((ATTR & 0x00001000) >> 6)]; #define GET_MSB_TILE_IM2(ATTR, LINE) \ atex = atex_table[(ATTR >> 29) & 7]; \ src = (uint32 *)&bg_pattern_cache[((ATTR & 0x03FF0000) >> 9 | (ATTR & 0x18000000) >> 10 | (LINE)) ^ ((ATTR & 0x10000000) >> 22)]; /* One column = 2 tiles Two pattern attributes are written in VRAM as two consecutives 16-bit words: P = priority bit C = color palette (2 bits) V = Vertical Flip bit H = Horizontal Flip bit N = Pattern Number (11 bits) (MSB) PCCVHNNN NNNNNNNN (LSB) (MSB) PCCVHNNN NNNNNNNN (LSB) PATTERN1 PATTERN2 Both pattern attributes are read from VRAM as one 32-bit word: LIT_ENDIAN: (MSB) PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN (LSB) PATTERN2 PATTERN1 BIG_ENDIAN: (MSB) PCCVHNNN NNNNNNNN PCCVHNNN NNNNNNNN (LSB) PATTERN1 PATTERN2 In line buffers, one pixel = one byte: (msb) 0Pppcccc (lsb) with: P = priority bit (from pattern attribute) p = color palette (from pattern attribute) c = color data (from pattern cache) One pattern = 8 pixels = 8 bytes = two 32-bit writes per pattern */ #ifdef ALIGN_LONG #ifdef LSB_FIRST #define DRAW_COLUMN(ATTR, LINE) \ GET_LSB_TILE(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; \ GET_MSB_TILE(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; #define DRAW_COLUMN_IM2(ATTR, LINE) \ GET_LSB_TILE_IM2(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; \ GET_MSB_TILE_IM2(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; #else #define DRAW_COLUMN(ATTR, LINE) \ GET_MSB_TILE(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; \ GET_LSB_TILE(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; #define DRAW_COLUMN_IM2(ATTR, LINE) \ GET_MSB_TILE_IM2(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; \ GET_LSB_TILE_IM2(ATTR, LINE) \ WRITE_LONG(dst, src[0] | atex); \ dst++; \ WRITE_LONG(dst, src[1] | atex); \ dst++; #endif #else /* NOT ALIGNED */ #ifdef LSB_FIRST #define DRAW_COLUMN(ATTR, LINE) \ GET_LSB_TILE(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); \ GET_MSB_TILE(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); #define DRAW_COLUMN_IM2(ATTR, LINE) \ GET_LSB_TILE_IM2(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); \ GET_MSB_TILE_IM2(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); #else #define DRAW_COLUMN(ATTR, LINE) \ GET_MSB_TILE(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); \ GET_LSB_TILE(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); #define DRAW_COLUMN_IM2(ATTR, LINE) \ GET_MSB_TILE_IM2(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); \ GET_LSB_TILE_IM2(ATTR, LINE) \ *dst++ = (src[0] | atex); \ *dst++ = (src[1] | atex); #endif #endif /* ALIGN_LONG */ #ifdef ALT_RENDERER /* Draw background tiles directly using priority look-up table */ /* SRC_A = layer A rendered pixel line (4 bytes = 4 pixels at once) */ /* SRC_B = layer B cached pixel line (4 bytes = 4 pixels at once) */ /* Note: cache address is always aligned so no need to use READ_LONG macro */ /* This might be faster or slower than original method, depending on */ /* architecture (x86, PowerPC), cache size, memory access speed, etc... */ #ifdef LSB_FIRST #define DRAW_BG_TILE(SRC_A, SRC_B) \ *lb++ = table[((SRC_B << 8) & 0xff00) | (SRC_A & 0xff)]; \ *lb++ = table[(SRC_B & 0xff00) | ((SRC_A >> 8) & 0xff)]; \ *lb++ = table[((SRC_B >> 8) & 0xff00) | ((SRC_A >> 16) & 0xff)]; \ *lb++ = table[((SRC_B >> 16) & 0xff00) | ((SRC_A >> 24) & 0xff)]; #else #define DRAW_BG_TILE(SRC_A, SRC_B) \ *lb++ = table[((SRC_B >> 16) & 0xff00) | ((SRC_A >> 24) & 0xff)]; \ *lb++ = table[((SRC_B >> 8) & 0xff00) | ((SRC_A >> 16) & 0xff)]; \ *lb++ = table[(SRC_B & 0xff00) | ((SRC_A >> 8) & 0xff)]; \ *lb++ = table[((SRC_B << 8) & 0xff00) | (SRC_A & 0xff)]; #endif #ifdef ALIGN_LONG #ifdef LSB_FIRST #define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \ GET_LSB_TILE(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_MSB_TILE(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \ GET_LSB_TILE_IM2(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_MSB_TILE_IM2(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #else #define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \ GET_MSB_TILE(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_LSB_TILE(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \ GET_MSB_TILE_IM2(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_LSB_TILE_IM2(ATTR, LINE) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = READ_LONG((uint32 *)lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #endif #else /* NOT ALIGNED */ #ifdef LSB_FIRST #define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \ GET_LSB_TILE(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_MSB_TILE(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \ GET_LSB_TILE_IM2(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_MSB_TILE_IM2(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #else #define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \ GET_MSB_TILE(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_LSB_TILE(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \ GET_MSB_TILE_IM2(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ GET_LSB_TILE_IM2(ATTR, LINE) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[0] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) \ SRC_A = *(uint32 *)(lb); \ SRC_B = (src[1] | atex); \ DRAW_BG_TILE(SRC_A, SRC_B) #endif #endif /* ALIGN_LONG */ #endif /* ALT_RENDERER */ #define DRAW_SPRITE_TILE(WIDTH,ATTR,TABLE) \ for (i=0;i> 10); \ } \ } #define DRAW_SPRITE_TILE_ACCURATE(WIDTH,ATTR,TABLE) \ for (i=0;i> 1); \ status |= 0x20; \ } \ } \ } #define DRAW_SPRITE_TILE_ACCURATE_2X(WIDTH,ATTR,TABLE) \ for (i=0;i> 1); \ status |= 0x20; \ } \ temp &= 0x00FF; \ temp |= (lb[i+1] << 8); \ lb[i+1] = TABLE[temp | ATTR]; \ if ((temp & 0x8000) && !(status & 0x20)) \ { \ spr_col = (v_counter << 8) | ((xpos + i + 1 + 13) >> 1); \ status |= 0x20; \ } \ } \ } /* Pixels conversion macro */ /* 4-bit color channels are either compressed to 2/3-bit or dithered to 5/6/8-bit equivalents */ /* 3:3:2 RGB */ #if defined(USE_8BPP_RENDERING) #define MAKE_PIXEL(r,g,b) (((r) >> 1) << 5 | ((g) >> 1) << 2 | (b) >> 2) /* 5:5:5 RGB */ #elif defined(USE_15BPP_RENDERING) #if defined(USE_ABGR) #define MAKE_PIXEL(r,g,b) ((1 << 15) | (b) << 11 | ((b) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (r) << 1 | (r) >> 3) #else #define MAKE_PIXEL(r,g,b) ((1 << 15) | (r) << 11 | ((r) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (b) << 1 | (b) >> 3) #endif /* 5:6:5 RGB */ #elif defined(USE_16BPP_RENDERING) #define MAKE_PIXEL(r,g,b) ((r) << 12 | ((r) >> 3) << 11 | (g) << 7 | ((g) >> 2) << 5 | (b) << 1 | (b) >> 3) /* 8:8:8 RGB */ #elif defined(USE_32BPP_RENDERING) #define MAKE_PIXEL(r,g,b) ((0xff << 24) | (r) << 20 | (r) << 16 | (g) << 12 | (g) << 8 | (b) << 4 | (b)) #endif /* Window & Plane A clipping */ static struct clip_t { uint8 left; uint8 right; uint8 enable; } clip[2]; /* Pattern attribute (priority + palette bits) expansion table */ static const uint32 atex_table[] = { 0x00000000, 0x10101010, 0x20202020, 0x30303030, 0x40404040, 0x50505050, 0x60606060, 0x70707070 }; /* fixed Master System palette for Modes 0,1,2,3 */ static const uint8 tms_crom[16] = { 0x00, 0x00, 0x08, 0x0C, 0x10, 0x30, 0x01, 0x3C, 0x02, 0x03, 0x05, 0x0F, 0x04, 0x33, 0x15, 0x3F }; /* original SG-1000 palette */ #if defined(USE_8BPP_RENDERING) static const uint8 tms_palette[16] = { 0x00, 0x00, 0x39, 0x79, 0x4B, 0x6F, 0xC9, 0x5B, 0xE9, 0xED, 0xD5, 0xD9, 0x35, 0xCE, 0xDA, 0xFF }; #elif defined(USE_15BPP_RENDERING) static const uint16 tms_palette[16] = { 0x8000, 0x8000, 0x9308, 0xAF6F, 0xA95D, 0xBDDF, 0xE949, 0xA3BE, 0xFD4A, 0xFDEF, 0xEB0A, 0xF330, 0x92A7, 0xE177, 0xE739, 0xFFFF }; #elif defined(USE_16BPP_RENDERING) static const uint16 tms_palette[16] = { 0x0000, 0x0000, 0x2648, 0x5ECF, 0x52BD, 0x7BBE, 0xD289, 0x475E, 0xF2AA, 0xFBCF, 0xD60A, 0xE670, 0x2567, 0xC2F7, 0xCE59, 0xFFFF }; #elif defined(USE_32BPP_RENDERING) static const uint32 tms_palette[16] = { 0xFF000000, 0xFF000000, 0xFF21C842, 0xFF5EDC78, 0xFF5455ED, 0xFF7D76FC, 0xFFD4524D, 0xFF42EBF5, 0xFFFC5554, 0xFFFF7978, 0xFFD4C154, 0xFFE6CE80, 0xFF21B03B, 0xFFC95BB4, 0xFFCCCCCC, 0xFFFFFFFF }; #endif /* Cached and flipped patterns */ static uint8 bg_pattern_cache[0x80000]; /* Sprite pattern name offset look-up table (Mode 5) */ static uint8 name_lut[0x400]; /* Bitplane to packed pixel look-up table (Mode 4) */ static uint32 bp_lut[0x10000]; /* Layer priority pixel look-up tables */ static uint8 lut[LUT_MAX][LUT_SIZE]; /* Output pixel data look-up tables*/ static PIXEL_OUT_T pixel[0x100]; static PIXEL_OUT_T pixel_lut[3][0x200]; static PIXEL_OUT_T pixel_lut_m4[0x40]; /* Background & Sprite line buffers */ static uint8 linebuf[2][0x200]; /* Sprite limit flag */ static uint8 spr_ovr; /* Sprite parsing lists */ typedef struct { uint16 ypos; uint16 xpos; uint16 attr; uint16 size; } object_info_t; static object_info_t obj_info[2][20]; /* Sprite Counter */ static uint8 object_count[2]; /* Sprite Collision Info */ uint16 spr_col; /* Function pointers */ void (*render_bg)(int line); void (*render_obj)(int line); void (*parse_satb)(int line); void (*update_bg_pattern_cache)(int index); /*--------------------------------------------------------------------------*/ /* Sprite pattern name offset look-up table function (Mode 5) */ /*--------------------------------------------------------------------------*/ static void make_name_lut(void) { int vcol, vrow; int width, height; int flipx, flipy; int i; for (i = 0; i < 0x400; i += 1) { /* Sprite settings */ vcol = i & 3; vrow = (i >> 2) & 3; height = (i >> 4) & 3; width = (i >> 6) & 3; flipx = (i >> 8) & 1; flipy = (i >> 9) & 1; if ((vrow > height) || vcol > width) { /* Invalid settings (unused) */ name_lut[i] = -1; } else { /* Adjust column & row index if sprite is flipped */ if(flipx) vcol = (width - vcol); if(flipy) vrow = (height - vrow); /* Pattern offset (pattern order is up->down->left->right) */ name_lut[i] = vrow + (vcol * (height + 1)); } } } /*--------------------------------------------------------------------------*/ /* Bitplane to packed pixel look-up table function (Mode 4) */ /*--------------------------------------------------------------------------*/ static void make_bp_lut(void) { int x,i,j; uint32 out; /* ---------------------- */ /* Pattern color encoding */ /* -------------------------------------------------------------------------*/ /* 4 byteplanes are required to define one pattern line (8 pixels) */ /* A single pixel color is coded with 4 bits (c3 c2 c1 c0) */ /* Each bit is coming from byteplane bits, as explained below: */ /* pixel 0: c3 = bp3 bit 7, c2 = bp2 bit 7, c1 = bp1 bit 7, c0 = bp0 bit 7 */ /* pixel 1: c3 = bp3 bit 6, c2 = bp2 bit 6, c1 = bp1 bit 6, c0 = bp0 bit 6 */ /* ... */ /* pixel 7: c3 = bp3 bit 0, c2 = bp2 bit 0, c1 = bp1 bit 0, c0 = bp0 bit 0 */ /* -------------------------------------------------------------------------*/ for(i = 0; i < 0x100; i++) for(j = 0; j < 0x100; j++) { out = 0; for(x = 0; x < 8; x++) { /* pixel line data = hh00gg00ff00ee00dd00cc00bb00aa00 (32-bit) */ /* aa-hh = upper or lower 2-bit values of pixels 0-7 (shifted) */ out |= (j & (0x80 >> x)) ? (uint32)(8 << (x << 2)) : 0; out |= (i & (0x80 >> x)) ? (uint32)(4 << (x << 2)) : 0; } /* i = low byte in VRAM (bp0 or bp2) */ /* j = high byte in VRAM (bp1 or bp3) */ #ifdef LSB_FIRST bp_lut[(j << 8) | (i)] = out; #else bp_lut[(i << 8) | (j)] = out; #endif } } /*--------------------------------------------------------------------------*/ /* Layers priority pixel look-up tables functions */ /*--------------------------------------------------------------------------*/ /* Input (bx): d5-d0=color, d6=priority, d7=unused */ /* Input (ax): d5-d0=color, d6=priority, d7=unused */ /* Output: d5-d0=color, d6=priority, d7=zero */ static uint32 make_lut_bg(uint32 bx, uint32 ax) { int bf = (bx & 0x7F); int bp = (bx & 0x40); int b = (bx & 0x0F); int af = (ax & 0x7F); int ap = (ax & 0x40); int a = (ax & 0x0F); int c = (ap ? (a ? af : bf) : (bp ? (b ? bf : af) : (a ? af : bf))); /* Strip palette & priority bits from transparent pixels */ if((c & 0x0F) == 0x00) c &= 0x80; return (c); } /* Input (bx): d5-d0=color, d6=priority, d7=unused */ /* Input (sx): d5-d0=color, d6=priority, d7=unused */ /* Output: d5-d0=color, d6=priority, d7=intensity select (0=half/1=normal) */ static uint32 make_lut_bg_ste(uint32 bx, uint32 ax) { int bf = (bx & 0x7F); int bp = (bx & 0x40); int b = (bx & 0x0F); int af = (ax & 0x7F); int ap = (ax & 0x40); int a = (ax & 0x0F); int c = (ap ? (a ? af : bf) : (bp ? (b ? bf : af) : (a ? af : bf))); /* Half intensity when both pixels are low priority */ c |= ((ap | bp) << 1); /* Strip palette & priority bits from transparent pixels */ if((c & 0x0F) == 0x00) c &= 0x80; return (c); } /* Input (bx): d5-d0=color, d6=priority/1, d7=sprite pixel marker */ /* Input (sx): d5-d0=color, d6=priority, d7=unused */ /* Output: d5-d0=color, d6=priority, d7=sprite pixel marker */ static uint32 make_lut_obj(uint32 bx, uint32 sx) { int c; int bf = (bx & 0x7F); int bs = (bx & 0x80); int sf = (sx & 0x7F); if((sx & 0x0F) == 0) return bx; c = (bs ? bf : sf); /* Strip palette bits from transparent pixels */ if((c & 0x0F) == 0x00) c &= 0xC0; return (c | 0x80); } /* Input (bx): d5-d0=color, d6=priority, d7=opaque sprite pixel marker */ /* Input (sx): d5-d0=color, d6=priority, d7=unused */ /* Output: d5-d0=color, d6=zero/priority, d7=opaque sprite pixel marker */ static uint32 make_lut_bgobj(uint32 bx, uint32 sx) { int c; int bf = (bx & 0x3F); int bs = (bx & 0x80); int bp = (bx & 0x40); int b = (bx & 0x0F); int sf = (sx & 0x3F); int sp = (sx & 0x40); int s = (sx & 0x0F); if(s == 0) return bx; /* Previous sprite has higher priority */ if(bs) return bx; c = (sp ? sf : (bp ? (b ? bf : sf) : sf)); /* Strip palette & priority bits from transparent pixels */ if((c & 0x0F) == 0x00) c &= 0x80; return (c | 0x80); } /* Input (bx): d5-d0=color, d6=priority, d7=intensity (half/normal) */ /* Input (sx): d5-d0=color, d6=priority, d7=sprite marker */ /* Output: d5-d0=color, d6=intensity (half/normal), d7=(double/invalid) */ static uint32 make_lut_bgobj_ste(uint32 bx, uint32 sx) { int c; int bf = (bx & 0x3F); int bp = (bx & 0x40); int b = (bx & 0x0F); int bi = (bx & 0x80) >> 1; int sf = (sx & 0x3F); int sp = (sx & 0x40); int s = (sx & 0x0F); int si = sp | bi; if(sp) { if(s) { if((sf & 0x3E) == 0x3E) { if(sf & 1) { c = (bf | 0x00); } else { c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); } } else { if(sf == 0x0E || sf == 0x1E || sf == 0x2E) { c = (sf | 0x40); } else { c = (sf | si); } } } else { c = (bf | bi); } } else { if(bp) { if(b) { c = (bf | bi); } else { if(s) { if((sf & 0x3E) == 0x3E) { if(sf & 1) { c = (bf | 0x00); } else { c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); } } else { if(sf == 0x0E || sf == 0x1E || sf == 0x2E) { c = (sf | 0x40); } else { c = (sf | si); } } } else { c = (bf | bi); } } } else { if(s) { if((sf & 0x3E) == 0x3E) { if(sf & 1) { c = (bf | 0x00); } else { c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); } } else { if(sf == 0x0E || sf == 0x1E || sf == 0x2E) { c = (sf | 0x40); } else { c = (sf | si); } } } else { c = (bf | bi); } } } if((c & 0x0f) == 0x00) c &= 0xC0; return (c); } /* Input (bx): d3-d0=color, d4=palette, d5=priority, d6=zero, d7=sprite pixel marker */ /* Input (sx): d3-d0=color, d7-d4=zero */ /* Output: d3-d0=color, d4=palette, d5=zero/priority, d6=zero, d7=sprite pixel marker */ static uint32 make_lut_bgobj_m4(uint32 bx, uint32 sx) { int c; int bf = (bx & 0x3F); int bs = (bx & 0x80); int bp = (bx & 0x20); int b = (bx & 0x0F); int s = (sx & 0x0F); int sf = (s | 0x10); /* force palette bit */ /* Transparent sprite pixel */ if(s == 0) return bx; /* Previous sprite has higher priority */ if(bs) return bx; /* note: priority bit is always 0 for Modes 0,1,2,3 */ c = (bp ? (b ? bf : sf) : sf); return (c | 0x80); } /*--------------------------------------------------------------------------*/ /* Pixel layer merging function */ /*--------------------------------------------------------------------------*/ INLINE void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width) { do { *dst++ = table[(*srcb++ << 8) | (*srca++)]; } while (--width); } /*--------------------------------------------------------------------------*/ /* Pixel color lookup tables initialization */ /*--------------------------------------------------------------------------*/ static void palette_init(void) { int r, g, b, i; /************************************************/ /* Each R,G,B color channel is 4-bit with a */ /* total of 15 different intensity levels. */ /* */ /* Color intensity depends on the mode: */ /* */ /* normal : xxx0 (0-14) */ /* shadow : 0xxx (0-7) */ /* highlight: 1xxx - 1 (7-14) */ /* mode4 : xxxx(*) (0-15) */ /* GG mode : xxxx (0-15) */ /* */ /* with x = original CRAM value (2, 3 or 4-bit) */ /* (*) 2-bit CRAM value is expanded to 4-bit */ /************************************************/ /* Initialize Mode 5 pixel color look-up tables */ for (i = 0; i < 0x200; i++) { /* CRAM 9-bit value (BBBGGGRRR) */ r = (i >> 0) & 7; g = (i >> 3) & 7; b = (i >> 6) & 7; /* Convert to output pixel format */ pixel_lut[0][i] = MAKE_PIXEL(r,g,b); pixel_lut[1][i] = MAKE_PIXEL(r<<1,g<<1,b<<1); pixel_lut[2][i] = MAKE_PIXEL(r+7,g+7,b+7); } /* Initialize Mode 4 pixel color look-up table */ for (i = 0; i < 0x40; i++) { /* CRAM 6-bit value (000BBGGRR) */ r = (i >> 0) & 3; g = (i >> 2) & 3; b = (i >> 4) & 3; /* Expand to full range & convert to output pixel format */ pixel_lut_m4[i] = MAKE_PIXEL((r << 2) | r, (g << 2) | g, (b << 2) | b); } } /*--------------------------------------------------------------------------*/ /* Color palette update functions */ /*--------------------------------------------------------------------------*/ void color_update_m4(int index, unsigned int data) { switch (system_hw) { case SYSTEM_GG: { /* CRAM value (BBBBGGGGRRRR) */ int r = (data >> 0) & 0x0F; int g = (data >> 4) & 0x0F; int b = (data >> 8) & 0x0F; /* Convert to output pixel */ data = MAKE_PIXEL(r,g,b); break; } case SYSTEM_SG: case SYSTEM_SGII: { /* Fixed TMS99xx palette */ if (index & 0x0F) { /* Colors 1-15 */ data = tms_palette[index & 0x0F]; } else { /* Backdrop color */ data = tms_palette[reg[7] & 0x0F]; } break; } default: { /* Test M4 bit */ if (!(reg[0] & 0x04)) { if (system_hw & SYSTEM_MD) { /* Invalid Mode (black screen) */ data = 0x00; } else if (system_hw != SYSTEM_GGMS) { /* Fixed CRAM palette */ if (index & 0x0F) { /* Colors 1-15 */ data = tms_crom[index & 0x0F]; } else { /* Backdrop color */ data = tms_crom[reg[7] & 0x0F]; } } } /* Mode 4 palette */ data = pixel_lut_m4[data & 0x3F]; break; } } /* Input pixel: x0xiiiii (normal) or 01000000 (backdrop) */ if (reg[0] & 0x04) { /* Mode 4 */ pixel[0x00 | index] = data; pixel[0x20 | index] = data; pixel[0x80 | index] = data; pixel[0xA0 | index] = data; } else { /* TMS99xx modes (palette bit forced to 1 because Game Gear uses CRAM palette #1) */ if ((index == 0x40) || (index == (0x10 | (reg[7] & 0x0F)))) { /* Update backdrop color */ pixel[0x40] = data; /* Update transparent color */ pixel[0x10] = data; pixel[0x30] = data; pixel[0x90] = data; pixel[0xB0] = data; } if (index & 0x0F) { /* update non-transparent colors */ pixel[0x00 | index] = data; pixel[0x20 | index] = data; pixel[0x80 | index] = data; pixel[0xA0 | index] = data; } } } void color_update_m5(int index, unsigned int data) { /* Palette Mode */ if (!(reg[0] & 0x04)) { /* Color value is limited to 00X00X00X */ data &= 0x49; } if(reg[12] & 0x08) { /* Mode 5 (Shadow/Normal/Highlight) */ pixel[0x00 | index] = pixel_lut[0][data]; pixel[0x40 | index] = pixel_lut[1][data]; pixel[0x80 | index] = pixel_lut[2][data]; } else { /* Mode 5 (Normal) */ data = pixel_lut[1][data]; /* Input pixel: xxiiiiii */ pixel[0x00 | index] = data; pixel[0x40 | index] = data; pixel[0x80 | index] = data; } } /*--------------------------------------------------------------------------*/ /* Background layers rendering functions */ /*--------------------------------------------------------------------------*/ /* Graphics I */ void render_bg_m0(int line) { uint8 color, name, pattern; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line & 0xF8) << 2)]; uint8 *ct = &vram[((reg[3] << 6) & 0x3FC0)]; uint8 *pg = &vram[((reg[4] << 11) & 0x3800) + (line & 7)]; /* 32 x 8 pixels */ int width = 32; do { name = *nt++; color = ct[name >> 3]; pattern = pg[name << 3]; *lb++ = 0x10 | ((color >> (((pattern >> 7) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 6) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 5) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 4) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 3) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 2) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 1) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 0) & 1) << 2)) & 0x0F); } while (--width); } /* Text */ void render_bg_m1(int line) { uint8 pattern; uint8 color = reg[7]; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line >> 3) * 40)]; uint8 *pg = &vram[((reg[4] << 11) & 0x3800) + (line & 7)]; /* 40 x 6 pixels */ int width = 40; /* Left border (8 pixels) */ memset (lb, 0x40, 8); lb += 8; do { pattern = pg[*nt++ << 3]; *lb++ = 0x10 | ((color >> (((pattern >> 7) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 6) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 5) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 4) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 3) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 2) & 1) << 2)) & 0x0F); } while (--width); /* Right borders (8 pixels) */ memset(lb, 0x40, 8); } /* Text + extended PG */ void render_bg_m1x(int line) { uint8 pattern; uint8 *pg; uint8 color = reg[7]; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line >> 3) * 40)]; uint16 pg_mask = ~0x3800 ^ (reg[4] << 11); /* 40 x 6 pixels */ int width = 40; /* Unused bits used as a mask on TMS99xx & 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { pg_mask |= 0x1800; } pg = &vram[((0x2000 + ((line & 0xC0) << 5)) & pg_mask) + (line & 7)]; /* Left border (8 pixels) */ memset (lb, 0x40, 8); lb += 8; do { pattern = pg[*nt++ << 3]; *lb++ = 0x10 | ((color >> (((pattern >> 7) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 6) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 5) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 4) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 3) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 2) & 1) << 2)) & 0x0F); } while (--width); /* Right borders (8 pixels) */ memset(lb, 0x40, 8); } /* Graphics II */ void render_bg_m2(int line) { uint8 color, pattern; uint16 name; uint8 *ct, *pg; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line & 0xF8) << 2)]; uint16 ct_mask = ~0x3FC0 ^ (reg[3] << 6); uint16 pg_mask = ~0x3800 ^ (reg[4] << 11); /* 32 x 8 pixels */ int width = 32; /* Unused bits used as a mask on TMS99xx & 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { ct_mask |= 0x1FC0; pg_mask |= 0x1800; } ct = &vram[((0x2000 + ((line & 0xC0) << 5)) & ct_mask) + (line & 7)]; pg = &vram[((0x2000 + ((line & 0xC0) << 5)) & pg_mask) + (line & 7)]; do { name = *nt++ << 3 ; color = ct[name & ct_mask]; pattern = pg[name]; *lb++ = 0x10 | ((color >> (((pattern >> 7) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 6) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 5) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 4) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 3) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 2) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 1) & 1) << 2)) & 0x0F); *lb++ = 0x10 | ((color >> (((pattern >> 0) & 1) << 2)) & 0x0F); } while (--width); } /* Multicolor */ void render_bg_m3(int line) { uint8 color; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line & 0xF8) << 2)]; uint8 *pg = &vram[((reg[4] << 11) & 0x3800) + ((line >> 2) & 7)]; /* 32 x 8 pixels */ int width = 32; do { color = pg[*nt++ << 3]; *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); } while (--width); } /* Multicolor + extended PG */ void render_bg_m3x(int line) { uint8 color; uint8 *pg; uint8 *lb = &linebuf[0][0x20]; uint8 *nt = &vram[((reg[2] << 10) & 0x3C00) + ((line & 0xF8) << 2)]; uint16 pg_mask = ~0x3800 ^ (reg[4] << 11); /* 32 x 8 pixels */ int width = 32; /* Unused bits used as a mask on TMS99xx & 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { pg_mask |= 0x1800; } pg = &vram[((0x2000 + ((line & 0xC0) << 5)) & pg_mask) + ((line >> 2) & 7)]; do { color = pg[*nt++ << 3]; *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); } while (--width); } /* Invalid (2+3/1+2+3) */ void render_bg_inv(int line) { uint8 color = reg[7]; uint8 *lb = &linebuf[0][0x20]; /* 40 x 6 pixels */ int width = 40; /* Left border (8 pixels) */ memset (lb, 0x40, 8); lb += 8; do { *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 4) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); *lb++ = 0x10 | ((color >> 0) & 0x0F); } while (--width); /* Right borders (8 pixels) */ memset(lb, 0x40, 8); } /* Mode 4 */ void render_bg_m4(int line) { int column; uint16 *nt; uint32 attr, atex, *src; /* 32 x 8 pixels */ int width = 32; /* Horizontal scrolling */ int index = ((reg[0] & 0x40) && (line < 0x10)) ? 0x100 : reg[0x08]; int shift = index & 7; /* Background line buffer */ uint32 *dst = (uint32 *)&linebuf[0][0x20 + shift]; /* Vertical scrolling */ int v_line = line + vscroll; /* Pattern name table mask */ uint16 nt_mask = ~0x3C00 ^ (reg[2] << 10); /* Unused bits used as a mask on TMS99xx & 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { nt_mask |= 0x400; } /* Test for extended modes (Master System II & Game gear VDP only) */ if (bitmap.viewport.h > 192) { /* Vertical scroll mask */ v_line = v_line % 256; /* Pattern name Table */ nt = (uint16 *)&vram[(0x3700 & nt_mask) + ((v_line >> 3) << 6)]; } else { /* Vertical scroll mask */ v_line = v_line % 224; /* Pattern name Table */ nt = (uint16 *)&vram[(0x3800 + ((v_line >> 3) << 6)) & nt_mask]; } /* Pattern row index */ v_line = (v_line & 7) << 3; /* Tile column index */ index = (0x100 - index) >> 3; /* Clip left-most column if required */ if (shift) { memset(&linebuf[0][0x20], 0, shift); index++; } /* Draw tiles */ for(column = 0; column < width; column++, index++) { /* Stop vertical scrolling for rightmost eight tiles */ if((column == 24) && (reg[0] & 0x80)) { /* Clear Pattern name table start address */ if (bitmap.viewport.h > 192) { nt = (uint16 *)&vram[(0x3700 & nt_mask) + ((line >> 3) << 6)]; } else { nt = (uint16 *)&vram[(0x3800 + ((line >> 3) << 6)) & nt_mask]; } /* Clear Pattern row index */ v_line = (line & 7) << 3; } /* Read name table attribute word */ attr = nt[index % width]; #ifndef LSB_FIRST attr = (((attr & 0xFF) << 8) | ((attr & 0xFF00) >> 8)); #endif /* Expand priority and palette bits */ atex = atex_table[(attr >> 11) & 3]; /* Cached pattern data line (4 bytes = 4 pixels at once) */ src = (uint32 *)&bg_pattern_cache[((attr & 0x7FF) << 6) | (v_line)]; /* Copy left & right half, adding the attribute bits in */ #ifdef ALIGN_LONG WRITE_LONG(dst, src[0] | atex); dst++; WRITE_LONG(dst, src[1] | atex); dst++; #else *dst++ = (src[0] | atex); *dst++ = (src[1] | atex); #endif } } /* Mode 5 */ #ifndef ALT_RENDERER void render_bg_m5(int line) { int column; uint32 atex, atbuf, *src, *dst; /* Common data */ uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = *(uint32 *)&vsram[0]; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; /* Window & Plane A */ int a = (reg[18] & 0x1F) << 3; int w = (reg[18] >> 7) & 1; /* Plane B width */ int start = 0; int end = bitmap.viewport.w >> 4; /* Plane B scroll */ #ifdef LSB_FIRST uint32 shift = (xscroll >> 16) & 0x0F; uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); uint32 v_line = (line + (yscroll >> 16)) & pf_row_mask; #else uint32 shift = (xscroll & 0x0F); uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); uint32 v_line = (line + yscroll) & pf_row_mask; #endif /* Plane B name table */ uint32 *nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; if(shift) { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x10 + shift]; atbuf = nt[(index - 1) & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } else { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x20]; } for(column = 0; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + yscroll) & pf_row_mask; #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 16)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; if(shift) { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x10 + shift + (start << 4)]; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index - 1) & pf_col_mask]; } DRAW_COLUMN(atbuf, v_line) } else { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; } for(column = start; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } /* Window */ if (w) { /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = (line & 7) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN(atbuf, v_line) } } /* Merge background layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[(reg[12] & 0x08) >> 2], bitmap.viewport.w); } void render_bg_m5_vs(int line) { int column; uint32 atex, atbuf, *src, *dst; uint32 v_line, *nt; /* Common data */ uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = 0; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; uint32 *vs = (uint32 *)&vsram[0]; /* Window & Plane A */ int a = (reg[18] & 0x1F) << 3; int w = (reg[18] >> 7) & 1; /* Plane B width */ int start = 0; int end = bitmap.viewport.w >> 4; /* Plane B horizontal scroll */ #ifdef LSB_FIRST uint32 shift = (xscroll >> 16) & 0x0F; uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); #else uint32 shift = (xscroll & 0x0F); uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); #endif /* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */ /* TODO: check on Genesis 3 models since it apparently behaves differently */ /* In H32 mode, vertical scrolling is disabled, in H40 mode, same value is used for both planes */ /* See Formula One / Kawasaki Superbike Challenge (H32) & Gynoug / Cutie Suzuki no Ringside Angel (H40) */ if (reg[12] & 1) { yscroll = vs[19] & (vs[19] >> 16); } if(shift) { /* Plane B vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x10 + shift]; atbuf = nt[(index - 1) & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } else { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x20]; } for(column = 0; column < end; column++, index++) { /* Plane B vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 16)) & pf_row_mask; #else v_line = (line + vs[column]) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); #endif if(shift) { /* Plane A vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x10 + shift + (start << 4)]; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index - 1) & pf_col_mask]; } DRAW_COLUMN(atbuf, v_line) } else { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; } for(column = start; column < end; column++, index++) { /* Plane A vertical scroll */ #ifdef LSB_FIRST v_line = (line + vs[column]) & pf_row_mask; #else v_line = (line + (vs[column] >> 16)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } /* Window */ if (w) { /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = (line & 7) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN(atbuf, v_line) } } /* Merge background layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[(reg[12] & 0x08) >> 2], bitmap.viewport.w); } void render_bg_m5_im2(int line) { int column; uint32 atex, atbuf, *src, *dst; /* Common data */ int odd = odd_frame; uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = *(uint32 *)&vsram[0]; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; /* Window & Plane A */ int a = (reg[18] & 0x1F) << 3; int w = (reg[18] >> 7) & 1; /* Plane B width */ int start = 0; int end = bitmap.viewport.w >> 4; /* Plane B scroll */ #ifdef LSB_FIRST uint32 shift = (xscroll >> 16) & 0x0F; uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); uint32 v_line = (line + (yscroll >> 17)) & pf_row_mask; #else uint32 shift = (xscroll & 0x0F); uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); uint32 v_line = (line + (yscroll >> 1)) & pf_row_mask; #endif /* Plane B name table */ uint32 *nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; if(shift) { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x10 + shift]; atbuf = nt[(index - 1) & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } else { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x20]; } for(column = 0; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + (yscroll >> 1)) & pf_row_mask; #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 17)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; if(shift) { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x10 + shift + (start << 4)]; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index - 1) & pf_col_mask]; } DRAW_COLUMN_IM2(atbuf, v_line) } else { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; } for(column = start; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } /* Window */ if (w) { /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = ((line & 7) << 1 | odd) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN_IM2(atbuf, v_line) } } /* Merge background layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[(reg[12] & 0x08) >> 2], bitmap.viewport.w); } void render_bg_m5_im2_vs(int line) { int column; uint32 atex, atbuf, *src, *dst; uint32 v_line, *nt; /* Common data */ int odd = odd_frame; uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = 0; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; uint32 *vs = (uint32 *)&vsram[0]; /* Window & Plane A */ int a = (reg[18] & 0x1F) << 3; int w = (reg[18] >> 7) & 1; /* Plane B width */ int start = 0; int end = bitmap.viewport.w >> 4; /* Plane B horizontal scroll */ #ifdef LSB_FIRST uint32 shift = (xscroll >> 16) & 0x0F; uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); #else uint32 shift = (xscroll & 0x0F); uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); #endif /* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */ /* TODO: check on Genesis 3 models since it apparently behaves differently */ /* In H32 mode, vertical scrolling is disabled, in H40 mode, same value is used for both planes */ /* See Formula One / Kawasaki Superbike Challenge (H32) & Gynoug / Cutie Suzuki no Ringside Angel (H40) */ if (reg[12] & 1) { yscroll = (vs[19] >> 1) & (vs[19] >> 17); } if(shift) { /* Plane B vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x10 + shift]; atbuf = nt[(index - 1) & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } else { /* Plane B line buffer */ dst = (uint32 *)&linebuf[0][0x20]; } for(column = 0; column < end; column++, index++) { /* Plane B vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 17)) & pf_row_mask; #else v_line = (line + (vs[column] >> 1)) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); #endif if(shift) { /* Plane A vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x10 + shift + (start << 4)]; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index - 1) & pf_col_mask]; } DRAW_COLUMN_IM2(atbuf, v_line) } else { /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; } for(column = start; column < end; column++, index++) { /* Plane A vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 1)) & pf_row_mask; #else v_line = (line + (vs[column] >> 17)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } /* Window */ if (w) { /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = ((line & 7) << 1 | odd) << 3; /* Plane A line buffer */ dst = (uint32 *)&linebuf[1][0x20 + (start << 4)]; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN_IM2(atbuf, v_line) } } /* Merge background layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[(reg[12] & 0x08) >> 2], bitmap.viewport.w); } #else void render_bg_m5(int line) { int column, start, end; uint32 atex, atbuf, *src, *dst; uint32 shift, index, v_line, *nt; uint8 *lb; /* Scroll Planes common data */ uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = *(uint32 *)&vsram[0]; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; /* Number of columns to draw */ int width = bitmap.viewport.w >> 4; /* Layer priority table */ uint8 *table = lut[(reg[12] & 8) >> 2]; /* Window vertical range (cell 0-31) */ int a = (reg[18] & 0x1F) << 3; /* Window position (0=top, 1=bottom) */ int w = (reg[18] >> 7) & 1; /* Test against current line */ if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + yscroll) & pf_row_mask; #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 16)) & pf_row_mask; #endif /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4) + shift]; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; if(shift) { /* Left-most column is partially shown */ dst -= 4; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index-1) & pf_col_mask]; } DRAW_COLUMN(atbuf, v_line) } for(column = start; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } else { /* Window width */ start = 0; end = width; } /* Window Plane */ if (w) { /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4)]; /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = (line & 7) << 3; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN(atbuf, v_line) } } /* Plane B scroll */ #ifdef LSB_FIRST shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 16)) & pf_row_mask; #else shift = (xscroll & 0x0F); index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + yscroll) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Background line buffer */ lb = &linebuf[0][0x20]; if(shift) { /* Left-most column is partially shown */ lb -= (0x10 - shift); atbuf = nt[(index-1) & pf_col_mask]; DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll) } for(column = 0; column < width; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll) } } void render_bg_m5_vs(int line) { int column, start, end; uint32 atex, atbuf, *src, *dst; uint32 shift, index, v_line, *nt; uint8 *lb; /* Scroll Planes common data */ uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = 0; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; uint32 *vs = (uint32 *)&vsram[0]; /* Number of columns to draw */ int width = bitmap.viewport.w >> 4; /* Layer priority table */ uint8 *table = lut[(reg[12] & 8) >> 2]; /* Window vertical range (cell 0-31) */ int a = (reg[18] & 0x1F) << 3; /* Window position (0=top, 1=bottom) */ int w = (reg[18] >> 7) & 1; /* Test against current line */ if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Left-most column vertical scrolling when partially shown horizontally */ /* Same value for both planes, only in 40-cell mode, verified on PAL MD2 */ /* See Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge */ if (reg[12] & 1) { yscroll = vs[19] & (vs[19] >> 16); } /* Plane A*/ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); #endif /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4) + shift]; if(shift) { /* Left-most column is partially shown */ dst -= 4; /* Plane A vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index-1) & pf_col_mask]; } DRAW_COLUMN(atbuf, v_line) } for(column = start; column < end; column++, index++) { /* Plane A vertical scroll */ #ifdef LSB_FIRST v_line = (line + vs[column]) & pf_row_mask; #else v_line = (line + (vs[column] >> 16)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } else { /* Window width */ start = 0; end = width; } /* Window Plane */ if (w) { /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4)]; /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = (line & 7) << 3; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN(atbuf, v_line) } } /* Plane B horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); #else shift = (xscroll & 0x0F); index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); #endif /* Background line buffer */ lb = &linebuf[0][0x20]; if(shift) { /* Left-most column is partially shown */ lb -= (0x10 - shift); /* Plane B vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; atbuf = nt[(index-1) & pf_col_mask]; DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll) } for(column = 0; column < width; column++, index++) { /* Plane B vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 16)) & pf_row_mask; #else v_line = (line + vs[column]) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (v_line & 7) << 3; atbuf = nt[index & pf_col_mask]; DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll) } } void render_bg_m5_im2(int line) { int column, start, end; uint32 atex, atbuf, *src, *dst; uint32 shift, index, v_line, *nt; uint8 *lb; /* Scroll Planes common data */ int odd = odd_frame; uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = *(uint32 *)&vsram[0]; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; /* Number of columns to draw */ int width = bitmap.viewport.w >> 4; /* Layer priority table */ uint8 *table = lut[(reg[12] & 8) >> 2]; /* Window vertical range (cell 0-31) */ int a = (reg[18] & 0x1F) << 3; /* Window position (0=top, 1=bottom) */ int w = (reg[18] >> 7) & 1; /* Test against current line */ if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + (yscroll >> 1)) & pf_row_mask; #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 17)) & pf_row_mask; #endif /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4) + shift]; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; if(shift) { /* Left-most column is partially shown */ dst -= 4; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index-1) & pf_col_mask]; } DRAW_COLUMN_IM2(atbuf, v_line) } for(column = start; column < end; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } else { /* Window width */ start = 0; end = width; } /* Window Plane */ if (w) { /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4)]; /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = ((line & 7) << 1 | odd) << 3; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN_IM2(atbuf, v_line) } } /* Plane B scroll */ #ifdef LSB_FIRST shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); v_line = (line + (yscroll >> 17)) & pf_row_mask; #else shift = (xscroll & 0x0F); index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); v_line = (line + (yscroll >> 1)) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Background line buffer */ lb = &linebuf[0][0x20]; if(shift) { /* Left-most column is partially shown */ lb -= (0x10 - shift); atbuf = nt[(index-1) & pf_col_mask]; DRAW_BG_COLUMN_IM2(atbuf, v_line, xscroll, yscroll) } for(column = 0; column < width; column++, index++) { atbuf = nt[index & pf_col_mask]; DRAW_BG_COLUMN_IM2(atbuf, v_line, xscroll, yscroll) } } void render_bg_m5_im2_vs(int line) { int column, start, end; uint32 atex, atbuf, *src, *dst; uint32 shift, index, v_line, *nt; uint8 *lb; /* common data */ int odd = odd_frame; uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)]; uint32 yscroll = 0; uint32 pf_col_mask = playfield_col_mask; uint32 pf_row_mask = playfield_row_mask; uint32 pf_shift = playfield_shift; uint32 *vs = (uint32 *)&vsram[0]; /* Number of columns to draw */ int width = bitmap.viewport.w >> 4; /* Layer priority table */ uint8 *table = lut[(reg[12] & 8) >> 2]; /* Window vertical range (cell 0-31) */ uint32 a = (reg[18] & 0x1F) << 3; /* Window position (0=top, 1=bottom) */ uint32 w = (reg[18] >> 7) & 1; /* Test against current line */ if (w == (line >= a)) { /* Window takes up entire line */ a = 0; w = 1; } else { /* Window and Plane A share the line */ a = clip[0].enable; w = clip[1].enable; } /* Left-most column vertical scrolling when partially shown horizontally */ /* Same value for both planes, only in 40-cell mode, verified on PAL MD2 */ /* See Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge */ if (reg[12] & 1) { /* only in 40-cell mode, verified on MD2 */ yscroll = (vs[19] >> 1) & (vs[19] >> 17); } /* Plane A */ if (a) { /* Plane A width */ start = clip[0].left; end = clip[0].right; /* Plane A horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll & 0x0F); index = pf_col_mask + start + 1 - ((xscroll >> 4) & pf_col_mask); #else shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask); #endif /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4) + shift]; if(shift) { /* Left-most column is partially shown */ dst -= 4; /* Plane A vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Window bug */ if (start) { atbuf = nt[index & pf_col_mask]; } else { atbuf = nt[(index-1) & pf_col_mask]; } DRAW_COLUMN_IM2(atbuf, v_line) } for(column = start; column < end; column++, index++) { /* Plane A vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 1)) & pf_row_mask; #else v_line = (line + (vs[column] >> 17)) & pf_row_mask; #endif /* Plane A name table */ nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; atbuf = nt[index & pf_col_mask]; DRAW_COLUMN_IM2(atbuf, v_line) } /* Window width */ start = clip[1].left; end = clip[1].right; } else { /* Window width */ start = 0; end = width; } /* Window Plane */ if (w) { /* Background line buffer */ dst = (uint32 *)&linebuf[0][0x20 + (start << 4)]; /* Window name table */ nt = (uint32 *)&vram[ntwb | ((line >> 3) << (6 + (reg[12] & 1)))]; /* Pattern row index */ v_line = ((line & 7) << 1 | odd) << 3; for(column = start; column < end; column++) { atbuf = nt[column]; DRAW_COLUMN_IM2(atbuf, v_line) } } /* Plane B horizontal scroll */ #ifdef LSB_FIRST shift = (xscroll >> 16) & 0x0F; index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask); #else shift = (xscroll & 0x0F); index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask); #endif /* Background line buffer */ lb = &linebuf[0][0x20]; if(shift) { /* Left-most column is partially shown */ lb -= (0x10 - shift); /* Plane B vertical scroll */ v_line = (line + yscroll) & pf_row_mask; /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; atbuf = nt[(index-1) & pf_col_mask]; DRAW_BG_COLUMN_IM2(atbuf, v_line, xscroll, yscroll) } for(column = 0; column < width; column++, index++) { /* Plane B vertical scroll */ #ifdef LSB_FIRST v_line = (line + (vs[column] >> 17)) & pf_row_mask; #else v_line = (line + (vs[column] >> 1)) & pf_row_mask; #endif /* Plane B name table */ nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)]; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; atbuf = nt[index & pf_col_mask]; DRAW_BG_COLUMN_IM2(atbuf, v_line, xscroll, yscroll) } } #endif /*--------------------------------------------------------------------------*/ /* Sprite layer rendering functions */ /*--------------------------------------------------------------------------*/ void render_obj_tms(int line) { int x, start, end; uint8 *lb, *sg; uint8 color, pattern[2]; uint16 temp; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Default sprite width (8 pixels) */ int width = 8; /* Adjust width for 16x16 sprites */ width <<= ((reg[1] & 0x02) >> 1); /* Adjust width for zoomed sprites */ width <<= (reg[1] & 0x01); /* Latch SOVR flag from previous line to VDP status */ status |= spr_ovr; /* Clear SOVR flag for current line */ spr_ovr = 0; /* Draw sprites in front-to-back order */ while (count--) { /* Sprite X position */ start = object_info->xpos; /* Sprite Color + Early Clock bit */ color = object_info->size; /* X position shift (32 pixels) */ start -= ((color & 0x80) >> 2); /* Pointer to line buffer */ lb = &linebuf[0][0x20 + start]; if ((start + width) > 256) { /* Clip sprites on right edge */ end = 256 - start; start = 0; } else { end = width; if (start < 0) { /* Clip sprites on left edge */ start = 0 - start; } else { start = 0; } } /* Sprite Color (0-15) */ color &= 0x0F; /* Sprite Pattern Name */ temp = object_info->attr; /* Mask two LSB for 16x16 sprites */ temp &= ~((reg[1] & 0x02) >> 0); temp &= ~((reg[1] & 0x02) >> 1); /* Pointer to sprite generator table */ sg = (uint8 *)&vram[((reg[6] << 11) & 0x3800) | (temp << 3) | object_info->ypos]; /* Sprite Pattern data (2 x 8 pixels) */ pattern[0] = sg[0x00]; pattern[1] = sg[0x10]; if (reg[1] & 0x01) { /* Zoomed sprites are rendered at half speed */ for (x=start; x> 4) & 1]; temp = (temp >> (7 - ((x >> 1) & 7))) & 0x01; temp = temp * color; temp |= (lb[x] << 8); lb[x] = lut[5][temp]; status |= ((temp & 0x8000) >> 10); temp &= 0x00FF; temp |= (lb[x+1] << 8); lb[x+1] = lut[5][temp]; status |= ((temp & 0x8000) >> 10); } } else { /* Normal sprites */ for (x=start; x> 3) & 1]; temp = (temp >> (7 - (x & 7))) & 0x01; temp = temp * color; temp |= (lb[x] << 8); lb[x] = lut[5][temp]; status |= ((temp & 0x8000) >> 10); } } /* Next sprite entry */ object_info++; } /* handle Game Gear reduced screen (160x144) */ if ((system_hw == SYSTEM_GG) && !config.gg_extra && (v_counter < bitmap.viewport.h)) { int line = v_counter - (bitmap.viewport.h - 144) / 2; if ((line < 0) || (line >= 144)) { memset(&linebuf[0][0x20], 0x40, 256); } else { if (bitmap.viewport.x > 0) { memset(&linebuf[0][0x20], 0x40, 48); memset(&linebuf[0][0x20+48+160], 0x40, 48); } } } } void render_obj_m4(int line) { int i, xpos, end; uint8 *src, *lb; uint16 temp; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Default sprite width */ int width = 8; /* Sprite Generator address mask (LSB is masked for 8x16 sprites) */ uint16 sg_mask = (~0x1C0 ^ (reg[6] << 6)) & (~((reg[1] & 0x02) >> 1)); /* Zoomed sprites (not working on Genesis VDP) */ if (system_hw < SYSTEM_MD) { width <<= (reg[1] & 0x01); } /* Unused bits used as a mask on 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { sg_mask |= 0xC0; } /* Latch SOVR flag from previous line to VDP status */ status |= spr_ovr; /* Clear SOVR flag for current line */ spr_ovr = 0; /* Draw sprites in front-to-back order */ while (count--) { /* Sprite pattern index */ temp = (object_info->attr | 0x100) & sg_mask; /* Pointer to pattern cache line */ src = (uint8 *)&bg_pattern_cache[(temp << 6) | (object_info->ypos << 3)]; /* Sprite X position */ xpos = object_info->xpos; /* X position shift */ xpos -= (reg[0] & 0x08); if (xpos < 0) { /* Clip sprites on left edge */ src = src - xpos; end = xpos + width; xpos = 0; } else if ((xpos + width) > 256) { /* Clip sprites on right edge */ end = 256 - xpos; } else { /* Sprite maximal width */ end = width; } /* Pointer to line buffer */ lb = &linebuf[0][0x20 + xpos]; if (width > 8) { /* Draw sprite pattern (zoomed sprites are rendered at half speed) */ DRAW_SPRITE_TILE_ACCURATE_2X(end,0,lut[5]) /* 315-5124 VDP specific */ if (system_hw < SYSTEM_SMS2) { /* only 4 first sprites can be zoomed */ if (count == (object_count[line] - 4)) { /* Set default width for remaining sprites */ width = 8; } } } else { /* Draw sprite pattern */ DRAW_SPRITE_TILE_ACCURATE(end,0,lut[5]) } /* Next sprite entry */ object_info++; } /* handle Game Gear reduced screen (160x144) */ if ((system_hw == SYSTEM_GG) && !config.gg_extra && (v_counter < bitmap.viewport.h)) { int line = v_counter - (bitmap.viewport.h - 144) / 2; if ((line < 0) || (line >= 144)) { memset(&linebuf[0][0x20], 0x40, 256); } else { if (bitmap.viewport.x > 0) { memset(&linebuf[0][0x20], 0x40, 48); memset(&linebuf[0][0x20+48+160], 0x40, 48); } } } } void render_obj_m5(int line) { int i, column; int xpos, width; int pixelcount = 0; int masked = 0; uint8 *src, *s, *lb; uint32 temp, v_line; uint32 attr, name, atex; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Draw sprites in front-to-back order */ while (count--) { /* Sprite X position */ xpos = object_info->xpos; /* Sprite masking */ if (xpos) { /* Requires at least one sprite with xpos > 0 */ spr_ovr = 1; } else if (spr_ovr) { /* Remaining sprites are not drawn */ masked = 1; } /* Display area offset */ xpos = xpos - 0x80; /* Sprite size */ temp = object_info->size; /* Sprite width */ width = 8 + ((temp & 0x0C) << 1); /* Update pixel count (off-screen sprites are included) */ pixelcount += width; /* Is sprite across visible area ? */ if (((xpos + width) > 0) && (xpos < bitmap.viewport.w) && !masked) { /* Sprite attributes */ attr = object_info->attr; /* Sprite vertical offset */ v_line = object_info->ypos; /* Sprite priority + palette bits */ atex = (attr >> 9) & 0x70; /* Pattern name base */ name = attr & 0x07FF; /* Mask vflip/hflip */ attr &= 0x1800; /* Pointer into pattern name offset look-up table */ s = &name_lut[((attr >> 3) & 0x300) | (temp << 4) | ((v_line & 0x18) >> 1)]; /* Pointer into line buffer */ lb = &linebuf[0][0x20 + xpos]; /* Max. number of sprite pixels rendered per line */ if (pixelcount > max_sprite_pixels) { /* Adjust number of pixels to draw */ width -= (pixelcount - max_sprite_pixels); } /* Number of tiles to draw */ width = width >> 3; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Draw sprite patterns */ for (column = 0; column < width; column++, lb+=8) { temp = attr | ((name + s[column]) & 0x07FF); src = &bg_pattern_cache[(temp << 6) | (v_line)]; DRAW_SPRITE_TILE(8,atex,lut[1]) } } /* Sprite limit */ if (pixelcount >= max_sprite_pixels) { /* Sprite masking is effective on next line if max pixel width is reached */ spr_ovr = (pixelcount >= bitmap.viewport.w); /* Stop sprite rendering */ return; } /* Next sprite entry */ object_info++; } /* Clear sprite masking for next line */ spr_ovr = 0; } void render_obj_m5_ste(int line) { int i, column; int xpos, width; int pixelcount = 0; int masked = 0; uint8 *src, *s, *lb; uint32 temp, v_line; uint32 attr, name, atex; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Clear sprite line buffer */ memset(&linebuf[1][0], 0, bitmap.viewport.w + 0x40); /* Draw sprites in front-to-back order */ while (count--) { /* Sprite X position */ xpos = object_info->xpos; /* Sprite masking */ if (xpos) { /* Requires at least one sprite with xpos > 0 */ spr_ovr = 1; } else if (spr_ovr) { /* Remaining sprites are not drawn */ masked = 1; } /* Display area offset */ xpos = xpos - 0x80; /* Sprite size */ temp = object_info->size; /* Sprite width */ width = 8 + ((temp & 0x0C) << 1); /* Update pixel count (off-screen sprites are included) */ pixelcount += width; /* Is sprite across visible area ? */ if (((xpos + width) > 0) && (xpos < bitmap.viewport.w) && !masked) { /* Sprite attributes */ attr = object_info->attr; /* Sprite vertical offset */ v_line = object_info->ypos; /* Sprite priority + palette bits */ atex = (attr >> 9) & 0x70; /* Pattern name base */ name = attr & 0x07FF; /* Mask vflip/hflip */ attr &= 0x1800; /* Pointer into pattern name offset look-up table */ s = &name_lut[((attr >> 3) & 0x300) | (temp << 4) | ((v_line & 0x18) >> 1)]; /* Pointer into line buffer */ lb = &linebuf[1][0x20 + xpos]; /* Adjust number of pixels to draw for sprite limit */ if (pixelcount > max_sprite_pixels) { width -= (pixelcount - max_sprite_pixels); } /* Number of tiles to draw */ width = width >> 3; /* Pattern row index */ v_line = (v_line & 7) << 3; /* Draw sprite patterns */ for (column = 0; column < width; column++, lb+=8) { temp = attr | ((name + s[column]) & 0x07FF); src = &bg_pattern_cache[(temp << 6) | (v_line)]; DRAW_SPRITE_TILE(8,atex,lut[3]) } } /* Sprite limit */ if (pixelcount >= max_sprite_pixels) { /* Sprite masking is effective on next line if max pixel width is reached */ spr_ovr = (pixelcount >= bitmap.viewport.w); /* Merge background & sprite layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[4], bitmap.viewport.w); /* Stop sprite rendering */ return; } /* Next sprite entry */ object_info++; } /* Clear sprite masking for next line */ spr_ovr = 0; /* Merge background & sprite layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[4], bitmap.viewport.w); } void render_obj_m5_im2(int line) { int i, column; int xpos, width; int pixelcount = 0; int masked = 0; int odd = odd_frame; uint8 *src, *s, *lb; uint32 temp, v_line; uint32 attr, name, atex; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Draw sprites in front-to-back order */ while (count--) { /* Sprite X position */ xpos = object_info->xpos; /* Sprite masking */ if (xpos) { /* Requires at least one sprite with xpos > 0 */ spr_ovr = 1; } else if (spr_ovr) { /* Remaining sprites are not drawn */ masked = 1; } /* Display area offset */ xpos = xpos - 0x80; /* Sprite size */ temp = object_info->size; /* Sprite width */ width = 8 + ((temp & 0x0C) << 1); /* Update pixel count (off-screen sprites are included) */ pixelcount += width; /* Is sprite across visible area ? */ if (((xpos + width) > 0) && (xpos < bitmap.viewport.w) && !masked) { /* Sprite attributes */ attr = object_info->attr; /* Sprite y offset */ v_line = object_info->ypos; /* Sprite priority + palette bits */ atex = (attr >> 9) & 0x70; /* Pattern name base */ name = attr & 0x03FF; /* Mask vflip/hflip */ attr &= 0x1800; /* Pattern name offset lookup table */ s = &name_lut[((attr >> 3) & 0x300) | (temp << 4) | ((v_line & 0x18) >> 1)]; /* Pointer into line buffer */ lb = &linebuf[0][0x20 + xpos]; /* Adjust width for sprite limit */ if (pixelcount > max_sprite_pixels) { width -= (pixelcount - max_sprite_pixels); } /* Number of tiles to draw */ width = width >> 3; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Render sprite patterns */ for(column = 0; column < width; column ++, lb+=8) { temp = attr | (((name + s[column]) & 0x3ff) << 1); src = &bg_pattern_cache[((temp << 6) | (v_line)) ^ ((attr & 0x1000) >> 6)]; DRAW_SPRITE_TILE(8,atex,lut[1]) } } /* Sprite Limit */ if (pixelcount >= max_sprite_pixels) { /* Sprite masking is effective on next line if max pixel width is reached */ spr_ovr = (pixelcount >= bitmap.viewport.w); /* Stop sprite rendering */ return; } /* Next sprite entry */ object_info++; } /* Clear sprite masking for next line */ spr_ovr = 0; } void render_obj_m5_im2_ste(int line) { int i, column; int xpos, width; int pixelcount = 0; int masked = 0; int odd = odd_frame; uint8 *src, *s, *lb; uint32 temp, v_line; uint32 attr, name, atex; /* Sprite list for current line */ object_info_t *object_info = obj_info[line]; int count = object_count[line]; /* Clear sprite line buffer */ memset(&linebuf[1][0], 0, bitmap.viewport.w + 0x40); /* Draw sprites in front-to-back order */ while (count--) { /* Sprite X position */ xpos = object_info->xpos; /* Sprite masking */ if (xpos) { /* Requires at least one sprite with xpos > 0 */ spr_ovr = 1; } else if (spr_ovr) { /* Remaining sprites are not drawn */ masked = 1; } /* Display area offset */ xpos = xpos - 0x80; /* Sprite size */ temp = object_info->size; /* Sprite width */ width = 8 + ((temp & 0x0C) << 1); /* Update pixel count (off-screen sprites are included) */ pixelcount += width; /* Is sprite across visible area ? */ if (((xpos + width) > 0) && (xpos < bitmap.viewport.w) && !masked) { /* Sprite attributes */ attr = object_info->attr; /* Sprite y offset */ v_line = object_info->ypos; /* Sprite priority + palette bits */ atex = (attr >> 9) & 0x70; /* Pattern name base */ name = attr & 0x03FF; /* Mask vflip/hflip */ attr &= 0x1800; /* Pattern name offset lookup table */ s = &name_lut[((attr >> 3) & 0x300) | (temp << 4) | ((v_line & 0x18) >> 1)]; /* Pointer into line buffer */ lb = &linebuf[1][0x20 + xpos]; /* Adjust width for sprite limit */ if (pixelcount > max_sprite_pixels) { width -= (pixelcount - max_sprite_pixels); } /* Number of tiles to draw */ width = width >> 3; /* Pattern row index */ v_line = (((v_line & 7) << 1) | odd) << 3; /* Render sprite patterns */ for(column = 0; column < width; column ++, lb+=8) { temp = attr | (((name + s[column]) & 0x3ff) << 1); src = &bg_pattern_cache[((temp << 6) | (v_line)) ^ ((attr & 0x1000) >> 6)]; DRAW_SPRITE_TILE(8,atex,lut[3]) } } /* Sprite Limit */ if (pixelcount >= max_sprite_pixels) { /* Sprite masking is effective on next line if max pixel width is reached */ spr_ovr = (pixelcount >= bitmap.viewport.w); /* Merge background & sprite layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[4], bitmap.viewport.w); /* Stop sprite rendering */ return; } /* Next sprite entry */ object_info++; } /* Clear sprite masking for next line */ spr_ovr = 0; /* Merge background & sprite layers */ merge(&linebuf[1][0x20], &linebuf[0][0x20], &linebuf[0][0x20], lut[4], bitmap.viewport.w); } /*--------------------------------------------------------------------------*/ /* Sprites Parsing functions */ /*--------------------------------------------------------------------------*/ void parse_satb_tms(int line) { int i = 0; /* Sprite counter (4 max. per line) */ int count = 0; /* no sprites in Text modes */ if (!(reg[1] & 0x10)) { /* Y position */ int ypos; /* Sprite list for next line */ object_info_t *object_info = obj_info[(line + 1) & 1]; /* Pointer to sprite attribute table */ uint8 *st = &vram[(reg[5] << 7) & 0x3F80]; /* Sprite height (8 pixels by default) */ int height = 8; /* Adjust height for 16x16 sprites */ height <<= ((reg[1] & 0x02) >> 1); /* Adjust height for zoomed sprites */ height <<= (reg[1] & 0x01); /* Parse Sprite Table (32 entries) */ do { /* Sprite Y position */ ypos = st[i << 2]; /* Check end of sprite list marker */ if (ypos == 0xD0) { break; } /* Wrap Y coordinate for sprites > 256-32 */ if (ypos >= 224) { ypos -= 256; } /* Y range */ ypos = line - ypos; /* Sprite is visible on this line ? */ if ((ypos >= 0) && (ypos < height)) { /* Sprite overflow */ if (count == 4) { /* Flag is set only during active area */ if (line < bitmap.viewport.h) { spr_ovr = 0x40; } break; } /* Adjust Y range back for zoomed sprites */ ypos >>= (reg[1] & 0x01); /* Store sprite attributes for later processing */ object_info->ypos = ypos; object_info->xpos = st[(i << 2) + 1]; object_info->attr = st[(i << 2) + 2]; object_info->size = st[(i << 2) + 3]; /* Increment Sprite count */ ++count; /* Next sprite entry */ object_info++; } } while (++i < 32); } /* Update sprite count for next line */ object_count[(line + 1) & 1] = count; /* Insert number of last sprite entry processed */ status = (status & 0xE0) | (i & 0x1F); } void parse_satb_m4(int line) { int i = 0; uint8 *st; /* Sprite counter (8 max. per line) */ int count = 0; /* Y position */ int ypos; /* Sprite list for next line */ object_info_t *object_info = obj_info[(line + 1) & 1]; /* Sprite height (8x8 or 8x16) */ int height = 8 + ((reg[1] & 0x02) << 2); /* Sprite attribute table address mask */ uint16 st_mask = ~0x3F80 ^ (reg[5] << 7); /* Unused bits used as a mask on 315-5124 VDP only */ if (system_hw > SYSTEM_SMS) { st_mask |= 0x80; } /* Pointer to sprite attribute table */ st = &vram[st_mask & 0x3F00]; /* Parse Sprite Table (64 entries) */ do { /* Sprite Y position */ ypos = st[i]; /* Check end of sprite list marker (no effect in extended modes) */ if ((ypos == 208) && (bitmap.viewport.h == 192)) { break; } /* Wrap Y coordinate for sprites > 256-16 */ if (ypos > 240) { ypos -= 256; } /* Y range */ ypos = line - ypos; /* Adjust Y range for zoomed sprites (not working on Mega Drive VDP) */ if (system_hw < SYSTEM_MD) { ypos >>= (reg[1] & 0x01); } /* Check if sprite is visible on this line */ if ((ypos >= 0) && (ypos < height)) { /* Sprite overflow */ if (count == 8) { /* Flag is set only during active area */ if ((line >= 0) && (line < bitmap.viewport.h)) { spr_ovr = 0x40; } break; } /* Store sprite attributes for later processing */ object_info->ypos = ypos; object_info->xpos = st[(0x80 + (i << 1)) & st_mask]; object_info->attr = st[(0x81 + (i << 1)) & st_mask]; /* Increment Sprite count */ ++count; /* Next sprite entry */ object_info++; } } while (++i < 64); /* Update sprite count for next line */ object_count[(line + 1) & 1] = count; } void parse_satb_m5(int line) { /* Y position */ int ypos; /* Sprite height (8,16,24,32 pixels)*/ int height; /* Sprite size data */ int size; /* Sprite link data */ int link = 0; /* Sprite counter */ int count = 0; /* max. number of rendered sprites (16 or 20 sprites per line by default) */ int max = bitmap.viewport.w >> 4; /* max. number of parsed sprites (64 or 80 sprites per line by default) */ int total = max_sprite_pixels >> 2; /* Pointer to sprite attribute table */ uint16 *p = (uint16 *) &vram[satb]; /* Pointer to internal RAM */ uint16 *q = (uint16 *) &sat[0]; /* Sprite list for next line */ object_info_t *object_info = obj_info[(line + 1) & 1]; /* Adjust line offset */ line += 0x81; do { /* Read Y position from internal SAT cache */ ypos = (q[link] >> im2_flag) & 0x1FF; /* Check if sprite Y position has been reached */ if (line >= ypos) { /* Read sprite size from internal SAT cache */ size = q[link + 1] >> 8; /* Sprite height */ height = 8 + ((size & 3) << 3); /* Y range */ ypos = line - ypos; /* Check if sprite is visible on current line */ if (ypos < height) { /* Sprite overflow */ if (count == max) { status |= 0x40; break; } /* Update sprite list (only name, attribute & xpos are parsed from VRAM) */ object_info->attr = p[link + 2]; object_info->xpos = p[link + 3] & 0x1ff; object_info->ypos = ypos; object_info->size = size & 0x0f; /* Increment Sprite count */ ++count; /* Next sprite entry */ object_info++; } } /* Read link data from internal SAT cache */ link = (q[link + 1] & 0x7F) << 2; /* Stop parsing if link data points to first entry (#0) or after the last entry (#64 in H32 mode, #80 in H40 mode) */ if ((link == 0) || (link >= bitmap.viewport.w)) break; } while (--total); /* Update sprite count for next line (line value already incremented) */ object_count[line & 1] = count; } /*--------------------------------------------------------------------------*/ /* Pattern cache update function */ /*--------------------------------------------------------------------------*/ void update_bg_pattern_cache_m4(int index) { int i; uint8 x, y, c; uint8 *dst; uint16 name, bp01, bp23; uint32 bp; for(i = 0; i < index; i++) { /* Get modified pattern name index */ name = bg_name_list[i]; /* Pattern cache base address */ dst = &bg_pattern_cache[name << 6]; /* Check modified lines */ for(y = 0; y < 8; y++) { if(bg_name_dirty[name] & (1 << y)) { /* Byteplane data */ bp01 = *(uint16 *)&vram[(name << 5) | (y << 2) | (0)]; bp23 = *(uint16 *)&vram[(name << 5) | (y << 2) | (2)]; /* Convert to pixel line data (4 bytes = 8 pixels)*/ /* (msb) p7p6 p5p4 p3p2 p1p0 (lsb) */ bp = (bp_lut[bp01] >> 2) | (bp_lut[bp23]); /* Update cached line (8 pixels = 8 bytes) */ for(x = 0; x < 8; x++) { /* Extract pixel data */ c = bp & 0x0F; /* Pattern cache data (one pattern = 8 bytes) */ /* byte0 <-> p0 p1 p2 p3 p4 p5 p6 p7 <-> byte7 (hflip = 0) */ /* byte0 <-> p7 p6 p5 p4 p3 p2 p1 p0 <-> byte7 (hflip = 1) */ dst[0x00000 | (y << 3) | (x)] = (c); /* vflip=0 & hflip=0 */ dst[0x08000 | (y << 3) | (x ^ 7)] = (c); /* vflip=0 & hflip=1 */ dst[0x10000 | ((y ^ 7) << 3) | (x)] = (c); /* vflip=1 & hflip=0 */ dst[0x18000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); /* vflip=1 & hflip=1 */ /* Next pixel */ bp = bp >> 4; } } } /* Clear modified pattern flag */ bg_name_dirty[name] = 0; } } void update_bg_pattern_cache_m5(int index) { int i; uint8 x, y, c; uint8 *dst; uint16 name; uint32 bp; for(i = 0; i < index; i++) { /* Get modified pattern name index */ name = bg_name_list[i]; /* Pattern cache base address */ dst = &bg_pattern_cache[name << 6]; /* Check modified lines */ for(y = 0; y < 8; y ++) { if(bg_name_dirty[name] & (1 << y)) { /* Byteplane data (one pattern = 4 bytes) */ /* LIT_ENDIAN: byte0 (lsb) p2p3 p0p1 p6p7 p4p5 (msb) byte3 */ /* BIG_ENDIAN: byte0 (msb) p0p1 p2p3 p4p5 p6p7 (lsb) byte3 */ bp = *(uint32 *)&vram[(name << 5) | (y << 2)]; /* Update cached line (8 pixels = 8 bytes) */ for(x = 0; x < 8; x ++) { /* Extract pixel data */ c = bp & 0x0F; /* Pattern cache data (one pattern = 8 bytes) */ /* byte0 <-> p0 p1 p2 p3 p4 p5 p6 p7 <-> byte7 (hflip = 0) */ /* byte0 <-> p7 p6 p5 p4 p3 p2 p1 p0 <-> byte7 (hflip = 1) */ #ifdef LSB_FIRST /* Byteplane data = (msb) p4p5 p6p7 p0p1 p2p3 (lsb) */ dst[0x00000 | (y << 3) | (x ^ 3)] = (c); /* vflip=0, hflip=0 */ dst[0x20000 | (y << 3) | (x ^ 4)] = (c); /* vflip=0, hflip=1 */ dst[0x40000 | ((y ^ 7) << 3) | (x ^ 3)] = (c); /* vflip=1, hflip=0 */ dst[0x60000 | ((y ^ 7) << 3) | (x ^ 4)] = (c); /* vflip=1, hflip=1 */ #else /* Byteplane data = (msb) p0p1 p2p3 p4p5 p6p7 (lsb) */ dst[0x00000 | (y << 3) | (x ^ 7)] = (c); /* vflip=0, hflip=0 */ dst[0x20000 | (y << 3) | (x)] = (c); /* vflip=0, hflip=1 */ dst[0x40000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); /* vflip=1, hflip=0 */ dst[0x60000 | ((y ^ 7) << 3) | (x)] = (c); /* vflip=1, hflip=1 */ #endif /* Next pixel */ bp = bp >> 4; } } } /* Clear modified pattern flag */ bg_name_dirty[name] = 0; } } /*--------------------------------------------------------------------------*/ /* Window & Plane A clipping update function (Mode 5) */ /*--------------------------------------------------------------------------*/ void window_clip(unsigned int data, unsigned int sw) { /* Window size and invert flags */ int hp = (data & 0x1f); int hf = (data >> 7) & 1; /* Perform horizontal clipping; the results are applied in reverse if the horizontal inversion flag is set */ int a = hf; int w = hf ^ 1; /* Display width (16 or 20 columns) */ sw = 16 + (sw << 2); if(hp) { if(hp > sw) { /* Plane W takes up entire line */ clip[w].left = 0; clip[w].right = sw; clip[w].enable = 1; clip[a].enable = 0; } else { /* Plane W takes left side, Plane A takes right side */ clip[w].left = 0; clip[a].right = sw; clip[a].left = clip[w].right = hp; clip[0].enable = clip[1].enable = 1; } } else { /* Plane A takes up entire line */ clip[a].left = 0; clip[a].right = sw; clip[a].enable = 1; clip[w].enable = 0; } } /*--------------------------------------------------------------------------*/ /* Init, reset routines */ /*--------------------------------------------------------------------------*/ void render_init(void) { int bx, ax; /* Initialize layers priority pixel look-up tables */ uint16 index; for (bx = 0; bx < 0x100; bx++) { for (ax = 0; ax < 0x100; ax++) { index = (bx << 8) | (ax); lut[0][index] = make_lut_bg(bx, ax); lut[1][index] = make_lut_bgobj(bx, ax); lut[2][index] = make_lut_bg_ste(bx, ax); lut[3][index] = make_lut_obj(bx, ax); lut[4][index] = make_lut_bgobj_ste(bx, ax); lut[5][index] = make_lut_bgobj_m4(bx,ax); } } /* Initialize pixel color look-up tables */ palette_init(); /* Make sprite pattern name index look-up table (Mode 5) */ make_name_lut(); /* Make bitplane to pixel look-up table (Mode 4) */ make_bp_lut(); } void render_reset(void) { /* Clear display bitmap */ memset(bitmap.data, 0, bitmap.pitch * bitmap.height); /* Clear line buffers */ memset(linebuf, 0, sizeof(linebuf)); /* Clear color palettes */ memset(pixel, 0, sizeof(pixel)); /* Clear pattern cache */ memset ((char *) bg_pattern_cache, 0, sizeof (bg_pattern_cache)); /* Reset Sprite infos */ spr_ovr = spr_col = object_count[0] = object_count[1] = 0; } /*--------------------------------------------------------------------------*/ /* Line rendering functions */ /*--------------------------------------------------------------------------*/ void render_line(int line) { /* Check display status */ if (reg[1] & 0x40) { /* Update pattern cache */ if (bg_list_index) { update_bg_pattern_cache(bg_list_index); bg_list_index = 0; } /* Render BG layer(s) */ render_bg(line); /* Render sprite layer */ render_obj(line & 1); /* Left-most column blanking */ if (reg[0] & 0x20) { if (system_hw > SYSTEM_SGII) { memset(&linebuf[0][0x20], 0x40, 8); } } /* Parse sprites for next line */ if (line < (bitmap.viewport.h - 1)) { parse_satb(line); } /* Horizontal borders */ if (bitmap.viewport.x > 0) { memset(&linebuf[0][0x20 - bitmap.viewport.x], 0x40, bitmap.viewport.x); memset(&linebuf[0][0x20 + bitmap.viewport.w], 0x40, bitmap.viewport.x); } } else { /* Master System & Game Gear VDP specific */ if (system_hw < SYSTEM_MD) { /* Update SOVR flag */ status |= spr_ovr; spr_ovr = 0; /* Sprites are still parsed when display is disabled */ parse_satb(line); } /* Blanked line */ memset(&linebuf[0][0x20 - bitmap.viewport.x], 0x40, bitmap.viewport.w + 2*bitmap.viewport.x); } /* Pixel color remapping */ remap_line(line); } void blank_line(int line, int offset, int width) { memset(&linebuf[0][0x20 + offset], 0x40, width); remap_line(line); } void remap_line(int line) { /* Line width */ int width = bitmap.viewport.w + 2*bitmap.viewport.x; /* Pixel line buffer */ uint8 *src = &linebuf[0][0x20 - bitmap.viewport.x]; /* Adjust line offset in framebuffer */ line = (line + bitmap.viewport.y) % lines_per_frame; /* Take care of Game Gear reduced screen when overscan is disabled */ if (line < 0) return; /* Adjust for interlaced output */ if (interlaced && config.render) { line = (line * 2) + odd_frame; } #if defined(USE_15BPP_RENDERING) || defined(USE_16BPP_RENDERING) /* NTSC Filter (only supported for 15 or 16-bit pixels rendering) */ if (config.ntsc) { if (reg[12] & 0x01) { md_ntsc_blit(md_ntsc, ( MD_NTSC_IN_T const * )pixel, src, width, line); } else { sms_ntsc_blit(sms_ntsc, ( SMS_NTSC_IN_T const * )pixel, src, width, line); } } else #endif { #ifdef CUSTOM_BLITTER CUSTOM_BLITTER(line, width, pixel, src) #else /* Convert VDP pixel data to output pixel format */ PIXEL_OUT_T *dst = ((PIXEL_OUT_T *)&bitmap.data[(line * bitmap.pitch)]); if (config.lcd) { do { RENDER_PIXEL_LCD(src,dst,pixel,config.lcd); } while (--width); } else { do { *dst++ = pixel[*src++]; } while (--width); } #endif } } core/input_hw/paddle.c000664 001750 001750 00000006652 12702465756 016113 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Paddle Control support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; } paddle[2]; void paddle_reset(int index) { input.analog[index][0] = 128; paddle[index>>2].State = 0x40; } INLINE unsigned char paddle_read(int port) { /* FIRE button status (active low) */ unsigned char temp = ~(input.pad[port] & 0x10); /* Pad index */ int index = port >> 2; /* Clear low bits */ temp &= 0x70; /* Japanese model: automatic flip-flop */ if (region_code < REGION_USA) { paddle[index].State ^= 0x40; } if (paddle[index].State & 0x40) { /* return higher bits */ temp |= (input.analog[port][0] >> 4) & 0x0F; } else { /* return lower bits */ temp |= input.analog[port][0] & 0x0F; /* set TR low */ temp &= ~0x20; } return temp; } INLINE void paddle_write(int index, unsigned char data, unsigned char mask) { /* update bits set as output only */ paddle[index].State = (paddle[index].State & ~mask) | (data & mask); } unsigned char paddle_1_read(void) { return paddle_read(0); } unsigned char paddle_2_read(void) { return paddle_read(4); } void paddle_1_write(unsigned char data, unsigned char mask) { paddle_write(0, data, mask); } void paddle_2_write(unsigned char data, unsigned char mask) { paddle_write(1, data, mask); } gx/images/Ctrl_menacer.png000664 001750 001750 00000011023 12702465756 016704 0ustar00sergiosergio000000 000000 PNG  IHDRPXbBpsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=gIDATx{U?g%RHH `ZV2jGkKg Db#؋:eDv6H;@@k[K@7dw?ow!Aw~ޞy\< h02-Lub` 0:cf/@xxN斎J7M@7b0x;8VK:8X7Ɠ b u+ux ꀽH͎G nvY3kNq}'Z<ߏHDw]H^58@ϡF=*=,E:ډBbI[\0`fǹۀY#fYw?`f `?1Wʴ߇TM3kKZݽ>B~d+[ۑ6"7wD-Ez1i`u?x%p>pujw4WȴwrPi0j|?g! nrGlpjюkG"tPlm6`G3)8p+"{93{-,p 3ȾĶ9/z6b؆(bͮ؆sLI")(مS(HQg(_r7NdC"i(> p[5#+^W@]}^.D^|/@fݿ8݊Y!Zb| rX+#u%3 y@Rϣ́#?Vy-H)FA(tx Q{;2~c@(XxEw"qP̋!G;Y\ifp`4r`#lFya)=HvS>L4E6(G&9B Ko4hcklE# dOkAZa6i8p?[ KZ(iS3(xnG@ (ڌ *e~>;%GKPvhp 5Ű/q.aW-q]r,y0bMEtk+;iThQF3|=~ٰeh|݄=BVTCHvĮ4@pk\77I]5}@ kN8 x17ٍP(rFa3R_Hf! 2) v4g Q'G(l.q`1}^.N=Fu6b9R(yr CCFFj&s75StXڽu.sڎf6 ~T:2hքF*(əꗁ{Kbs NP]34]GGjj)4`6)^Pkt$-/n茼'jZ)-ިQ>\yB5[(ؗ )vCH%P~Ka4hy~B43 `ƠYN{t=h S;煛lv̏w 6E`uD v%y팞RHT* 11-DB }SyOƃwP]:hAĬvalĜ5KK^Aw"vPt\޼vB~xM0}A9{?8.poSf_G#^XCLI7dg̺ܽ퍉Pb :KGb!\HW&jދ߯LNS> 4ӀgL;5GhTFvDPg Flzx{*ff ~4)ԩǣ~{1oZ~/*3=53eRdW9;9-<:jp6.nu['* Q\&bv7wFS3,JߠZȫo(Ia QL@"iC6$4\x^KzG?W (eþ$:ڢ ǖӒ8~OjSK_Yȓ=6Q&w%Z 1 @X_F)dF3n-@z.@ _2Gl% _w!Vi"F"?@]# "vRkPoB c!Vkܾ5ܣ.PK#SFgI~dGۑ.F̻ݷTy zțΠvA,x{kg3[ .bQE'd_Hz~Tq=f E=lۇ C7\4b8 wű!&sZ׎G̊,Fn"%(tT"mBk:L@qc;>[¤Zv %&}L@Ûϟ |TuD٘gI׋B`u!rf!! d7E=kAΑE]N;P2"f\u,c f@iؿ12^<%657VٻrW lH iX4S) uJ:`NiX4S) uJ:`NiX4S) wpCʟMt|M[S:Vұ{*Iy82N/+y_,r'ί}YZLт|8]{-oOVKy[G{nf'>oCo \K}p[Eٕu뉍(Pqe*O,8V)JO!ƮxMJ^wQ=#UQ27 ίrRe4[6" B}cq{oߊ>XB̯FCUʻb^FxuIkpwrTHO<(A\?Sz?HnGʵxuy73Ǖ~U糬SW#Fn,URUʲ뗣XF,&:k˲Ѫ4k)EnJ N'v[(;5 k+O@qekFTX{\^z\QWZ#UHo8W5jxeE]&,IIENDB`gx/gui/filesel.c000664 001750 001750 00000055515 12702465756 014724 0ustar00sergiosergio000000 000000 /* * filesel.c * * File Browser * * Copyright Eke-Eke (2009-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "filesel.h" #include "font.h" #include "gui.h" #include "file_load.h" #include "history.h" #define BG_COLOR_1 {0x49,0x49,0x49,0xff} #define BG_COLOR_2 {0x66,0x66,0x66,0xff} #define SCROLL_SPEED 10 extern const u8 Browser_dir_png[]; extern const u8 Snap_empty_png[]; extern const u8 Cart_md_png[]; extern const u8 Cart_ms_png[]; extern const u8 Cart_gg_png[]; extern const u8 Cart_sg_png[]; FILEENTRIES filelist[MAXFILES]; static int offset = 0; static int selection = 0; static int maxfiles = 0; static int string_offset = 0; static char prev_folder[MAXJOLIET]; static void selector_cb(void); /*****************************************************************************/ /* GUI Buttons data */ /*****************************************************************************/ static butn_data arrow_up_data = { {NULL,NULL}, {Button_up_png,Button_up_over_png} }; static butn_data arrow_down_data = { {NULL,NULL}, {Button_down_png,Button_down_over_png} }; /*****************************************************************************/ /* GUI Arrows button */ /*****************************************************************************/ static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; /*****************************************************************************/ /* GUI helpers */ /*****************************************************************************/ static gui_item action_cancel = { NULL,Key_B_png,"","Previous Directory",10,422,28,28 }; static gui_item action_select = { NULL,Key_A_png,"","Load file",602,422,28,28 }; /*****************************************************************************/ /* GUI Background images */ /*****************************************************************************/ static gui_image bg_filesel[14] = { {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,152}, {NULL,Frame_s2_png,0,384,264,248,140,152}, {NULL,Snap_empty_png,IMAGE_VISIBLE,424,148,160,112,255}, {NULL,NULL,0,424,148,160,112,255}, {NULL,NULL,0,388,147,240,152,255}, {NULL,NULL,0,388,147,240,152,255}, {NULL,NULL,0,392,118,232,148,255}, {NULL,NULL,0,414,116,184,188,255}, {NULL,NULL,0,416,144,180,228,255} }; static const u8 *Cart_png[FILETYPE_MAX] = { Cart_md_png, Cart_md_png, Cart_ms_png, Cart_gg_png, Cart_sg_png }; static const char *Cart_dir[FILETYPE_MAX] = { "md", "cd", "ms", "gg", "sg" }; static gui_image dir_icon; static gui_image bar_over; /*****************************************************************************/ /* GUI Descriptor */ /*****************************************************************************/ static gui_menu menu_selector = { "Game Selection", -1,-1, 0,0,14,0, NULL, NULL, bg_filesel, {&action_cancel, &action_select}, {&arrow_up,&arrow_down}, selector_cb }; static void selector_cb(void) { int i; char text[MAXPATHLEN]; int yoffset = 108; /* Draw browser array */ gxDrawRectangle(15, 108, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 134, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 160, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 186, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 212, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 238, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 264, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 290, 358, 26, 127, (GXColor)BG_COLOR_2); gxDrawRectangle(15, 316, 358, 26, 127, (GXColor)BG_COLOR_1); gxDrawRectangle(15, 342, 358, 26, 127, (GXColor)BG_COLOR_2); /* Draw Files list */ for (i = offset; (i < (offset + 10)) && (i < maxfiles); i++) { if (i == selection) { /* selection bar */ gxDrawTexture(bar_over.texture,bar_over.x,yoffset+bar_over.y,bar_over.w,bar_over.h,255); /* scrolling text */ if ((string_offset/SCROLL_SPEED) >= strlen(filelist[i].filename)) { string_offset = 0; } if (string_offset) { sprintf(text,"%s ",filelist[i].filename+string_offset/SCROLL_SPEED); strncat(text, filelist[i].filename, string_offset/SCROLL_SPEED); } else { strcpy(text, filelist[i].filename); } /* print text */ if (filelist[i].flags) { /* directory icon */ gxDrawTexture(dir_icon.texture,dir_icon.x,yoffset+dir_icon.y,dir_icon.w,dir_icon.h,255); if (FONT_write(text,18,dir_icon.x+dir_icon.w+6,yoffset+22,bar_over.w-dir_icon.w-26,(GXColor)WHITE)) { /* text scrolling */ string_offset ++; } } else { if (FONT_write(text,18,26,yoffset+22,bar_over.w-20,(GXColor)WHITE)) { /* text scrolling */ string_offset ++; } } } else { if (filelist[i].flags) { /* directory icon */ gxDrawTexture(dir_icon.texture,dir_icon.x,yoffset+dir_icon.y,dir_icon.w,dir_icon.h,255); FONT_write(filelist[i].filename,18,dir_icon.x+dir_icon.w+6,yoffset+22,bar_over.w-dir_icon.w-26,(GXColor)WHITE); } else { FONT_write(filelist[i].filename,18,26,yoffset+22,bar_over.w-20,(GXColor)WHITE); } } yoffset += 26; } } /**************************************************************************** * FileSelector * * Browse directories and select a file from the file listing * return ROM size * ****************************************************************************/ int FileSelector(int type) { short p; int i; int old = -1; char fname[MAXPATHLEN]; FILE *snap; gui_menu *m = &menu_selector; int offset_ = -1; int selection_ = -1; int maxfiles_ = -1; #ifdef HW_RVL int x,y; gui_butn *button; #endif /* Background overlay */ if (config.bg_overlay) { bg_filesel[1].state |= IMAGE_VISIBLE; } else { bg_filesel[1].state &= ~IMAGE_VISIBLE; } /* Hide all cartridge labels */ for (i=0; i= FILETYPE_MAX) { /* Save current ROM browser */ offset_ = offset; maxfiles_ = maxfiles; selection_ = selection; /* Initialize ROM browser */ maxfiles = ParseDirectory(); selection = offset = 0; while (selection < maxfiles) { if (strstr(config.sys_rom[type-FILETYPE_MAX], filelist[selection].filename)) { offset = selection; while ((offset > (maxfiles - 10)) && (offset > 0)) { offset--; } break; } selection++; } /* By default, select first file in directory if ROM is not found */ if (selection >= maxfiles) { selection = 0; } /* Set menu title and cartridge label type */ switch (type - FILETYPE_MAX) { case 0: { strcpy(m->title,"Sega CD (USA) BIOS Selection"); type = FILETYPE_MD; break; } case 1: { strcpy(m->title,"Mega CD (PAL) BIOS Selection"); type = FILETYPE_MD; break; } case 2: { strcpy(m->title,"Mega CD (JAP) BIOS Selection"); type = FILETYPE_MD; break; } case 3: { strcpy(m->title,"Mega Drive/Genesis BootROM Selection"); type = FILETYPE_MD; break; } case 4: { strcpy(m->title,"Master System (USA) BootROM Selection"); type = FILETYPE_MS; break; } case 5: { strcpy(m->title,"Master System (PAL) BootROM Selection"); type = FILETYPE_MS; break; } case 6: { strcpy(m->title,"Master System (JAP) BootROM Selection"); type = FILETYPE_MS; break; } case 7: { strcpy(m->title,"Game Gear BootROM Selection"); type = FILETYPE_GG; break; } case 8: { strcpy(m->title,"Game Genie ROM Selection"); type = FILETYPE_MD; break; } case 9: { strcpy(m->title,"Action Replay (Pro) ROM Selection"); type = FILETYPE_MD; break; } case 10: { strcpy(m->title,"Sonic & Knuckles ROM Selection"); type = FILETYPE_MD; break; } case 11: { strcpy(m->title,"Sonic 2 & Knuckles ROM Selection"); type = FILETYPE_MD; break; } } } else { /* reset menu title */ strcpy(m->title, "Game Selection"); } /* Set default helper for Back button */ strcpy(m->helpers[0]->comment, "Exit"); /* Check if we are not browsing recent file list */ if (type >= 0) { /* Select cartridge type */ bg_filesel[9 + type].data = Cart_png[type]; bg_filesel[9 + type].state |= IMAGE_VISIBLE; /* Get current directory */ char *dir = GetCurrentDirectory(); /* Get current directory name length */ int size = strlen(dir); /* Check if we are not in Root directory */ if (size > 1) { if (dir[size - 2] != ':') { /* Update helper for Back button */ strcpy(m->helpers[0]->comment, "Previous Directory"); } } /* Initialize directory icon */ dir_icon.texture = gxTextureOpenPNG(Browser_dir_png,0); dir_icon.w = dir_icon.texture->width; dir_icon.h = dir_icon.texture->height; dir_icon.x = 26; dir_icon.y = (26 - dir_icon.h)/2; } /* Initialize selection bar */ bar_over.texture = gxTextureOpenPNG(Overlay_bar_png,0); bar_over.w = bar_over.texture->width; bar_over.h = bar_over.texture->height; bar_over.x = 16; bar_over.y = (26 - bar_over.h)/2; /* Initialize Menu */ GUI_InitMenu(m); string_offset = 0; while (1) { /* ROM file snapshot/database */ if (old != selection) { /* close any screenshot texture first */ gxTextureClose(&bg_filesel[8].texture); bg_filesel[8].state &= ~IMAGE_VISIBLE; old = selection; string_offset = 0; if (!filelist[selection].flags) { /* recent game list -> variable game types */ if (type < 0) { /* check if game type has changed */ type = history.entries[selection].filetype; if (!(bg_filesel[9 + type].state & IMAGE_VISIBLE)) { /* hide all cartridge labels */ for (i=0; i 0) && (fname[i] != '.')) i--; if (i > 0) fname[i] = 0; /* add PNG file extension */ strcat(fname, ".png"); /* try to load screenshot file */ snap = fopen(fname, "rb"); if (snap) { bg_filesel[8].texture = gxTextureOpenPNG(0,snap); if (bg_filesel[8].texture) { bg_filesel[8].state |= IMAGE_VISIBLE; } fclose(snap); } } } /* update Action button helper */ if (m->selected != -1) { /* out of focus */ strcpy(action_select.comment,""); } else if (filelist[selection].flags) { /* this is a directory */ strcpy(action_select.comment,"Open Directory"); } else { /* this is a ROM file */ if (offset_ != -1) { /* System ROM browser */ strcpy(action_select.comment,"Select File"); } else { /* Normal ROM browser */ strcpy(action_select.comment,"Load File"); } } /* Draw menu*/ GUI_DrawMenu(m); #ifdef HW_RVL if (Shutdown) { gxTextureClose(&bar_over.texture); gxTextureClose(&dir_icon.texture); gxTextureClose(&w_pointer); GUI_DeleteMenu(m); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); } else if (m_input.ir.valid) { /* get cursor position */ x = m_input.ir.x; y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* ensure we are in the selectable area */ if ((x < 380) && (y >= 108) && (y <= 368)) { /* find selected item */ selection = (y - 108) / 26; if (selection > 9) selection = 9; selection += offset; if (selection >= maxfiles) selection = old; /* reset selection */ m->selected = -1; } else { /* disable selection */ m->selected = m->max_buttons + 2; /* find selected button */ for (i=0; i<2; i++) { button = m->arrows[i]; if (button) { if (button->state & BUTTON_VISIBLE) { if ((x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) { m->selected = m->max_buttons + i; break; } } } } } } else { /* reset selection */ m->selected = -1; } #endif /* copy EFB to XFB */ gxSetScreen(); p = m_input.keys; /* highlight next item */ if (p & PAD_BUTTON_DOWN) { selection++; if (selection >= maxfiles) selection = offset = 0; else if (selection >= (offset + 10)) offset++; } /* highlight previous item */ else if (p & PAD_BUTTON_UP) { selection--; if (selection < 0) { selection = maxfiles - 1; offset = maxfiles - 10; if (offset < 0) offset = 0; } else if (selection < offset) offset --; } /* go back one page */ else if (p & (PAD_TRIGGER_L | PAD_BUTTON_LEFT)) { if (maxfiles >= 10) { selection -= 10; if (selection < 0) { /* first page */ selection = offset = 0; } else if (selection < offset) { /* previous page */ offset -= 10; if (offset < 0) offset = 0; } } } /* go forward one page */ else if (p & (PAD_TRIGGER_R | PAD_BUTTON_RIGHT)) { if (maxfiles >= 10) { selection += 10; if (selection > maxfiles - 1) { /* last page */ selection = maxfiles - 1; offset = maxfiles - 10; } else if (selection >= (offset + 10)) { /* next page */ offset += 10; if (offset > (maxfiles - 10)) offset = maxfiles - 10; } } } /* quit */ else if (p & PAD_TRIGGER_Z) { /* System ROM selection */ if (offset_ != -1) { /* restore current ROM browser */ offset = offset_; maxfiles = maxfiles_; selection = selection_; } gxTextureClose(&bar_over.texture); gxTextureClose(&dir_icon.texture); GUI_DeleteMenu(m); return -1; } /* previous directory */ else if (p & PAD_BUTTON_B) { string_offset = 0; /* recent ROM list */ if (type < 0) { /* exit */ gxTextureClose(&bar_over.texture); gxTextureClose(&dir_icon.texture); GUI_DeleteMenu(m); return -1; } /* update browser directory (and get current folder)*/ if (UpdateDirectory(1, prev_folder)) { /* get directory entries */ maxfiles = ParseDirectory(); /* Get current directory */ char *dir = GetCurrentDirectory(); /* current directory name length */ int size = strlen(dir); /* Adjust helper for back button */ if ((size > 1) && (dir[size - 2] != ':')) { /* Back button goes up one directory */ strcpy(m->helpers[0]->comment, "Previous Directory"); } else { /* Back button exits from root directory */ strcpy(m->helpers[0]->comment, "Exit"); } /* clear selection by default */ selection = offset = 0; old = -1; /* select previous directory */ for (i=0; i= (offset + 10)) { offset += 10; if (offset > (maxfiles - 10)) offset = maxfiles - 10; } break; } } } else { /* System ROM selection */ if (offset_ != -1) { /* restore current ROM browser */ offset = offset_; maxfiles = maxfiles_; selection = selection_; } /* Exit */ gxTextureClose(&bar_over.texture); gxTextureClose(&dir_icon.texture); GUI_DeleteMenu(m); return -1; } } /* open selected file or directory */ else if (p & PAD_BUTTON_A) { string_offset = 0; /* ensure we are in focus area */ if (m->selected < m->max_buttons) { if (filelist[selection].flags) { /* get new directory */ UpdateDirectory(0, filelist[selection].filename); /* get directory entries */ maxfiles = ParseDirectory(); /* clear selection by default */ selection = offset = 0; old = -1; } else { int ret; /* System ROM selection */ if (offset_ != -1) { /* return ROM file index */ ret = selection; /* restore current ROM browser */ offset = offset_; maxfiles = maxfiles_; selection = selection_; } else { /* load ROM file from device then return ROM size (zero if an error occured) */ ret = LoadFile(selection); } /* exit menu */ gxTextureClose(&bar_over.texture); gxTextureClose(&dir_icon.texture); GUI_DeleteMenu(m); return ret; } } #ifdef HW_RVL /* arrow buttons selected */ else if (m->selected == m->max_buttons) { /* up arrow */ selection--; if (selection < 0) { selection = maxfiles - 1; offset = selection - 10 + 1; } if (selection < offset) offset -= 10; if (offset < 0) offset = 0; } else if (m->selected == (m->max_buttons+1)) { /* down arrow */ selection++; if (selection == maxfiles) selection = offset = 0; if ((selection - offset) >= 10) offset += 10; } #endif } } } void ClearSelector(u32 max) { maxfiles = max; offset = 0; selection = 0; } gx/images/Bg_credits.png000664 001750 001750 00001071653 12702465756 016373 0ustar00sergiosergio000000 000000 PNG  IHDRh2JQsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time07/14/10pcVH IDATxYlq&9YUw pIi$2fzd2$Έ $Ѝ}2D?jEhlܪ8|`Q0ƀ@`l 0@Sa` 4ES  PLb: a1@ŸsYbxnTsm@&̧-" - ɰេg@ZNQlzմa?*ض*Teз #'-NU1 hMњb=ק"iİ. T۹cQ4TAƙYHx ,^v>zb3 &U@D'^3\Pcttsl' L? $ e-eYa}[ A0 a03ܟo1 0FhMa0(0jN#߿X6AT F%[?4pei)vҠXyT'vewqwO? ߽ygn//[WѱwwwV1p|`3g~ן~;>8NXv=̀[xe]ϸ~ve]S󆛛+'\_ppbo'?? ,g>kQH`Qq\aoc zvzqoLm󱇾uZ=mam{E7\ >jg/A1GCw v/ KS<ϮK{||,p7RRəP c FFbZ "8|w BL103#x8&Krn`%.)s"@42 ܠrk|-) I(>F*: 87LU9GDMXpg+ ~#" }ka2) CXui8W|G~#DC.1)F3ZQՕ MbAMJB+i9(iG8QFed.;;#XqSț qsoܿr䏦`8Q1-p,8BEʋ[X߶}eໃ EFuZ.˲H̓%`V$ѷ-<:13hG;t)p 7h'={ݶܣt;v;iNsm0,} Vɿf@Br`etp2`mRB#.oZprV$/a[O G8Trj .7|x|<9bʏ`]u|OzAtDO% n[@-;y:k/'?L{*YNt6eKC.mnۏ|}_|z~ M%dPp ,-X[qBt蛁f /gS^Z6w/7*^Sؤ+?óW,*Tq9j4IN)qh]P*I q)f`Kt̀N%BF1$VL2/T&d* R;F$@JDUV 1B9DtRu04>bl0JN(25c._Bpuzw0t.8OG{ph _~'OSw>aQuc;y@;G" ^% ac 9cEU0$"[Щ[%TqV$0}!C3& 0)ՈtP@=j'1FΆ2A+$ Gh7T43%4 ,B sG\SY_34b_! -Z9P Ԗk b = )j5)ulYCK|g0ӀG]$,!r h v9= }?zhЋ}F"f/#呤2<ٖr(D#Uv 通%o =sW(> 8ًK;:HF~C֞`Ui#z<sȭb`I9<=1G>1L׍P_+"x-* J)ʒI6s nOʅLB`4G"x<2)⴮LFr`2҆QD= 1A@[4"Fd*g*_K-qpI;a >8mx%}gt*yg-M_ւV: _xް @k>֙DwJl ^.tI}~ &|xR'X7>DnLs* i7MHNAh* bIIQ%1;˲4"@ӖPϢ2N,h1I&e'TQ˒5(&8`J^ gNiH`R.8B#(Tб Fw#="} u sjLʷT=ٚa4눶/(]/> zkFﰁ &bgAf{>"c? }pwdZ;+j# ISA„e=+d3ҷGT3eޙF!$tL>ƽ1QneΩt$tm>_|<'U4g,E"2֦faV*T[[~M jrO =%i1 ^pug90QM{&tģ^[-5=tU:2t lEC(@{LnOHd`zAE=>B(AcQG4?fv0EEۇ]Jg̣wlddZ,j+8/3ކPH`L ܦ9K%3D KSs+{"~ԆϮ6b}p:o+dg}4Rӆ~oN)1tX|&aPjcfDt wҰ[kÂ~H&-0.?Jˬ`wr}aLF2FNtqpg=+3BHgE3uBX ۇ#kb:'6H9 ݊|ϿyaO_\W/YZ:sޗ6{F0TnzdU`i N瞀dqp5/`^jEHOI# ~EE ?-ܧ({ϏspRp5<;n[2OW^+A-p4$r8LQ@zp@2%#Z:)KFBG ҠViYHjZgeṃQ# U3v.Lj@<ÈI)-SFh1Bߘ Uyp"a29l#RƞNAE>eAܚԉ0WlNh3̼"e6 L"tA񯘃3xU0QZ!Wӹqn1iLPFD%'h3'vnG_n75~u"GlN3:oN->{u/ǻN7X)R%yS4s6=Iu>l#M2mrTWel̩)krֵ M};yڊ'%Tlznrn4Lc: IJ̔yWXm1 +V|igk(so>Qh% 24%s &826\%kFC#T'#Je\dxL5jaSMsc؃;Hk޾{Og\gCgg_fv7DdOAZr "# p#hS6<}2ـ͆ҋ$mmNQr<5$>R*ukEק3ZR#Z7,?`)ɠx9 K$ P󋬋ڞtLh4A(C.50̣*@FRGl.&|ZS(m:*'?uL9 pXq>ഝqeeźf< 7(Z>zj&70CWV|Y\N#|:.tf)i N<+4$Fms=@?AK \;0EE1))9)!jGՌGP17QͬpSWJK(N>i=BGϨK fʹ#)"=IcK5RzwWp/m3$57hjS!.7OMp:Oc;S#_~o|H'FS_ ȀEj|=/4*9Z,!CI+KxL Qife{pKBќC38W0h*eƆ6Ў E$ct]فFFKeyGy)3*|M }Ũzs咽eX?I6X0D#< f WdD-ukY1Sx'/7, q.Ig :< R :3>UZ٧# Lt Sl0Qfٮ&WÅA59YK8eaK2+D3q=GN)^.$y=ze]:z. 7#>UmUo⟿}Sǟ#|W}x_x_nx8n. #2 9l^вra! g=+O~uB1U[4z~ +yAU/Dƛ5=$Ő?H*]e,3}J90=J404+1jSCAK%X}υR~bR&\ IDATw=3JK23$B='ƘV?UՍ( .h(x} ; 48,*}, leroqTu|:c4Ox[J[Ng܅}l@[F^6,"K;W2 N4$a%OgޖH96(w*.z( Ju6 TMsLy`l !ɗp0/AZl'?Vkt:#dM<43FJPK0FYu!VzJ<D`{$hGhޅd_,#"G;S_<՞-Ɯ{;"'-CnT F,R2 =4\(PZDѧ(I ?mr'c ce7 ybޏi'W^o_{5I9G %y8{="%esbAOH%^D'Wn#hA4jM߰.w8tLCmt,!JE j򈆣ž}ǃ TӋ4֐}A 3\6Kni8{E e|/rjԨd]v^;4,y3'-e--$az"56mth-yYox~uW7-Kq~?-~0úq}sٷϿ'w7_X؝N'mfw;LwSyPrY30|h*0z >} 燇r 9 $:ׁN Hfr)JdT@&Y):Wӂl`'ul(T[*`sgk'* Ź.#u:.e m*:`~zx1L_(PL̇bPFYD2̥Bx%77lqW'~aBx}ض49`X)ʽ d@b.po#B|rifTsa}3"EEfXӏ=i/}6dYwi#"y紻h N~ @Nyɟ/4:lNYC pgv u)=EUfXcxm[[hx~F tl3(eBх ˝Uj1 ƶaxOD TG 1jy Oft' TGyj,U1k2Kwug'5 vZBƴ;J&T55!]HjE*Ƴ$.yʙcڷh5 n72Yq8q&l>p0C6=δ9V9 vNx3F f9ew'hMp}+&h)ˈrFW#\3hnڹ-͚0q>z+߽qد:֝?k<6wX`]syRz˵˦~ hoxow}My6 _3 IuBx)I"%^Z_ujd8]02`z o+ RP 6'Ƴde3L^GM̛"Rb h\P`MPT"^Oz>fWVE>p5PC,rϳj[`DG fRd8a0(-$Csj>חPAA4m9Fa؆e;)1vWOgp<~`PU,^v'#Ln;=na }:_2L'B laNղ#B=N`/{kM\Zx yGɲ S[4r' Q`n+]Q x50ynF/3EU+/yϼ&/t2BԵ-Fh gnQ)@Ɉ\m ׏)Fѥy"5XucF-SlP >d+vuYLx:\LiY>x^X&~r=P`?6݆x=X6N-n_SOSM`ڼJCx,7$hX3a"IϾh3`6<7oQ,n4H/ʪ@oL̇cmr6ML@N5#i{ ?sؚ @Q`[Ahl'$C:=e7 @xКTi 0Cu%eT7mdjHPZ{~5t#<:W[|nm`^xtiX#*3ln,+nXN7=6'O/"IS҅iXipXG1 ;F|l|-%kZliR}a |%M50z7H *6l&[gXP9קgct cz\EF]w&G #G9K-̼SJ3f;&)zߦg64Ie6 QjߩsȀTtD\4'PeϮUn}1Po\ռLNDe01[jƍȻGzmr*r)e961RA)WJ҆5|: XRNN[| llrXdKIGΟt<ݺ˫8@0eE%n|DV]`bX*^8`GuoWѪohp'\%˧_} f0@ZAa~[| &û:Ԅ(LH_ʦ Liڌ2.eRϺM2hST, dNwqpW l0Aǩ*B(s6 k՟8xXo.0z+0IZDS\ythEܣ1{FhK  oh`D`% 艈pd XH}az#ӫDiEJS5J%Lml=lm]p9| yqO?{wn[[OP,$D rCFR`qI2 o6iNijT0vʜWB&TqYE`61TlV! f~*/۳3өT ABwT-=ݭ3/ jL#qf!ȁf6!M:r$kdJߛfeRA6q|wLk63=wy\n {q3Qmgt9yD!,ٟd¿J?b.lA܆Vqeq,X8= b~RpzJ);dr2ϼc, NG?4 aY4AD?X5,}`l!sQ?` a ścKT/U"vPS[8V՛5>d.lsKf*F|Kz^`;_)$ -\>Ħ5FƜ>$?cND?=>FƐ, ! i*xix墯KsϬ& RF9f@%PT+OhQmO` ߔetTü r={yxoT$:< G䨹Aq#A:<"F 5̰. nO#%ج&XUCEl34+v6HFXnGlfX)Oj[>z ltʨS+?yv>'!Y+6ƕF9Hhu%@`Hբ ⢬D~R"h"AF%l`*F{?!tpn#jߍ7SDi!V=1UwSYđG@3F!fdyEFAiY4V`e a6(?}Җl@oA 6U2B&-t%tZE}2F(+(]QY^r6D~ʺ<՝|v إ#Љ h ֝.z eDȎBs/7:nX$K߯AL~-4o}m|8Xw^l燍4HMm@Ӂ޽F]p%h:_9G;wxv`#J1n88dP\=y]bhg~k=cʝm;1|x7+>s, ~|G5j@Ory6)W2YDഘqcX\X 򊣙MB9h)R tF(9sЇ*`h1DGq>A Mі186u86/Uw?` ۜ`8l B\#Ru}4BR /#NP49zq."FAPnFPR l",g[3)xN݇琵=>xxx8y,T M; 8xulR2"²]cL(#"\ XuZcJMpA\?F f12?S#%prz+67bАϐ/R/5B{9Fgce4 [`DG,pǐxZM[_Cwi]G{ )YdәQ66SuqI]dG ,ŝcڗi/LN2u5vFt @:5Y~qzօy{SZ{A>oZ?5޼^]g^W\і@`p}~xei8=n8oe[&;`#p9'L~XoR'ԡˢ8am ~l6\ p̩{<3x'RK7q86y{"z,wD˜^V4k/ 09~adj}>oT BeJp S)_7uG/nH @=\0V ͻcA]QDx"ɫ|E.#yߝ HCE@㠇HFz#i@`QR = 0@A{ǺLuYD"Ua/ (E#l? 'jh_ِvQNg 8Ҥta ̵`̕]%C m7lͰL[nmx /^@U٧5F7=no38ӂP%#B~!K/dc=|?Ey:;Ty9pT<:Gd1FQۂ:9Z;A0ePR kV5m "z3LJIK)P/15`$x3їk}jS/M\]YK04rT % ufw/4ӽ@D`t28J[\,θ=:f(䈀˜{qm~ ٶ7|i٣Z,7u_6M;:S.~%6{|ͣT˨p ǎԷ-')4c1z,Bg'=ɨ|2JD )2U1CbI0E٨'-l~$I"d=*2dTI9K) ׿(>H&YҊI "wOPZ[P0T@Ls[S?ְ. ֱd ai^Lͫ&,86#WU~'jQ=(V}pw·߾G=d\>{~gೊldس&FMϥV+ )Gu?<=H֖e]gsZ.ST%P Z <ג4 , AutC:fR^&G$Y*E"rF| mD5y\@,@Ef7Fs#mg#'c2ӼqfP CϞbo*UZn^Mzyi@DYg\ȉ{B -^1=9VTc'~zACW>~_yqy`_quw;쐷πYwnqpl:KZЮT_R?LV7|kQzL4n &PB7 "X'[sobL|`N0]%`OcB&eYŅiAtF9xsUZXDfz|u;o[J/3Ri~IH(FA0F,mа%V)Aj S65qض_. Z2&EUᡙ~Ėׄ}SU 5'LyꔑQLrACgM _\_y#޾v:낶4<~3ë70޼xZ8|:x P$;hꝁ Mqu}@c@A1?y(6v)͹%oS625G'RWif+PɠjBryu 3f]IV}ɶ%M[4=:M`DLĨ_^!w#"E-H)VęAS([ѽuYĖ6&T\g7ꦥ A-p,2Ob F&& (:d -{:eme|dT!ce!#j(YsdA[Ut3?1_W_~-}S W/o?Quk*8ϸ{:w҇(Ieqog/+vk9Nki/Azב"!~+yp_ lq n Tf@!bNgdu ~_ r$0K*eyZ/aTsPf@}YlBkR)TzSs^K!K^Hi/Y»3p#9Չ>hԘ ,>@fZDj: \l0*KO&Z7:LB&*=kΔq;+f>3m?J6#TVh@b0yEKp d)ӥƿCrLe4%k.@mAro :xw(G$O3ppDS[ֆ/o0'qsdzg7}pyυƐs-̼_4Dʂi@'al,L`5JZYbwEâ8Q[C1n[iG%pJE'Zi'm6? 谒Tܨ .79)T}F0 &f,>&wG#^Ȥ2S\DFaX|Pllz;0RX ?TTeSBǕ_cIHx`)y6џ: :;`[ÿͫ0d+ei:Js3zޢiM!|ɻfFP/!q=#Z }t,j>`i DU֪EUvbFn77şPc:KCm2p)Ͱ̧dnxq‰Ӈ#N/!vSKn'78\ə+^^`9v-لB'3- M'PhZ#i1Pamz"z(PV[ (R.D爞=tT軴xE#*X G`gAx b~_}={5btig0{Q=DC:Ȩ bq žIyj?nyTlf $FR(ΈsRA ^QB26Q̶85~V^0Ο( Gq1% KI8VQ0v)x=R5ͧ3ne~+QgN|, mtTy-A tF֬ }Y^Tt}ڂԑ|5tf0d(;[x3Qz퉭4010qß/~s6?W_ 67' .F.(G҇8hP^~\ C>t?.eQlEzAoYRtFNaUu5{独L #ۨ5*y.#P/Ίix{ v)zKYRZ3tY͗qfBwm?a .5 ɴL?SoK=gbT/`VJ^v(wa jܖv74^a2j߱ջw9:<:ӫEb7k%I>Ȭ:]{z@ LEd4>W)H̠*3{ M{TeFFNPߌ@(:ID^ Kn/j^X}x~0(PfWspudc̠UAuV䢈^a* --)׬ cL|x?b=8֚\7\.М޺W #CZ VPA&:CS](^y}l?4<hbGg%JI;{g}dS#{"=)[^t)|)x5"SpK&!%HʽIc,ˈ/6ZuL}+lkXhe~ pH_qpWC~ _~1締7$mNլr:"Ps %u#Zދ{|9矽O~ 6]}]_ b]$ۄLJuӍe4s9~fv#nL]t{^ =ޞOHN6h/tyR2|P(@Tk4X8Y_HwP)o=WQ)[ǫ)L\ w,E&]W/čG0 @`$^AE;}Ns.SqP:'Tp{4Ψu om1/>ShT9G ;v >Uհ\ ]y*o;b\ [h)*3HSϭV 9414vkOZ6ǣ(2i߬+ƴ<1D I54Ѣb!wOM)4z)OAJǾ \/[(?<ך?S,OWy1kDHDҲ$eG%Ka◌W`g 6#-^س&c$b43*U2$AH* _Vms#"%@V%RR,PBvv{[@[{zR2,ߟ-$A/KaeW!@xOSP51 u{^ \.WS{"ksb s"/&-{um'&it Bƞŝ?8V~{6zu>{ǏSu F Y~r|?.b@;47;{369T j^?f^a;ʊ^ [0 'hR\(7\0oMYl[[ 2.& Wr>TLB^bzt(JZ<"QI#|gx=Vjp6K` e.7|SM bU@[aPh}R9cޟb O'{#vӷx{sӘ7 k|Z,E]0ԋA֥P`ޞ/M}dQ opZadŇR]AyLJ17?Ol9-0݃_vҎ1/!l.ڢI~fLd)͍tBm@!5)0M0 ;)XfHPN|IBP)85n{VWw[* 蹎޻dߤ L4' vfrO;|n wP%"BPy3xG*~}Mx 9166ME3 d}߭ioZDŽgT PkS:1<_6_Ixr]~=" Dꚝ7ꅒF578sy "w7}Ww8xx7< @JϿcVZN4 @u. O dӸJ `о4Εh=׉&=(t[T́eљ@ GI<7y*i52!/Lץ{ flB& J|(yu4eB&s{Sxd}4c85`-Ǩ>&0-|>0g) h7L [3Eu>XjΒ]h*CϦ>%КX&[H.n OБxZ>=ȑ! *sSҒ1**&' V-##RAIIVj=֥~ۃ/ G#Fﵞޒs 0q8i  0i σ"M\0ѩ! ֬Qvo yƈkVsg /Ϩ< u@w"h L0r{1ѾmOxO޾ÇcZ49ݽ}uþ] hsxT!t67֐texRAJtT+%|/]E9ѫ]->*ԕT+wH4_AEfϸ ݸ)zVxi%hF-trNK$"^D@aT% }O>'VM|y Ǐz0u u9=LĿw7>g_|UM'?7܂9NlTrf"oGn1G~xfmVm}mXJ0.r =خ6} )V?_!ŝZ TaE}ۂc6cQTO/mJ4WKUZ7L1W/'CVb ʁ JW7b?ɹ5vS054}_ Yi)oDY~(xH.ӄ+#ViB `c97oG[% 8 ÙB*:B {5!ÚwP6~6Z6@+DO=R 1,ft BqX,CA}]AxAeB~F53<dnJg"D>3 =ұ.Ưg엋Z>N7sX3LV흞n£0⸆r tGj`#7]eZUV4.ĩPVU҈1|e}ɼP*(-R0qtU"Jʟ\DC:~E#u_WP>H_q5EͻfX{&AnBs"VҸ~)@?sh|S\sc}<53L/b1+}H^?5 H2u[gWP( 7}8u~Pm}p> nڬ}uƏ7={Q[y-4$,ϭv i{65P,[R[Lס-臠{w:"ԇ#p- [u,K̈ WMK'(3' Ͼ,@]m<\hPu~1=*b"-s>lz dPy8YER`滅l by=d{0ޏqf3qF#e2yRJ^ NU^&pT*jBWpZ/2S"dq=iʣ0N[8>?b *#nE(_T&/o,> K}\OC:JP>uN/?@ ?xs7}a@mcwys\Mg]qXߙ 6r-܂twAO4\(ǽi~4aWFѓЌ66?-h6OWD$0ijo0$X#&3dZlT}е,lV낰vuX{FFa@^" w(o8~z|u4s"~w"5(u@ 'òɭaWPn_n@k~h9B5"E4 T)BKB Ә1w4Ov^\g }Bԥf]*4r=A3KiLOOV9C`"ՒzقC|O=օ+:?'{P”Ho mY1ԁŽPuسhKkN8߬xz &x^X<ěrlA|.M(z+%`P =77`!*_v u{@oZAp pn" %L [Mak詼/tzvyvZ1PE?8θ<=cZEU;g~Nżp-+.8Mf62KˡRE yӿ$sMW!r)02=zcӤR9γ3vs-zٷzQ8R| s>< @>  e&0jPaN<"Q,xɛ)0i #Bk J?71}ˏϘ^O)+ s`=` S.ϗ|`FT!Q^9uAw:G&d27w'#(6 s3wTQ}`L,F؆C)=o^Xs,E-)LhD eLl9 dCUA65LE %cf. pP уTPғwY"UցT éh[MG(XiQҺ\Znis效hPj"IYXN6yF) o-*#_+wM4˾7a;Y,`S\q`l;DahЊiϥc\6{?`D44|CDe[ MKN!:fY*GhXϑ k V:2R % ,&plhas*[ 89 %r:':9qs|vyU\%3@5r`gDgj;:C7EXON@27%c2KQ$k2ﴩ@hш7Ɠ"HNx"pV&,:22QA/i;DK!YTQUysj=5Mpn[؜C&=*{O{ʳ.'bٌz_~pޣ> SBzc{¾?c>c !@7^3$+ЎM;+b_Wsw'f` nmI MxŦn58-ŻK^F_/0 Due,lkQHt:hlv)Ⱥ{r4'6oOGeheE~w smYŬ>q-)k?7%?3zxEiU/6k= _i1}u $N+h;||v)LaW>Q̖m U>ZQj t{ 1tnJnTbY=!l!B  5 s ܾv8#f@f/*%)qV ~| >͡6f3#w}:x\np=AM$? {WgtCԠMWtKfx/a pby}ӣv @6#~y f 4P&bU/Jll>qؓHk@Bײ"H/8a@9bK5ZUdAcRGp^|>*YKG¬pOV粯 t{s /o$e:@ҢŠփ;2tHq?Iχpu :N&}lQ4RyV ځ]' Qy^|eqL4(|mݤÂ(¶ y"R%AV?3F[C p (Ø`Sc[$Yʳ2RCkIx"~9*wYTeIg(B#W7tokA%09@Zs3xw͹-n'y |G_|o!4"̷!<_$I/N;(9y&8!!|Ҋcg,;pC_$·Ɵ'nϹxN?@Fb] ?% v}S@SάSJ,c"VȵkA *󒣶Jn!$32` k"mB텔͸~iI+HhN̘Ah눮GR?k  J~+ k/mCX]*"ݪ`zN0(f?9qgz=QDی YZc^GҘ d@z▮ l@ b41ƑtBթٷyDS-\Hy\A5=\ȧ,'$#~W=Qܯ zjL0cr$[YM]@O@!0/TdX2kLhEkHz/wb, n`qi6-Gۨq, | 1^Mr苍Zo3 ,I }*)cO1ܛ my60vۻ}Lc`*9Bkm}V{ЫmZ"G:"}~S>NЙ™kh>C:6_ 3&/5"o߹܁)e)2ci8`]m2#qr 1z^*z/[<d?FR=U:pɲES5FG!y~z槓6>|Qo./pW27!GlwZ8Bhq42vQ/w'MBv`EdsbVSXk[ >(-b*-~j̓@Oxxsuݟ{ei{}1qg1|qwsi]#r}cIF,S }i)yWs <=]׎f 0N `, r'CvE_}~2X' i7vo7?;ӝv aJY&qNbf!`&^ A)#5-F)CzKrT׃Wq%]OW4sq xlMz+Y0^ @xb!|%^X U?K"!Kx<)&Jh[gݺ.n "mp[ 1xP?No K &btsdz lެ2dNOu%@G U׺xb\7c`\ċ9sbB#,@"ҀLp-焞^pcGY{ ei8^>F`g5Q=ƴ8W2ym^jTLZJ>:Lؽ\-=NK5I6/j=B1C1>ŦvWpK+yO(֙0r0\Wd]*_i9BX7=C5U)Npºfi~Q)Up*hcR!$Mx8 ^̝~YȪJe8٣/^LJ?g>=Xזoa[ TwE H~htSy_ 'XI`g.(Z T9)CKozg[((Xܞy&8NT,v9?37Igchm4CS{LzjYOu3c8[ժ`@aFnL(Jb腦a(Hw\/@)(O\FoHõ?ΝSR[֣* S⸧l*uŊb}k#W[ Q§Z@ 3Õːd }8}cdE 몀ަɃv<ZdPfݢ9P܍1MV zf0º& mzx:LUX돍s7=Oh(zs~q(A^UPD atH[}r]󺛗f2<вoiGԁC8ؠ91'\@iIZF+ `kkN@O '=o7x@O`z %G*0-?8i.ia4y"w!e50'1g %<Ɔ5m?޾~mWz G|3ƾm\ҨMoZ9ɳsū4ukKsR1r~`vt0lR1X gC=WIUqvcdHyiEBuLs,|0aK0hǻwxUxWɃ = .Ac1p8yD;Ɏ9A t&,LBof 0[FKP 09]qrV,g89C͕ [hpUBΜq:̓kr+ g#0EE4ЌoPeEqnanqZp ϻGg/^Zue18Js̕;2l(͖]1č48Cyfb|a.YmJ4ދg74QBu Q0r]IY},D<&eHľ^0 ׺1.^GDRQ&pdMNZ,M/AX֎:6k_|IVyx(܅?]2`FCzu4 ζ/J53$9J䓁-&L]kcrAKP)qZ%1f{> JegqQ d7H mߞZ1gвW3ҰdmrA ,`?| s+%h}~ϰY#(IUQQV;'KvH*g3lɋYG!{DclI'ܷ<4xB"X\d%&/Z2s"#=BI|5 | ;ϲ/&W]RAós*V;& Z[o#ӊE$4bALhB4ж3Ę4 Ÿ!XKrDjb*^&P.e<֣qi ,x5ኟ}wP\YRujGE6`Ż2+|L̕o 8)#ox "Y\VC)V0AIk=,!q"F9sJ2uc~b9>$E9a?ҚBoE5IH!ndQr\.\m6fCUi >b" g/K &y技 WA!ʊ5Aba7fJPrړ. z_gA}!(h24 W>xT`cg9Dɬkbxr㞪:":P恡tP9LW! S΅-j}UUD(|>E^xˆB24AJ_@UAgOa"<`#5lAapZ&@eN hC( i˫w@6ۆeYNFctΉـ#Ɋ Zo*. , 9iЅtnlXF9b-RvGyj `!T]7 '-_/UGbCQT芟y?^C:ʽS_ S 4{)$k}ψJިz| c)dU_Dz K>E&ӛ >۟c`Y)[q bm,WVsNg/p J9ӰE&Zdlӣ=N >8WܞW,'z+|a`ԞS- rxq{ʵسެe$ڈ'kZ(@?@D`y` +ĄVk\%^pm(Hb8 0QTb+t^ F&k[3%t ޗ"?Cp$c#iëO^AZƺVm\w[yl` OL&U[BIQ7JxcaB+:%H} pq ՠRgl}NxJ?e_P 4x&{8ʺ8pd|6Dֳ* k/٫)smm_ |Og:*}nN#^{fa!e?4Έ7ZJ,x~JCm]1FC_oq?}N'ܾz "&hcb:fx8ּ=.J`oo校p:YnYy2C[.vkqb@h2S^ʰ,ˆ!Ko+gض B*oE89Ӱ}}4QtXZnX^ .+| KB~l!;dk~xg{BC9p G.5[Hx;8|\D J6;:ZS 3w/T@f ,ż,y[Ab)FkN^fԡzz1 ;qhE2"CN`ھ,8K, II?>X@nXCz+Baؤ稸 6^UN Y+~ANW;@g:LW0âs#c\h+ooRFXN'0*eZ‘fIg乧ArO$ȏqg&@/Na9[yqX( =A7ړB&(C pǒ<JHP% 4`Cg g 5֑B+`L1r Tk1vщ+M5_tX0}frZ`ʂeWoVۧ:-H+t`La14T+}Gթp#/{#Iʽ3gxH7k{qxC[o}kؿ-a `ָbZ{*{黳%E /HUotq/bv.3cz H^!Yuڪ2c3:ۅ-t"Z4 E8J3k|v A[h2Ybز/1-b\ I#Ned?RPT{m/(xhhx;@9QA*Ҙ`p bM\}WlJ0+ DQC[ebjkh$xPZ~ 籑glXXà@gEɭ~UAs28@)RB~ N3ޢbB3pC#4Z8D M&<;k,Gщy֛z HoX'+@Qz>a913t1 -tWOהϱ{8pW0'Y gEqVX;9Bc0IXISŃG8J4"_ȝ,Q=ބ< ne^|Y%VB4U Nc|˯q8[ |`&,OWˎ~^sL]?tEM:#_5|x)( / -sEf`ړpLj-RXjr]W[ũ7{x .XuiQ9oBki-Ͱl®G g<S#&%1+i cRJߍk2s^3Ilʆ > 668Xli(`/tf]\T~aIɧ IDATk^<#5qC\L/l23B*_/+%)-`{(Y@Z+w+4,F.Wk.ݗ 饳? \:~w=,z^g3 #T۳}Lg!b uzݓb"S]DgJ`ކLXsO(zmk9D :d.-,pb ?N9M~tt<_6w7xsZt.W`y#dfء+N7`^n2q9KB fN|?8eQ愾4<> _4+t^?/2R4p0ي@:mI#~ &hn]waKoON5Afс ;iTHE꠹ ;[F0@N,2@ Q$IqR,!*[7<}6)g`R1԰L9ʹ}[/d\BQcS+8fzAdcۍ=?!K?ji*,1G0/̐鱺p)$<=׽2W+$T&6ɫg_;i?~9&<;/??@O~ v9tlOthMRG"e>c89 %oӱXôL[ˆtƇp=f:#pυ[^C>K|:O_uh@ ȴh}VDRX 141D>Uk"/F`?+ nH[a:If_lY`me 4 z$_ P^ C sZ#'gȜ6dQcvm"8 %/f{ 97ڋW=nu/2<=< |@,춞V0N $y,IO6Ӂ|A,$o mۼѱXx"If҅QВ%,ǰI+3k̼X(UyEpOŁ8:޲r]ʂëRx@U ujooY4N7 U7'⛏x҉'c?^o;~7?7g4hg븠:w@g4ro}1}: :q !"m"V,7OK/SJOJ=cta#YUYM6IiHΑ^_elk-"ܯfgu*3#.;g|aTsR` sz&[GhD!g.;_95~}/>w8O@S}Bu\7oWe/.G~ArCkݟ%:|2̰?| w㻂Z[9i{cbnX>|@疷o}xTR׽lbMaR5\-15PB]<_Rb{LFq  6,tփ<|-NFi+Ƞr,k)=PO*),5]iηogaO#e̦9=z֢n&2XXn#㷄fY|M|Kg[TL3hs#/ۋCk}.Z߽1 Cж 3d‹%MBRqf;H ۜ S7O,a]cszlͼnVR@ڴJ7VxEoJp+٩}o"9k%5Q̜#18BPHD :RX5H (c,v{eoρ f* 0ms4SH-:5g|-;Y=9hAW~ױRNl: PÍzDm}B N "x"hTsQ5'&W|SEFRJ s>rmECOxgf !]GV^s|0 )d{+0δHtos' a3޽ [-􏸾y?7wW\zT8sG]lh{tSL R xzBp~Ϙ@^ͷx| >'^>řl5q~ϸ߼UmW|#xs^ oO/>GvYG,,$b 6`oo1F fʑE=gVr'-"C`S\HBJ``.hšgac zv< 2/K"7-bWlQt'KZ[dUNcqM$--5Lpf<^69:HW&2 k KY{wFha*! i!I tp`i 8x-}uPYQۦm,J%[·PX0"B-'DZXBPL gau5Åcj9o#mA~Ob mE -F}K7o]{+ WW*Bb2N bK f=l-?\Xq҆*ۺE Xeqaʍ"Y'efrX€ j< &k)#+i B(;QtA+T(^8w_tow\iiQIX񕤷叔%y˜XgrH\̒|ޗexYD3te+issU?3,Ή- ?=㸽v~-_ƾ]^+y7_}^pl/UP2hF]S)uUmQccbF 5d{D*ۢd9=>۾v Ձwx[xq?{b^?ĸ?ǁ߼yi֓計óBE"qF0V.h̭`I:{d%Y^ɅlEpr,2*Жjh6 !HmG b4۪̄}$S^P34]x4D̎VJ20_Xļ. DǜT ;.ۆ3HXV@7xeԨX5wy@Xĵ\{e*ٲ4]3[EvZI ֤@cEUHUd\h,6+E,GЌ %+as4WYxv\F(8*1T2OE|,n69r q˺dI .|^Ů^Kq: c*_\n*|_ůpLw 5cY]y dgSt@\[J:ȆN%m үzq<7튯w0cޟar0p>03? ^=| ߻gm4`IB@˄0d8AR U#((@$e2?U죈3,- l>pkL Gk4"m[xyC 96n">Ĉ"S𵪫H {J`htLI>'TIaN=ݘ%q8^/-!TZYhHF#s Epe xbWuA±Um*mZ]/셏{WM/{Oמx2Vk5_[CH-sK ʸVŶJfb߀cޚG@|0NjA_aP=_}&c~~ˡ0iQg53ȹްIa9Y_c$,+Xs&$a>{, sȭCհ7Y <^,yܪ4gem \[ CTJlf`om& [\z}x,s0{ @Kx Ы# ӊ۪eӎ}#8Co*)mY{9(p't"U= ܤw7,dm@m 3(x֞%@;*F0Ak -ޙLrZDr&ۋa(+֐źIGKcЫ68ȵCl`MC2\! '$?Df,֘h~k!Y8%IH֖}Q`'H[²/zhF7 [e=Bq7ekwH>e^(2r#Oܯ1[v9okYW=95e7tN),^q })枵1mP~ }_Ǔ{ ׽( eNYW\a!2`"藎~qP%} D5d<5 LwݝO7b}}[ǘ~q+7F#[ !.k*.0.tvlgA0`mwjsvꌽ Dv|Axbp*)u~% Ǡ8C 1 [%sy 8AՃ-f˩`ʆLE9o] ]5!fxO0a8D`z&:cD^D7`8V̤s#`z}L5DA@\Ƴ3*?ohKZYn$UKda%bSFg@[d'5%iucLIdpzagy Z~s(y"J AXN}c̲fqQꈝ&R08Hgb b1&7 i ؜Eiur%faT[@W-].)B%>;I@Zɝr\珇@8_ml=np}sԟȬٗ "S-$$yT]\VEr8h.,/ Rx$Oꌑr< S\Z/`OX6;zYZJîtׅۻ/ @iL`d &۶sx]teI 7E35։{85 70f,*4V>ЛHtE)kL sTЃYX.JUXP!-K?29O,cVGeIr:"rp)ŏ! pYݭ$i:ώvZkXxݟE=ܮu0#eAS'_C5_L 0$_] 5l ;xU"JY3,wZWɫZ0n///q~zgWu֗녎,%_BZ@\ &3]Ǘoa,G{2zXC ry ;>A[n):"5̰~M5MnĀ1'nSs~~9x* O&Z"۾&Z֠zN#I IDATآW+/WH!f8\w>~bЖ~@!>O@5u]~p^鉩AK+C / x/>߄dL@y2`PnEc >z5ω"= @32"hzTḘ{ K hae\6.=7pfa=ȸF#@pnu&MۣA9mFvq`o-z7۠A`eYrtgkZ j_#y- ђ1|/í| N&b8U-7/ۖ^u#j Ԗ7ZҤZŕ[]Xu ^͐A8qش1 ?w +C/=ۭ6<@~_е,Pk7/cfs/SL._QiK Ίlѝm|xx ]ϣm;ZVLC o05*+&ym;-ݿ3nĘt Eǎ?eiУ5+]`21W-sٕ؈D+Bj'msp'$HL˖t؜8;rj=3z ?\> 5ت3bz ݉VBo?`p+2#"9Bwkt ]fnejucNCo9d?]A. |3Ews"A}|0G`jŤs3!@uBqs*@ }Uƈ%ulP A&.JfTI֤Cmbۢ$K0x f=2 l ([spltN!)ʿ$Y u9݂7*zacӁE V;ri/'zr)$}ue)O=n= !`sG{؆L07 ̻ソw`('ہt{ݡ_+j Wㆶ]!x2H,,w6~`MX xK8RD0aymWxOÎ;?: ˇ"1&xOl r~4ܘ+`0 2_!1Jvi/HZ<]AWN!dq䲺=iAQsWgQB9'̼~RDR- AbL)k++\ r%| 3^zd~d ɾ1 F@"CܐV0 UEF̂NG&mI<^c[4PZ$3si0#Q&] E6Ƿ hVL,`"E/Wm"GR!H&-Z ܆;0}my^RJݘA{Xe\j{ #̊dAZ x|jg,vceu\$"~Ѭ |ʺ#.i-\hp?#5p-$H<[Ey9x;V4S7J5 wc,(0;@qzּ79u.>1X@` ZiܳҼs ToYDZ4W/o_}a#! sB/ 抶< ˷_a>F;?c||]~u 0+{k;7I(:&8fh{#}yl~zF7x(Ԭh/v@{X sDHb<3i S?a|xwQ?ħOOh+bYXs&ϗ33LP1FYMA-F@XaoeJjH`3x.kV1{E3xfU7/[8wd X5U)pS5qR!u–: %> Uc@a:"")m~8dQ* pt+i;XaUZ + Z썇YWp,o+HPb:1_"F TvO8 ΰ{UIwml3g88AG>{lsR`. fS"@4}$8x˪W͐\rshu4TQY6ϔ<7] zpr8ۖV/[sZ*($ <5ʨ|fc~ihۆ .x}h :8BD% b- x-|/`&/{ q$$hoXn? C`Ƒa8'xl/3Fv٠u_o͕uNxmx~N+OD0QQvi \hA5AZ,Ђӹ5vy'~ " Cm(#?ģJA ]̀tM,`' P̍cԓ# zGdY 2R5M+[21$0kFI ai@X)` k>Gd R5bJ Qh6zrkc^MX_H KVZ J _˜{Eo dey]Q*9ck9߲:(|tLkTVk( >.y^AbbݗLFa B<Z)eI&-6o$.qx x΅^`$ی塏3նԋi_:;X`Zַd-6 R* R;ȱzw\{פ@t7j󹉯 ,.u&sElւ}JwN;ET4J8)_A*xyE, MrqɥLI4Le JQB*=,pOg"g(ׯt?#a{ܚ; 6acbx@\1zya[_Mԙ g@EЕLoBڟ%gp;3sb_`;WNK?AuNi|@=Qy㎪R;xvȘ?GX`_] ÝPz0 m'``[Ȅjn#[f'twlK{`[޽`܏_0Tz[$420(aEB!H Oe7ȿYY3*{"@"l\GP$RI"tWEqWHkZX1tөIh}aRs3-8Gպ =) P޳$i9\ !bH.b@-B{k[7E2sj.V1- =/-yP I@(gzN`d$y`+ݢحpJ]~RKf20huq/ZK+P:4 a^`q.#{]7T},2[aR_X,hxdRVVjx H.uxc< o6O~%doaEw^uZ)~d%:Hŷ$`L hM8-~ԸJ^I:k4zs~BS-bug,||BsyOg;%^g':kH(Tyew\U9n015ܻEN mJٻzt\.nj~qК/oiak#1QRF+~ 2tаAuayD/C"ŚԥTcN!GD˹@[J-rWDGȤ)6a8N֦0s Cnaw$.CN0Q}].b"TY[]~j x~m|>kq' DҢǭ^"]ezD (+HZ׹.$"= Cw?Y>FrTmؑ=[H>{+ZnhX汀<]<1ws%ްX?PϾ"3Fz46mlZx|'G H;Т-Lo{?~Z |B 9p:T6loޠ_.0xPE{#T''h7lh~lBj77p_/IAiXGTX=/tДC`pPk0y V& Wo~y ݓD`:azǏo<@ oؙ=D/_I2̸ u5b 8YDiYCLƈ@#( !W $!aW} ֒( ŭ{X@蠥5fE-e<, ZdFsbe!_ H,;s<:6aHͩG{U9]E#kz}C1X!¢ĻҚpjayćZzq=B`~ Bqiu£]0'K-V`E F⃪wV R!p/ЖN-tk=sME5lq/1N}=+ 8rl@`gZ ހY]I*E u׬QUd>VMg\w*ֹ2HHuZN, ֿEJ(!%/kjVxx\.S6hnYGvR ?u!+\6dr:S^ytzf'8Ϩz2߽q>֡ퟣ_^CwqO?|}l.|+X~֕ u`\Ll5Τ IDAT;js@. T|`h0 mow}w`0hʮmKl $n!Q4M^*g>t:pmXKL{G<mm{D??ަœATc LM,`|Hܓv8kQ+XjjCV$,zTjPL {ga=ւ.rrnE|2::w&дF*;V, [»EX2= H'Z PX5@CKw Wa+< x2~qBym*8HG(.7{g9Umv jy]ɰJf`jCp8Wz[ ERA}%j9zf3ˌURMots/N#da, Su&h l;[w1y8H:"sea+QA΢n2PiY˲,̀l3RhO|l̊f XKy`ߟ TZšžR?9l9U( ]p.3 pm .ٖsJ<={3d[&!N|~Y }s^aCЉ&@x=yW+)C f!t_6ˆvѶݓ:&auX=_댦`4$F UdAezXЈBs脜Ҧ>bnC~vyV|W<nyPSC$O05Xfjd'U0^;w,A]:H7[:Aq]"W! ݩW[!̷. D̳̄!@Ε~ /&@ẁ)3`leւ=bWh@aBebbv̚Tdĺ89vgX^4\YC .AMj3c pNKwEضt '#4$v N Gʂ<ş! 8)m9u'`(1xI֌<5u\6q%Z.[QhM9)a)M4~'3O M%aӉe2鶼E\e/_Ce՜rBHCdBc#+[x&P5K FQHT>wx֪6{^#-~i]^lSϟߠ'zr=Y"ӻj09Qd߽5hjvzH= * r }1yNJ[D6@>Fٓx`T1Z<iILš_=-_M{B &kȫ}8U- IZ8 Yi$fJ014[%b`|Dev,E)aG72> x0:͢Lbںd18sdzQh(*v^Y3w%@\n _5hJ ?"rS6{<3,=mv`~|09&5Ea׎v}uLwO~FW0n AX#xLЀ9 P֞U1\HmV؟a"ù`s54y78ʷ6اAq: xOx*<տuxu|[lşx#2#@ 34 Clw=Zcp$1[ý|d dXjXhpwp3 RSB:m=4< rA/A%wUit$LttƜhIK~$bo5"[L)A ]](f%P*Pi->˵SaJ*&IR`MJBMk۲9O2X RMJHZEZpd6Du>9wx3i`je5<ܪ` Xni$ιBzgIῬkЬd/&ED‹uvo- M3”$11ώ6\cݯ2OIk_x+"ƙJ D`;Hq?_R.>1`T_0?zatO:v\_~wE0BZI~2L\Aڕ5N@29 k7oW ?{C^ob}@z5AcQu  ۟'``s'(G8W~N'7*`94\ϴHYU7Um"\Jk!6 Yb⏕OI813V$cYTr\1-ɕ" fy 1&Vٍpa5Ǩt2^#b)tD@hbKD(KkL0S9 YF RȵKZ`dtP-[)!ɇ8Zi9|(Px>.~U=I,\jZ_LŠflBu$'+\Ş5,\P932B )1HP.2yd]4R׌Dr?D*+]pAԦe.UaJ4% Ia?) |֙ v20r }`IZBgBJIn^LH:{߳DN,]!#i]KJIy@gxZy* 1ƇOS\_ {l*>]|JM5@g'OmxxeCv>x2lD'ɻ_?, 8^ڦaq?0aS=8<@z@k 2^HRu`O1G*,Uh tgV4lc)u~BA~-W,Ӱ2eʎ2Yff%vs,YC][Hg*܂6o=ktR#"WbM}Ű,Q GAh:'$}<>E疥pӑZZ&-E֧҆bF_w(5d= ^@`{'_QIi 2DQDbx)D&}Қm* ꊆftc9fY!V=p}E{8q~\S3} ܵ`>=N'Zh xˆj qTd3ٶfV%`YigA>Ȳ7 V᪔ ,&WH1NvQ\0 7oDXa_|9[GxteSe];upjۻ2$ګA6I@P @ ՝ mqǩ.ӫccXJXnDOH^^f nZ0B;B,Pr)Qg$b [8q&K\r0YJԁK$pz"h5l-qfT0ΠxoAfe /bH˂HVRacZ[X8P,OM3.Z|}ƌf2]ʬƪ˼!ݹ bί?igY7=792!>N(&q34[:Ƨh^7~y&~ޞaӭzл?;Fyr%ܪR6%7ܢmo^7EQys tD*"XN ^yHC$PMȳCh #~} phI`4~GNp>5o=?,dUq԰F"x_U|C# v[98KkK0Pu]WವH^N^UXi آ&DX2E !Lej^M@~P cX{tKXk xsE9Pn[d2 RoabT&\aM mG֘&0:")cB9ɼ]V ;כ aXZJdNa#Ll<]aNe 桙=HiuEy(&=Yz~\_ Bxvj-%uh+ ;@"L!!%d$V0X˴Rky+=s[ Shյ6QsrmhvE'X ֘5w'JP(䠖u%~Pq ׳' K\|Dʊ/zfB-q.I5WouKGEW `'tf@mXےӛDE<+p]60LW? S@x rDxeNͤE6,0u"$Kr+߈̬!z Џ׋$3LLF.ÏfTwWWUfFĽpjmʆa3ՙ8*+1_> P}k5fD6NY86 /~kEM#w1?/жIuav2e,ۑ ?jav~o^?ܮtأ^W56W+6=&D@!5)թDuK(Uz>jBL^A.1{C$ Gei^$SQPhI%l $lA cDPY-ܥ9vHrBYxiUb.^I,.]a1cͺ*@Mτ"xqoQ/SY -5`;ELg&'k Xi$f}B]q *x*{2Ha + soEZ;+fn'|w°e/U^IQ=(b 8!K+LD1t@L>f{rJ7;3;ߠ袨%A@Vsƒ`@'g{SV n=Q98#KW҆Pީ4&tgTiYtxh>(f87gB ǫ4C3ZTt Zo~&(GÇs@%(b|Nų9ha/~&3L_S#,Xc@W3tonc>}zfG m?%;"A{44GP Ý\슐)VּH 3Oִ\T5ve9"lWx׾DOx|^rgX_"4 IDAT>LX0An>c1g9[ŲG3B+a,XME ?$^ـ;\4&1>EXwB-'V_E)yhtj_ Pb * h{GJ}N=}hoNhr|?_=<(mMz#]w "|?A4>kF~gO]G&־=Ņrs^*k;[7ȶA"+x CNg;b;atP m(pB=mopm߳ț3w}yoQUáx CE m&9 N Έ5#4=-`Z@фgަܬL.i8Q]w೥ﵗ `e#S8V gPS9o(Jz.M$:DL0;;0S7e!nO㖺VM"cZX`L!1<ڣ|DR ¶7xvzLz`")ôxRbu^ Կ2iTB.|s6/'oϕKoOc}miUeq͋DqQ*31G]G$a}sM֫X;*I,H<@H~!ͥ7ԝ#OhoOj9>}[;p|z=]Ǡ>3D(̿7)2T!Qտo~xS-ā=?C76?p~ !TR# %Zn;ga]'vױ?~)$s/\0.G)_v' !Z_l{Q]oT0h_K0wq=G`&楰$E˽8s7CH* %<6yx5"EDwn<I rNVuz0LoHx@,ɢ0ect@M_WYF*n!%Qz{l9/6 άTGI\KK\^i |swjda`fpH"E,,=՟4/|*|s3@ !*hЭql x;ãt푅q;AޤB#A>hu P?:1ktjLNC:@RnBя1X;Zo\kNk $x>-dt Ʀ {rcMP7ÇR,|Q^EjOI.C#NrT,5~_9j-e>yX; qQzL[dlv$ab,+aZeB=b[P-Tzwy\Ԛ;?n G% ?݈ znx|flkB7zۏXaYmm#gJP~HŎCC x{+P|QW% <9WI }78ow;}:OF"C<@Nt?4pd)qaՅ.&xw<{xI. C$ 2׹/@%26o=° _}zNp89yR)&ʴwLp7A r)^UHñl~p6c:gl1T헤7ta  -(ArgOCæ[?EL,<-Y :&Ъ0yس8d 4Sj&0pku /9þ!Q45 gFf JLdkf??P" IQd-*y8_ [SkOW+{ֆK!"}$d[( ;!q13034.HLw$>1/#@ 9/4dٝ[3( io8nWdAd'#jU|-E%E:+&OL 2b73fe̾ok G#İ;Lo1>}{+C4ӻ// v'?|G~lZ>z3 ~0n2~ iryɘ VȒaG5Zh G>.@϶y=Dy} xx'u*ǜm;d8:{`]!O;z@@m EQmgm:Wu./W4T3aCRʆDټ _3X/(u.-CͼGacGfTJYnD$RL5/x~0r)gihJΟ^:dI9ߵ&k b(-eC-2! )\hZ{٨D=9fjfȖt 4(% Bq ԬTYY+~yNca.j~'dV1h~[j7G$=p3&xDvֺ;G5>~>ۉ1qdJ$pq }.;d %UAQϺ>x6߄o1EQPȽj-=mU8T:$ DBǤ3CՏV,j;ոtCl N63C ,eKLk`Mڠ!d7mOq 9Ia&6)}^3e=rEy~6;ж0 A`TqvDB"4L{ dsp3Ixj?G!3_P"X<'vj!dN;a<kBg7@x~]? C{@;n\x{| ?7؇G?|Ds+[{}5,AXLl&1g>@ Gq02Mbт1 8>r=3FZEB4>F~|FC _vß7h"8o ?||ƇWV쨐??ԫj7 7*% +5 bЀJ R UF5I3KhWNB(ehvzqbzyֲX9,-I{r-&> 5[ Ws*RT23ócvg *U:ۅE(7q2\n=*|O[6q!{ݶ8|U,7ǙaXgI Ua&f>B-@Xz1 442(s Ns وlLq̳y;8 -ˆ}`L}-C6 X:8-[b*3[@H&I˕FA̒e.ox$Y&֕pZcH뼔~ujC/;3iXoZ@hȵBhS.U%Or5v+n ,y̲8uF/OFΚM!}[ jc<;=w _̸dWY,d t!d'eGՖ4-.FFGz@|{&I:<ܓ=ss Sx1Q~NWb0_ox  ׁag5_9'v/-Χ|-hˎ+Az3^g佲y9a^)DHH3`Me"I01)DZAΪ7̑%vr CDTQ A~)^@һ8\u,lK}]k"+Na.N\Xz e]Jy! s"aQ|9 }*j O:ALO$xn<2`;Mm!KG'*F$#܈I%äR"o~ p2_+엧46YNg p籯}bN^Cs_Xgo9o9/[s!}s̳PQ $UKdTBZn/ 'j8`ӶA>OS*]ׅ8>I}m+%OZRjZaD֩4,{G$)7c/S%bu(Amq]J4|p)oG /^N/<-[&See3t j`3 /;< FZﵮ /oߓ00q@G]~.'؀W |1q?A"7ݪ3CX@ r>|VCAƦ3 2a1ANVZE 7,ZqnTcFIo@B~_XPj)=:˜er ^-NK||xrSPuc=so>o+K/-D=vw_3/:Կk>?M#]k SOGdJ'RCc%bN Y'Ϻ/{fiXm#=jXשВf+ $>pZ2s1HQ^Hxj瓋BвxK!Y%{\W3ps=eb(x /_2Λz|&slP3 h.^S>zi6vTo֐lbK !җy#M|J*VfG(:hр n*rvTǏۀ`'>ǧi4htO8Xttлcѷ" d^T IDAT4%}'ٰG&O:rEprV^ Ɋz޷ƹR ? M"jٸI4"{=چ?w/*G5I>#m`e/wǏ͹Z|8z?{<>(h]G`iD1E˔(NEUdm_ hTȬa0,C6@UޝO&@M xN[),dlZ@974(rsUI1UpDw)'ϔJ{MHJ{ r  NWŢTEEVSq9qLì2e1׎ zlN 9Okl}3=}gVbny`9~cDʊɐ&a8EƯ^{,<,݁qO@cr8XWE_c=*`HG;R@S>BKT|&J~ɓA0[Ep:Ac8D43X%<e3J>bQs)|VZF H$M@j#Q&7HH3\Ed{P,thøX. ;n6O}CuM=uGnEW`Of j@Ta9T o}(Ν;;0@ ïK2;PQQr P h ~0=LZ ȯeZrE^ָ,7s(¤'(ʺ p:y}ڔMJ۾܁.Rg7xR D?cro1nV8Y6IY3e2_"K7Z6oTb܉R7L(ֳKyS-d֬@,XOAZ̊8؇V!U,pG :&1(g63g|G*ٔw,~,IRJۼ؈\zو t r@6@zVT)2 RcHp l-KB@.]A/c`vH.OݟF'~UZCΒsR^;4[%F[0`,#S!t '=z(DD$e}. S 1,%D pB YF:7soMT?Njy^jhToqE3͹de]ˠ'nqTe t\ 3=s2B%`à'7jcla k_7? H aG"Rsc=78f2`HW]9;0"dnT0z= 4 yzJj^\+x\8; A5 / H*ypi@(ûG5'ˁ9 ]ϣ % Ǖ~S =j FËmXy$>}ӧ|v-{܎ ~axϗ$1{n>lOw[<[-^"s1slQ̃[5@XQƊ b M!Ϙ@6R.$ JBp_l*a:`As^_goGjUĦڈ6|ED<頵21x 6DU  >K%K` FPf9Rp5N$2xPHk0:T[6 S~XNd6=y"q̐ugGwoab~3'8/&`og,ڨ Gy] 4Gk A;gKS3H8nq;p},y>l HE*?.F(_f"E"MgP@>[J#JȂc C\0_RZV"s}kwy |pKM}i&Д!L:\gzm3W%r G0~uM {9(39w9L#Or7?jq\~`e 95Z51,\73OVc!)*)curVH-L˗:ec@j-EIS`q}63p̙ 0H̷߷t ;abЭC u"a+"[U]?#2z}l*x9Atufk\G@_~q8 7DװT^(q R!/$A+b/x&>HuXDyEAbIx.0 6DŽ1) XKzT7*A_[v) k-'S(# JY]4=!X!zEn$N$h@H 㸆 GË3AcB c !b Z6g0ә^pPNA߬=k-֡0Ǵ|[Udyxn!e͌_QPrg8 gfŨm:uA b/jq OYTq^1C =J܍ZĹJH/'@*ܓvK$T0|$a(LZUb{ݜ=>C[/POkn7 'U; lX=~IA˕k c &ԃ,qf_}1h2c> 7u(iХT BPt1b$'6:Z@iJJ[9: 饍$Ma3qC;cƿ?ה+P@vn,OkU:$-(1BG6EJZK>0,'37_c<߯E@sQ4JxpЛ[1;7> =A.eaewG؏oXq{53p,gT6X;e"?^ś3p~`7^$tGtg,rk V>fe[U"K (dv2Gk9ƪb6@^QE*.OLAዤdnjz U([/ˮlz3q+PBs$p.vq 3&,j;%1k$\޹jGcֈC dZk4MK`] P8YBQxY}E^ KI/`B T"?n%waDؗg8dj\E(}ьsů{2= ( ":ˏsO~zU'#X;5$W*Ďq{j==@"ˬ>?j xmw,'(`0K aYr `8G[3@F qyKdu,jqP`=my &|ctS=;`Q鍕$H?y$HUhmۀ meQ湇EVaϛgXY;W =xEzz_@^y1?] vE>rW"7'^VpEOwN<~`{s{ u`؏>7Ó9f7<_@߼OwC 5'`.•?qOwǿˁ[/'"=aU3_Q?p+Bφ)-%p!*SqÂޟHju#T<U&:?-8Ign"q-jQ%a٤<{R/@0kghW[)i1Y$C$Em.$<;PdK9f8 (HQ}ðQ^9'c-M` ^>i~c1ETat|?wg} .0a^e~,/p |?N~\>~x!!=<-,_,rq+Ϟ3.qyMKL@cHxd S#xoyP~8V\Ln2= (>U̧LKNd&h!9Yќ'xpafh ] ,lpJ˱):&0{\+jsfR8KN^}ub9,nk49cZSZ( Me3%e}=!WKЧ ? [t:%y= 1z:O;XmwX iTBCAR%58#h0.? ZYf7zr#BJ΅.|%D+y6]Jbź5s6"A (lmXXB*/EKOd"yq(PJ-+VERU> 93$-%9e(,5GZv!d13-#>1ѫ^"q XVo!+֚b,m`-8GlMX>k>Cޗr4xa (0;9n;773넿,.T.V {<$JPG-!spYY BȂ?~ZvQ`3lLa:{U.LC#FH20p@L~Ϋ'?i:};ApCe|ue qN-m~0ms$ YC$@Ub.EH]`BKd)^t(0A8` 6I/(9qy Gʨ}k (aS{FiHF[ʄ7֫s&òQֵCOߕ8ɥ]!)-"ixxE~="k43Ii,Hm'z#TڙF1G>H۫}||8 {؆(Q?2ʑ`0'4z_AHehJB#AE-BXSH{2! ^΢P*A׎gG:Lư{gɨ !h.hK z/c5e@N ) b{C#?_vcҹT GH2?,"狡;B"G"7d}<`?#1jsxlD,pͰ]WP3lڣW$)h#F h[0 L/N&h:?TƱ3ԐH,c $fh}f-&-A%PˉΟ2XRZjKN 7٘YpmcwYO;٢-6@o8I}Bb,O~y6`G@!xs=PEaǎi&5m^" Hl)By-Ǎ=)%5 ԙ%h*ߕu+Nw'MZdj`/m=YQre\PAvK!H ^%H %re! *Č0\Lu;',4>F;X:px k5˯54:`a~s)6r`jIa #l9p kԜ/<w8/LI@5`+KpҴwRHbXZBc\; '}Ə uKLe D~;5]'Y0TÂro/l:fֳeM#"Wл7̸aaXA0}yMB0c_##2eǜ `Kd, ?>>'z$\!zFGl&d#>!$`P/lǿ5Z:b={iTϱH@0܆rsiY'_Po`^ -'03bk%͢Hh206wg( f+Vj2n+k6nUR& ̼ۭe<K#ǒKs! @D;vxX!P26C#X4;ac`P5Z17]i͢YCqx8;g%uPt Vә|n𼊴IOmwo(da@;GrRv&0$ F`&G(ޟ`em BV)kZ%&`PxOI`F{NBnf 3vT_M@-ϼ_"ɽ h1c!f8ÿl~h0>}3AoBqg6kI v  Ϯ=nx= CYAdz? HBazֶ9c}Cn:liԊ33 PϺNg!~&?Cv'{yJ%(%|Avh0xs1}OpUh2Bp~Yf^/`XyzJPԩ˘lML>p?)^*Ĺ7PʗBڣ! "]->Kw/I]Zu26"ӣ8r =m* .B5=(OkvB+J%29qҤuáh)Ü镝żtz]J)/* 0-$"yJ1£R)J8T^ @sBiqtn0vC ض=9ACC(EGӏ2p^^m}zK:s!EZ\*%F ] /;7?,>eCRN!ꃎ!'p1/0oy!{g.˨G~{n6~Cʋ]yl0xWOQC<"њ9QXZ=~`V$r}?@w#|0Xl:\Q}zA $Q6@{x?ץQ^=",G!!\ϊW;n:֡h2?<:Ȝ<73l biZx_o E6OJ!0jy"_PrAļ5RD|]/%ȱս!✓e<Ko@BbO^)3#!qA-Wo0w2J/0zJH;VD*!.еN"[K$"VfBz;9t ppF Sm"F z~}\Cۈt> \ eTf\/=yP b&:IGP>O>xJO w3`qIniW@8dr\`L%/7P3$K BF#!>;JԌ7t~GfU 2|V`KVCG )JyT Q"V|{ >n'D؎dkFRRҠG\D$%}{O< edz p]~@p. Ia%x ^'?lI7~]?@Ow,JY\i{xeK'ؼrWdaLȅU˄+|Pq`>d^TIz?]x<-#7+ 1:[nE`&G/'HRT% İuL~ suQkd15M*Œ2n{aal%ha! . $ yў B!.* kku(0<79~,D +, g*4Ŕa!n$ 嵲ju&"Skm w9'' }NV^A#A`̙v(ۥ芥>WALs$Ut#' HhY^ł[yZ"{{' z}¹v;pw<49jȮ&TTnz>wzsaD4P9EI!$Kpo _Ao&vh'_ I! ?B3K>Lbq&[3@ (5Ke&MMַr ,6G$rwD kII n]5&>3D1r;i)Y!jB6n ,*3NhoĘܗ2XQW Iŧ/@`hT=Bo9'\C((sHcɑRaCS{u+*a_Dڋ4qk>{?FprUgKGLϜFu+/tEyk3~ViɄ?WG6XWdzyH+4f2`qIl9SuC( (D9'ϒU"Ӫ:"<Lo*gtB.R$ g0o-sT %? kBYXK޻uyX?UىL&۫*Ɯ3hYvn)9N^@r5!(lMӗܖu1'Ch a_Ǵh\_(ac7 4` iN6Ep!&"U]N!˲#oU˪EgGd )#%9r8PһMIpJ;!iuBKP1 r`"3+ k&Ϩt@\nc~w<=cKDe>iw`AD5,}g;=[<>g)$hJE#JCTda_x:#[Z)KnyG I;\[>w{:eLp <%9Ҹȳ A<$i He2s}W|{ǝ?pW/yқViaf)AX t3RdאIh*Do@N=; NX֦JYc_*>l gIuA&ws vġ*)h[6ؘG=@2,T2+i5Q,[nf_AբrjQ5)"`欤ҋX҄-'/b>TTrm S Ks@wظ^ B& 7s%E z~:uL@ ACDH9s>/q9at9U[c_kxy5WZ_s2hBbqjgB` \= doJ<&y+}N#G E"iP]Yk=42;Ü?^)ث{s}R&fG,> vK@8Y(W~Xiv)iz^3{[0 SzeE"2ǀx(8ƒ?u_z= 3(*@BkANgԪRy=TsHJ %3ŧ4T sޠW7x/}]>;]qyf)a hC![эk2k zg]́(_& DT;t6ΰÕh "42a^bq7F;;!BDS~HO-g4c Z(fLzg+.-LcO;$H?Re<<" 1r^y>^HްLϐnJٌq sRwR"Q9.s Uh}eMX0=3d>ݑϞ`;jY \s j$HH3zP+K`4ƞ1yM& S4cq0 Z+˥ξALrbVB2W*+53d[@B:|V2[=xWfd1g*CƠ$Qc 6nTLeIhv+ϋ{O{W+&$q3V?ϰ8z57QnJ|4줔GPuDXEQ֍h?Q,4V!Dk0zt9rFr8^s7J_ h=So/,~xꇽfFslN0eJ _z񊾝8q#y/7C> ~>;yKr/cJ`_Dx:po{֛Y77ڕ)2;EDr,;[HDQPM->ΙǿD! ]q7.;l1i d xYP.e=}Tdl" l %\3Z5;W Q}=!Xر7Vk%KSϡr+ W_A=ak^-E1%H7SS4 lb{"F0S!J\y{|~f~j#@x/7PXc ] _P:%1ǘ-(dW {dTpvz U|vg==ց-Fr,e<~ȥ>߹|: 6>\ayvz w2x|Pa_dcajMےa%7:,#,&Ek6vϫi4/$#P X7Jrqkzȇcs/K8Y ɳ ͎״0b,^qTܔuĀ`̴"PVbgyG[o&)WJ <6-Uа C ? "a D=y+]@VT ix ӳLNso_vbh9's|r\4OFalزJmֹ~l/yCv=Yw/n-8Ѷ{= 4،o-#ُswʪq=zY8/IDfbaQ5VX1 .c],:n pvhpA\o=_IfB*,zyF 8T/ܵAVg.oF%<ov@mEk!a 2*k\y@yR3eڌ5F^)4{3.Y h``x&c?uNpC,=>o${>B"ˮ%YNl!28Bw򉜋Q Oؿ]^.2i_7Op7QbaX8+iHvO9Oh\fAG +U]A 9V%' `>'ӰX,TEh 0 }Z(Яv IDAT`dxMM |@>y0D(P|‡GP'8/Sk+`ؓ~+)ZDā+ Kyɦ~)/\@˴*/02!.Ƒ-`G0?$]cN뉛̹f $H[n k uVFեr} ! Qӥ3Bn};e0Ǭ3^6uqöФϞ`#v8u = gH݀ɵD45,|G^ WFFE/_`nR洢rN~%u²nBnHr@uے'ύ>sÄu;r׶" !rp&zk#XsZ(fb3.aИAVdzĹe7@CNil,kz%Gk*6n Ql7WOW`7SHZ3 Gzν,_:nϊ[kJhC{N\<}#aϰ}g4̋feF"C5'dN.*#$ X0Ss|~ƭ\Q ?~br~ 8s7'O*=<r|  +Ŷ?x ?mAnLb bc,X+ByH0 !I3qS^N]z阪 -$Yv})ޭdux`NqQ0ͪc6 _$ʎݵO`! ˞SQ DH^;s\=w@aw(CVe9kL*ٔs <W@&ދ*CGz\IJ+$e`3,xĐ)7Vz0 $|l[aȩa"$Wz,"<(@DX{%"2-`B !i}"w ,[Z݆ٳBaBqH +W؟ Ze!)? T!`#ÀͩH<Tb8ur"GE '`FG(;ޑ^x[0KsIYӃW#3|E`R3CI!X(d 4sʼ?VXEɗ`j2#|mI:ua ciTgJ.R v\7/^0+*`W~;O\!T0,c8(|H{{O=RSZ OߐƱ; 3^l+_ y* ABQ`#?IyS ͡Õvm0"ZY6`r^jHF/9F6 3 O p瞱yAK s`7.N:@}ϪTtyPTQq%B tl VBA U3΂"S[Dͣ" P$?*f5[0AHbȱcl3Hf3z2[%(MR> ifsmz␌QJG03OU3 1$P&5xA/` 2{e ܶGD<=se?3ǫڠtmwJ-a(Uݓ Zp̕KTv m1at7f\7wNhQ!o-uWi^ cM] Z7 .9PNZYyrh;oaIEGXH4>epQ g- B .p嘥< *ސܼ3rPY?|Nn{+17 4_J\z`rA: 瑇YG+hϮ#X)nOz,;KoW>3hRϫ_ǧ` X羑@;Yz$L o{)x5OY)|"SŜ7dn'폰sp5|Fr<%v?_?[!vmfP{FΞϡ'52cwu4qM;NcΦ ;IrvTOa`{ kؼ`Sw7 r`h^ǐ8oCmC.6W?eXbð +O#gډiP,pO1]h>Qig5K`ku=G BK/Qfy8d$TɅ T$$D[1 pYJ 0hCEѡX,AAt9 }"~9 ڎ \zg޹lWJIeק綳rQW,Rk`%x:p,!3|iїM/1\E 64Wp79K +>6'K!ȡB9̫Ю&QU{ή+xqR.ӼϐFG+l}w#c>OrF`4Bܥȹ% =7]I<6Xyëlu3[5p®W;{y+g764m1![<]hYmMu0NOilXݧY/C,yz*5qվ:Tr XL( i[{4_QzsP/ Ȣ ȅLo$Adw`':9 ~5Yϙgq<[dk}H~=@t|Eu\2 :o;w~PQ)=d$a~ T;]w` ހh T! d4CBv y۷==/_CS!l.L|د:"eRqיNB=c 8ZYe'@죋)1& 2c)v>:0(G˰CC6&ەI(,њϾ6D5BZ- d" "Re kV ֒88=w(/tKw(@O0'/JUCX4& r9@`OQIl8E9 Bsrϧg@g$z{hIs32 t6tZrnM6DŖ Ef3ݟHXzIm+{L+ۆk8 vz H>% Uyn/d/9vaU3tG~cx|Oqp}15} /u7]Cn;M @9{DѾ#LZyLm,I3恡';_BM ;v;l>=.o1/ G0wzAEa<d)E¶Vը>7Ȣ'ٙ)lFķ%, hA&#K>N8E&o!_AТBN oIL A7Rfݢp Q`̭ϙ-A6-nzEP|7A³`Wb>T1s8޼DyJEz*0$*O~Dr@A* 1bSWBEDXQ'[3()ǕJϐ~C0>P)8Y{'=1cXx T|-aHkV扪!őqe0Ǝ}BO53̣jsxM9vsؼB=mDxfl2AП`({*HXՐܻyWOжO`{"m9&Xx X=%-FYƔw)wYlt~cƇbJO@&8KFj qx,&!QiP]tCNmg޽SV\α#~ghļ<'o w耂F?:`cJs@;'b-qQ|?h57ҩxZCC "O7aOᧉ^߷ؾ< K=5nP^0!b L3~Nbڄ`>1} 0Re}h>N8|L_ş[o'W=>bvu]RC0PϹcߜzDuH^rBp*c=lXy|u< ٴw*ۜyx̳-WQU jA` d~9'=yW<}EGoJMcdh5yaQŦTTf@gNJ1ϮqaM+Sv]ag9u8&B)iWBKE?( M|> :&+f9fxpz$ȉ9ȷ/8MfIQ-Dws6)RRx{yv ǯi:adSOo YCo=|Q9HBSxgLR=dd4Ay<w@ rc{XcO(UmhKP.jdi%j,Ǜc 4$<(3zXhTTVx@`Ӹg`9qIPmrc>Jy%'܍GynX ~FO^ [rOs/7vL(cvȹ{и`2 tOK|SiӗO_EK`W4i4M>t cө'EٳbSQb0ap߰O GKs*3z7{΄JG~ß vwv0_݀ trDB@z;tÐ9x׆ū"_tlX7ýMߌT4HcɥVg7 e m3fE4mpT ,ЕH)7` V *nF">M@I{0LV+CKz9 wvcXE h)uKoS.sAY˘7cNov9z` `N0r#,wHqơG23ĕ- 'p_8A}-{u[$)ղ|(߉/ C,^KhKxI[4TTc/#[+^~B_\i8sKĺ&&JGINA^xHQBon  ]JfaV(@x%uJGhK@\)uïbiFaF+=B.$H6Dgzzv !y/Eϰa`_0Nmg/W Sp~#(ۣ1ah %ǝ l#咎8 W:d;dw`J\d5laiAnܓ ԢX -W!fPhz9shE35ѭK`6A myhzS~V rq8WH}meB¹k0- A X:9WGڤJwYFz\]c J3gM!J:< \;R&B0V7oa_} ro{{HίFnwEM*>yB0ƶo3l@;bǯa߽e!s~19pexT<m7 hb> Eb zc4C V3lg)#D3an qX p^Dm` B9#wWg1 :HIv`_uD辔qEal{f`P漸di&+Ń=AeIRxn  Eh䔌Hc+;;-xK IDAT 9$~#~bS6Z*ֹ[rLYR(4ZPdWhy0}3՝:0CmǖHu=P7=!hؔc)86^كEҋ̿B!("u@@) :=.`Ymf$|7~:̱J.! yst);&s +I\rC IjyjU q*mN >IRve Fv1Ѷ\c8lf5ȃRM K!nd< V$wqO"= g&-! pr*qصYh(ģ yΉ_¿nzAGwO=>R=v)F{E"E[tALO/~ɗ?|W?wI{w0ZA`)BiS`{aMF3Z:`>`YY `lqYOn[2`D \z&  8[FF4HprϒoFY枇LJ]kuL8Fr!ۣM^WJ|AI'<>D/I¬p[T,Ga u BTz"70h3@3-r #yيg\:ZK8'L:/esp3%́ޭd >"4)11AZΜ9|Ȗ}ñOC":CpRdbs Ƕk&N>d }(vxSja|_d8"u*LO>ފÜOBms;s(=@x lFOyP{7w`Υ>r+zI${6VzH}xXyu)%Glisyjum |4.-svB?5Fbn#D1d 2w-‹:/X^l&@T?Qqy6ۙUʹ!*=Um|! ‡܀\gU`2{}؃HKp.w?r*OV{Oz׭TAUVhB10Mk5:QaY}"PNpSk,X2 mUA.rwn&yy 9vOE;Ig&o}ۄz {*"(=@3_Sp?} ݩ2z3Nʅ Wf7x@ˮRiOmsǘ; ;A'ד E9,duj̈́-W14gm1d!r^w G)gC>k0Ku B8r dv7 o^}A`j{)JHu~Zb1)r.B&,}udNRc D܁ mvl/ozaLP`To7̣g':w`ddOt4& % `Jik$5Ej)X̕7N~|l1_4&r9С/qs%{C&=f٪!/}z|Pf z*_!隣8EAC!l#"* d_N8%ou/_#Uǟs)oYtnۀow?| Mۻzx|yxb|om$DC. Op`K5~co oڽD Žd6 .۠f4 BcttApL "d ejC>Ō dQhKT{JKGogDQS|To),`̀W)b"/~},Ibtr_|T 0[ )ޒ=/"#o<*g<3^%72$*fO8&q, A%Ը"@]yy<}RG/ýp@ozVh/YK9±xuӋmc4S*fg̳gVqJ5 e"iy\x -p>^~9_+`ycXsW Ano}hڙvӡN;:ןs:ncv{ȉ8Ek&v #qkgʠ;FX aȼؤG#p.! 0(D-FߵgK sr<!G&d.ag5874gZ1m0ц2Q97&|s`em|7G+"IR՞7$*NG|e(z iq1E BzwǭQ (h)7yca$qe+2?kqⴱxz̊CP9Ee<:@ZU6F̉@e>cd={]ECKǜrDaLR$8NP@;^a*hqe%$xy]9\0b -xTY!޿@/o;"1`q9,N%A$%˥%϶ޔpNI0է#x.ph_|7o`۟%{ S\E>}#> ߹/2Ȃ!gnQ3w6 \MX>myٵd p60lCg7t'UWZyVV 0h ܧJW!s.oFLA`Y#T@qgT@;c]Xi|ʂ$Ȝ_q皸(uDҥh.a]x+NYWw9ί^5BFTO-{0Iwa-Pql)s2 q &I>@c1V" L)Ra71aܳC3&N`BbyGBg8.x=QAVXS+b 2(j*G"FTk>WȂ&qTQ_t!ӓ(Hx.[I/4VAVxѹ̮5n 6usB#7L#;A|J_~ ΃NӆRD?9f]8kG8Wr0JN-_9 2t_A{ V%%(yd$G}f[$ @BGsF2Mk\*@ȰpS]޸~$`K3Ĉfsk@53z6(X>Ώ\=R:f eU >5Y@#D DU !eFœ9Iy(H~USm🾁;{w#셢P=0渠eopX0O>|@\ ;^a Ę `Ǩ "r`wyAۜ y8vHT d{KqDLo1dS:Nsh܃"{7@7l@ 0{Pcw']Ux+ݒP8T:L$CA720ؘ?${nsZ,D]߂Ppxjց//!^|.*U|Pz $9]̃␥&!RtdRH=U,vSHsJ(˕EsbnELMGAe! =!KBk;vEIo ԦTBnLtHo=0˹5kEkm4yx.4hNǔpX3/>WVB9J(lɒ9wPٔGp?m;JXݪFDPY{mGò/5>mH P-hO}%*R kQ[hٖ60X@C0K93."ܝx;fNwSqٟ * e~VzFsT%VVծ.DaQI 1Ze!<1"gwyqJEPyCc]jmWkYIAϾ5y--ǞRz:r!(²¼Ո_@_ZXU-W\cgZGF\-LTTj#orO-\,4YsyCKJG* K(fwP@(|Baa B2{N)IƳΣ[@Z(ΉJ gcrR h㑇B(7g*u)f~㬆G%f$9IM;wZ8/7+%4Kyj{hHjzn2:0%e:~Ki3ۭͯ`/O~`+;+` Ͽ [ۢ{s(4g_=~w?ZAxY3s9aQ7q;B&@q̠% vD.] YW짊oxm( v<Â(s1moؘH3[x{Շ tNuC=n=zRdSGP 2{Is#xŀc`8cb7h[7&A2yt6{R/[Nb/[np3$"% 0 Иa-AP-,l1ȍg2r͟U"p; 3o$ pS Q纷*浜R,#W6Iv07-MϠDo2pn#b ' x,hCgA5q:^aپ# s^M!hcPK I|O(z~˷*!~$z$Ugpp?`~^6rfp`IJ__8 K8azVqLY,J1vTX:2B# MP!e\wz#J[`#+,t8)Y-~2 Ex6hݣMG0ѲR/.fu@4 [wKp`%A3 nJ&Y WYhYiD` ے] |bMzCުMdUkoӈ[5m)8yQd( U\$p7dݎ '=];銻7q վzo\T@c 8$4Tb,.y<+0lݎ~YÆrNG.CT`evŶ(Vp8(5;sG:ZA|'FmLڏ%Y<ИCa۶x(3fuʀe_䋵ÊBxFS8E_kJܾ*jq;0?@>XiF%a%Gb|EZ;־SqL*=*6H3"ߍQO.cVC$ļfKjJ׵哶>ggѶ n""4YN{ó܂f/ENr71iϸ ?9/_amGy>\7l^#u6"ûo/\l7qezAh`Y--?7r1ö2Cs`r_b{}vCvTvj>ӻg<~8c([A=U.)pt\;Xu, Y'JŹ{qaIj{ZdatHQf{B?_`ht2L)@a~5 ?1PwS|raz+y")a Km4S{9QF. E}l;^z8fӳ*" ;-f`)(vVZF9Wùœג@RpP(8D/3U(ؒV-uUj!(YqIauV*qPbR /T\X<`B sGѾ?e-deKo7-AdCݴ5 Z安&0\MUiLܭx|}+Nup簧 {TzӃ=E <~weO9:O9R\*(gM, SAy8R\\a=zmZJirSÇ~vixz ڥXΣ͜,>u\|uqΛ J3f:6XqdW"< Hi7 z-e`4yf^C#T]0|KH}&;%,2 v1{}ew}TID>hyPPBPp+ AT{ 7I1,l(~Qf*@RqqU2‚ Jy+'o"!ZRU1>iJ4 ٚIڹP鱲i0L~q=iU"17SO0۬Բ3y2 HTC@X6U+=Dv 83[[, 5#: ؜G9i J/@߀Gq/L.rtSYQ9'bf}TX~^Mɇ Sq>d#Ɖ ޜhYDR֧oO8DSyͭbZ"D}wXq)2Y|1 OT&%@ ۹`?aw:0G2"Nn^Qǧ ܁sCkG(N5qA_gp;lm8N IZW4TX>8 C4tBG/#B)I$:RAtp;2s!uS(N^޺Ϣ4׿=oic!AL/礕1f*eI]KlV ğg}F^c mG49y$Ġu8%!޽jA:+,,0r4l s ij00蚷ܶtwl%q详Yi԰Q_Xj9b*@~~ӻ 2m$`}Y^$,BGZH3PS`ګ*yJcR^1ݠ,^9Wz>v @NLjyQa pWKx'FMV<,LO%),Yb2Q3oK5#@|Ȼ! yyq W:uhE;xr 4%Yfa>{b"Rf|;w(cǜvhTL6k(C6r+y59h_`$5*?obF&[r :Y g/n_$t%8+'4,AhzΌ2.ge?3+wr@G' hn9{ "r##z!r]TctKx*¹Ycu@gkr0o:zJqd,w(V ;/o]Fu4z2^ 莧Ѣ>c*g>:`k<͌:>iDݦSϙ^ZAgL(1 kK_r(C&xW08foZUau | /.*{8/ޠCW [򛕃%ڡ4s)sxfzu!ڮw*DjCFEvRtF9)x]y 2]/ `! 4Ӆ0ºgI1rt^ krgkY֡t\Vyn3.J+"!O֨kx 4(7$gAd0t~ /FQM5Fj GuC^wB^sZ6籺aˋ0:-=hqz(!ԯӗpo@, %/T=Ž'"GptyVv͞ ()RCE<_se^zGP% xΑ9;z?4 ))v/Vwi5GULx + #TԺ=@+%/?sK<a .*qDg`TUU`Sn % |.͐z\ϼO9b\/ɳ!&MgX]xh ޾&ߺ'.ΖOv+b =Lj4Poݣ2WQr𘠁iCE\x :!kCs_Bq{ G78{uRQH 6: {)8w@y4`;`'vh:q}; (3\TC%z+eg[AVehc w0Z?P}p)Sd׺ NѤ4Eg<E=Z>ŤГA0f1xjIHIoW']R>΂'oO@"RJx8O/\e[d䚆;TfU \+oKse͊Qm̔ W @* _6 KQ~sF'4,p %Z5e>G{qA`ΐ g^ŋgG=~>T|<}*DE[V14)VQ73VbG1ϪM {psǾh.׸7w1?lu O'p}-ɬN4/pz'mO+~N(+lR$N''o;YkjslNU䯺;sf*sn@,B o "*1ZP:Fx?JaQ{D--V/ =S_QKQTGeE [X P@i]GD>iC&TH3RS 'P 0DPo6.Utd coQf7CfKB݃;/3it櫎6RcGʦ">oy`jJbJ&ۖ;c4TG:PP D+c\by:+5)ڡJon8+; anh8B4s"J pWP-=)q,̔1 A蜠Aq)`t?S|j8]85DЩŋ=i$(`,x }=vo~3ܿwPxx=__"p0ɋ1T[}+$FNL~`rV高aՇF|/%|}O5Č3;нj(F|Fsw50 KXyn3&"JUK\*#Ѹ:<6 ! :fdK]kj$J9;7tUgPap n$)ly EJ# E?h>ä;Z_[͢h ÓPN7y?!0QN23x^.9lcl}-JT@vb#AI|ptueRb'撝t~!*U3!xͲp{UsנB)PUMj*"4\XHLsGPCKe ,ZvcvlOy*Ƹ,"TPzxUBqG9f?h$kB 16bS&>|0[gYMHq -9tOPᘽ{ *樍T\r%ocaQ2RSV`*)*i-T4 0آؾ-T1Y%r0;8p(zUEl3IGkЩW34S.UjvP $׎k8 cGԧޜA‘]6fKR( $ \HMn@$J66d@:6Bƙve$8|B^Jx6FT]^o?.Q?WUfER6>$c57(tk7O6E/>1 1 X+B2 |EfBK -,*˺󐳕1HZH_i'C$r%ĭ#|Lߑh HXY{muz /[|A_}w,yS|kطkք<6sĪQ @`{PMy1gMDMHÑ: 8أ@&ţ%AoQ7)}*p(m+bF+ǤsxF0o$ugw(>~X8*lI_(@K}Ǐx~zF=i!MF YdTJ_&NZzuRؑFYwv:\(qGmHkGs;7@1Qʎ +?PrȲzPsh=amʭX=:p<vb`+[x|P#`-j|6;3rJ,5 _V}"cB/e^<Ϩ-k " jմ\+.k;j9-O/1r0XٲjSA|x?bOpKZnTX1:" %0gZJ ? V8zmSϑ60zxe;[e_ަ ̂δ&Eza膳ũ'I5O;=,U2̅ @[srrLjD:zW$-HG<)B` ܝOa+Uܮ߁27gO`kO r}/km&/qK$Ko6&OLOB"T*bu"I]I^1Tj1I,X4Jhm(OO^8B7Bk6? &1I㳴,@Y0Z6^4r m}-: o֊vAV1>Lj n`;Bl4b elEP@'eP$7gjx7M~1-$St/݀UK}|a:bk ʼnQ Gۡ6_ }O9/~ ~+Ƹ#5tq= L3 mFH؁za?+zF5\> ZSO9 >aNyU1_N&aDJ&qu'H1G1#/dv`5 8! z+,s%A]{;LeW?*$-nW=S(*?'PaHw|4wCEOA?Ua3x"bnmՒǟ'SGoDˋo@,2% %O r_ k!‚Р%=K#"r;궑iWf,ǘcH> AІ#9sQ B78T^Og2A^Bp͵B zew@^!%rB15N~ ׀ӗbu'c n{7a xd;,Ɖ)/KMO 4aUwlde9/~f  /#qDCv+v`I)W"4AHT*J= ԝԏgim`No+[{;z2n4U 8VWt# B%ٔ\de7mz6\ SPM[}9C>8*'v#Xbm:XK5w= ;<~?qcŮcc= ⱭYvvp<+Q^;cCqx|FG';K窨Ao 0C)y mr:s% /˘̀6ȦւmÁ(Ĕ,+cuJҒflnq`хKux}9]j+]A)F%-bg9>$ sh38Eoe2CŲç>Cai YKdh 9M&Kx0o J# 0B2 IDATv^>cXxҹ +PmcHlrn#v ."KF&JWERJ sE@l,|}mOp9c)T0XCg$LX 8Š+,XЯ w`|ãpCz%aI_/d0:hLjw4H̷5@ϳ9,[6:>fzfnSSI <@2a+t5 C:r8v%(USX v pA8gm2M'St!<ق,7~P@0ӛ$ϒRfWi)!yX"cyFݼ@__1eg*F>Oa[c񜕊_'|/0 swt匎hp Ѷ6zD!0kG/EG#V:KCbNƈ3"xpo C8"v3gF#,[EGG;1 TP^^oxxzLij娗2"En& Lyz8x4<_Z^'<,'k@cT<_+qmׯ}@]ȅE cvH񀫡 pdKK[*XӫӢr ǙicsH<^%3t'=OE21Ii,LdUUdجvaro;.sHxYJXe (*0j)YFy.qʂ;mB}RKЉCGLsc.Ζsr SJaEΧpyyr&wG(5 *Йnw072Ycȩ'LLipF%/mikQM`7s'<|5u{/^I+)id'4&UD'`F8h\P_>mxoǿ~BطV6N[4=rY~E`ׇ;Fm%@ckqm- zc! ] {g U3P5+rPØ49z 3:9ˁ}{W{[zC<~|t/?]~Ae؁ D}Ѥ;uYypmD9XB(^C2#a7_ ~b7}R6#†ϟ'Wٙpp908r}ͬ7!Zhnz&٥wHYI'R+}zE69ZҧE %PWvzEǤ/w@Ϩ^pAhh߲}L0ю U%=z?\%_ { SLUvƯaL( 84X  N1j,9ni_ 3ZcgtBΖu3bNFF@+CtMscj1ɹ->[IzQt;+zj؉q!OΈ V+=CTqvcN|X)|ɜ'32hc^B23wj>Z "6 p<-@ח^x #ʰ/E_oGMhFҔX}G%f2m˜WO'lw'ܿwoqEqچ};HpTyo&k Nҳ,`>)GJ1l(~n uU-f#ƍɕ-?ܖqWl1EK!@+>~1BQMf`.;CDӢ7C%f\ e~5_Ý]yqGأZybc_Z,#6?'Tc+lScfrdJ?Ǖtg3\jR͙KG47Hմ|oYvX$)2xv( +ryZ<:0SЗtكP`INK W"9n+ Ȃ#GN=JyP8Pc e ]gӄwzw?ɃqNl]îc` {h{Z> p쩗cl>:45Zr94K[цҤEE&'?c%Z w'sT瓟C'>Fٔc |kvi}3Kj'c`8/t@e7Iljp-q*kݍ%XևrSl50߁pCI/ ā{`n s!<WeAǴ'Jj{\KUS9 @\I )<6XgI UϩGxaSf,K/@QF`eX7[ǐ]2ww8ߝS$HIr7XI<K#J(HҨFϧ˴ 0U SҘYx1١2,8F$"_S8iMg@Q;N8)ut)Hޜ*U:q҇;1cL׻rN{E3 ||H1 '[we2'"=#+fU_ _8cXw,H2 We߫/kl{ܿww^Ţ P6V|=|eTZSZ~]щBѨ++8$w26D'qxn4$ VpKX﷨Kt[ug^`Z3w[nQ2J s]Q4q^{淭 Y3I|~ $ݙ= bvŝ”-"jI`Dn`S`e#wp6VR/N/;l9ԍLg)͌Ic̉9Aa L"~aܧ ,ß|O L++)R;PjGX0 lO!gf =6+I`29SV ˔GbA6bSQ6[̼B㤩ZJZ|0V PA+mĦRp.`)UR/ *#+YLnqtHE% *@œTϖ.Xy*o'k9m$E  ,qYE>#,ǻM8+ SB0!R1MTlEP;*$ihOu網٧'lm P5s)20!g\uYHc!5.NA%pMpl]f^)?j@[Tp -CPd[b֌&X[VX5m}*sh6u~jGKPQ"_¼œ.8 G=6W)N_izTdM"˥On48ûp:Ĉ|>%Lg5 2_H ]@ԧ$|3 =%LΫon6.E2qڷމX.K%D`lH>u~w,$" Y Ex1.+}f۲?9  oRh/Wr.1cs1?=_CGkP^.B0uh|T/ ,=cqGx w04-vWJf\6.9Dzc!!rLӚ. (L^ Yß!ae7z &5W*olU X\@1FtR|!LZ@|Yim +E $<Y0 u2uS20߈vDx /rhbX~0ZAoE`<Ώ{hަ T۬).2a%H fJc\˞fT"}q6eRIGa`Th ɭ UY7fF`BwD^s=HOpPC:F6/<=x<|*3W7C25M RvT6!f@2j\n 4(xv(6^@] R ǏضN<4ъ*p<xaаBh{z4 {01urNod={WU`YG?OCxMi`9fF{ hxOWdJ%i"p\o)9}d +f,^S*syQt4Ҙ,j1 YF. L?~ěׯ3[ ׿-רo__|;uJu+Ygx&"e'^3U:u>oYN)T`_Lj1> \@)ȳ]=0aŕm  Q@6da ZhהD͠{W;W<ƘNOKJgZyڽY}8 :$|G14l s$cf$N1WPEηg>2p`f^Jdnc'1 (F^eO IDAT1\0`ؠ`m~=bE^ e۱B\lNE8aA32ϛEK1 iM?::g8L1l]ݘI Qg=ޣy@n C)I;ͭIĞ3SQ8t|Ϙ/#t|T6;1TQ Fɓ^9ɅոM{x31nktAgT?6]e)ٽx۲62z 3e驿.Τ`QPTX1z/˯pxnwcvwo8aP{FZx11* b Ja`b7XQmk~:a?m;mMF*er5fDb#Ra>J^C뇈\@>VOpڙ7\D8v1Np]dM M^R O倽-zo;Ç'="7X}[} пR2Lb7q-VI>H>%t!޸)Xu! juƳCd싦" ]^Hf$]-@r&hpٚ%]۲my|M^1<EPVG0FǜDDX0rhI܏°uS#]nY3ޙt8m_#un艼o#ځv]MdJ6Zg$0#LLISjV>~x?~?1GqGmD[c`!`ίyb CXA>%Li3#Z%V}*A_6zƞČ"n;'s}ydHȣnZ+r *[skc@G2@n$"iq!8i}D[|R;%Bi@${yTLƍ@w$+9n\K8qZyJ&]e6kPBEN9sm; υ0VQOoeۋH#Xםѯl}7بQpp7{ۈ @豱Jmh쇙4BCw9i uo:QKrƙlۯld. ,xYjB99Ε EV( tM0d$s3r~ Zq6gv[[^B@U^Of%D-J|ϿNP~!@`AvyY)o k~e.LH1&DH,A'XB^OOtw(ΐm8ZFNu3ᖽ:+!(iaz PPX+널i9è|.ccۘJwZ(BjbU1ONїOq~:V(" >:F?p?4sa$j*R ?~wiz|=~|:?OOQ̑[.qr\#hGgNQ5ǫcKPx1hx$H-܇Kٔ H'$t ж߬GQ?/į^ԋ|NYu Q!O+ P`?+R%E`#Vl3p(; W?#Opwzo3qkg/=`XPUZ e4Ǐxz~Dv||o|/~qTG58ЖǞ}2=GZtl({&YLȬs9se@\xXVk\ښd'LJ?Jٚ+"vII0}*3#\GdTftwUVddwҍ+"Pp{y*@6M{x}){+BMSa'NJ۴YMb xu)a6^K㒺<ͫwkMm.*Z =߽xCexKWzxyhG2]ľҸdG]lq0` 59Uv=< T["m׫S&I{-;mN'TL29B<Ǽ܇9ۦC @`%gܟ6Q#d:z?t, kރdQd:YBPа,0[2ںa7~_~~)nn.+nx߂xHB˿ "ah^ uVܕjT0GLżOpnFn$ VGh=̤1T`f; ɼk+KJT^o>+%pp>01 -q5@4L0/AmV"b^]Q21ۗ5LHSL:湠50oU`>EoH*Iۿ뵣IW kyPPT7 XI:lXz6j? 0]dy0 E 1V›Lu8>Z3b;O/`J`mrs.Ww[kپ6e:=ub1u9sp֖i%kCUXضz>2nS0YE 祥~ ׁ'ne:bi(nJ!]X33~ (hp7,p9w !ҟM"3.|H`Zb͡ٳgڷe&P6ooqt.no?ǟ~ׯ/~CLq{Uk^4no^Նg+*[X]H mK9@ jCʥ叄Vht Q>vL9`m9m+TX 6)Cj@!6 N)}_yu `9~ڇ%źAM PW^$X%)[ x1>W:{B>15YCMϗ/ÑBy^* gud^MP&2A3 ,ɵգǞHeAmxgo=0cJS,i۾V\{~gx@Eg==}.vAv}͵7M.Hb:@hEKu,MMj[ؠ5ش. EnĕcʭF9%,*Vm;xhG@2$_p6WoAqGo}%0 w? Sog7PUNXn1僟+|ڝ۾lejb v=h[RX9\^`5,7% 02[+I3wZwD~DS!ΞX/kGڱ3a1 R S_5,[ Ù!a%0xM@H7D^i{;G}"劮nXv%7l$hKdX:b`4m+Rt"P Emimd/@%?7x9n^׿GOgX-^xׯ#b[+ub ܥq< a>^֊R&̇ LSA ɗ3RLuNVfF7& 8 k/Rj :Kyrи-v$6M1eJXN2ڍɫؒ7Q^B,m͂$`gjҴ)ܶ7mmUAةKVܘryyQ*&VcZ\wvкbxHCk'`뺝^b_~Sroa]b3./5]p{)_:Q$4$?%Cdڟ%XsZ;!O ad@PDQFߗmk]VՅru֛%70Ͼ;<$Kh-JlY 4;AZ=F#^zv YKHX8gk P}60bz1n ͆p2B[GnbkE[-|^=XB3@CW-"!sA+T3RJx3zwB^&/_\Rc$/w,+Ug  ;kZBNEZ| `A$X)wFF^&n*k&ǝ]YЃ"{R " /i3H񀭝tzB-~GxtECآK~+O}=.wH,cO^+5="o$޽jpemAaEnN0s$^Tw?{ Z%!~\yARYՙtN#2\qϭV@\&і;v{Z̪ m>=ӭxFZ>3M: š2 KAX`_|Z,N뺡Q%Ⱦ^޶]<$B *a;>.LWW%fv8ed,[CkZ[Em@ȥ_vgK=Hx7\No3~{@wC wNsx$iGݡX ``@@ʌ^LH ݒ($‡o0SjS?00{AoMzZd{fE*iL\^@V/r {$.YݳF9)B\#`[`z,KX3iIb5b%#3堅;]"]K2wJz-  $B̪2VjƩ Cp7]%Ԓ$Bz,  "CkEy|/`p5 r.+/p:-8\<ºJ3K5g41$ E?Yn~͒H@1R*9Qdx7Zb,_ܷA@g2aˠC7BqpΓʌ4 $; #@m'zqYV $E;RP؇g=<(bMemdxy| m}~RI B8 ߷1AXn:A)@:Պ]+!^x^3+a%j64#)!"B!rJ&Պy /9 0x.{7|MP]h}sC\Hۆ w}|OJA Z+Ս,s k `kC\%Ze\MiΨK)#傺.# X5;@V7[y[q{w;Ì8ݞvd;g<\ݩsOw{8)<.-~;`ul)W{RzÛpi :qwm2]L#r|tDlm|} djM;tiv NSm6IKNf$f Σ3Kz|-PZ[.U snrXyRK"9z>'P"T%ҵ4&$ l&˴yr +#: sX;.M8J -0zCTXZ# $P iޟ$O(BR.H:ZH%O_sɣKL-rSHO8L+Wq~cƽːh<;ڑz@ChbߐWu=)P!Rf6M@N̺c:]uH̢ʃ{JPrE>ϑ5t9di5u k-D:0f]s]kPZW&֋3ra322(w;Ihc򾖪ouP,  [[dL$tPЕz2zot3khuBmwȇ@Z>V`y`$IdN3/urBQO/ 3Gk=]g6^EЍT)@{P/[wx/o.$WiD;Z]+p{<85 A&x!y?dat&ϛy% q1=A{|Bz,a @:UZtYn, 5.Y8E[ IDATԇsWH0XT!21ۉoڼ5}Ǭٹ֞I<ۓSF 5B犾_7Bh[ֻD) \dL; _\ *{7+X+ZXlHK&x;RY-B̮ff-@Hi%% D%A)|\#ۓiu eKZiPA4@U6_^2T~&yhe'J#5#䔐dk9h]IW#DP! QՕEY'9c+Ur=#y:&@N(1hۂ^{g?`Cc6T2$tc$ܫ w[Nmym0CEe0gix\\O1q:l^ Y&H, GRD[R)3/o~yi*ؾ@^ؙX2z'5Wug(-yk2>p(>k&}x#o4|̐J¶l[5{+X1OM4UE9lJc^AbgJL֫LV<\)lSrZu#Ik*O_|w˗WX֊m0 osQ#Rw 2>.0#_ɨ~@s` ÓY\>]#TVRX~hh͋p$>9E @ VKw VR rhP[GUk=޲ƌgB4=Pgc-ݶ swXn5t0Œ: i2 IN "mDy0n!]aĂ egnk0@5R[Hjouǫϟ{_7xEB3Zq(3&QlUPp<و`;B54 a ~`JxşZWX3NJ9ּI@!cAHt tY@Qۆ|˧挱tH$EF'[T[~m)# -{Yϱt^n b@rLڑc{b!5 AfnBxL !?Z#lӭe}ΐ<;tg@H}ou5pFwE=>+AޣZH$!!y#HGCp xkA[\IPFdzt^ж[ڶ`Xk~תVA)?:o7aŪu6ӑLa;kb)aa i ğWܥR.!ߝ(zHsX!) zvw2| `!AD!CVOք2m[B`۬k7D5S||1&}p{w ',˂Z+ł=%oMq{~:}kuWno.h0Z:" !ŋߔ~SN옛#Kp=Pmtry[?@W$%] u?̵Yr,npL#3vhnth}4e9^됮10 QFBLZz|%G ~*4֚tuSr<.ЮiA'tqZJ,+pڲ=n3k| -R'H}i>` }1wP|3ַ *Vﰱ#rCINuUplErg @.:/35XWXArmAچ%DMy[ f WXz+t7?n1snlaZcBe\Z.#%$5*kw6ɳwaz"# $ឩxk]m!M: 2C@AaJiZO@^bG R7`FX^Dc#$vރ&b E6%suX 5'B` ,Z& Zqf@ֆ\fdض ˩w Rѭ|FBiG/kO.tϞ᳗0=r^dhyؙ7NO]#R%8xwsɗH| YnRWl д\=,8aٔQm>d :dZژ`qQn!S녷^( K'bzieL%4ڂ@ 8'$PdY? o9,`}G Q= C%5m^px+,?g{'|V{.R% {QK k.$փR k76Ydw P,dӶ ,>HCpujy?_OGGԶa+Z[gLςOƷv `SS f}~a6ז{+K'NP50j IR]"K'FyKcGZb% nge Y"|jnZ_.(/L(Cd|ϗq6ORdqwjksX@Ի@52|G*;Ϳ؁P!1 =֍SKXq$$ٍm~0*'RM&?[ 7 +}  ٽ5Pu#TVKX\ n EN1pO(䇄C*[xfPd#6I\܁a'qA$˗e<ޘ*QZM uc|FBöYM΂\ 3=rF䬘Ȩ8Ն0R靵8d\78ߝ03>col~ʼCpW|Oa7MP; KvL"j\qa`>h47d4 $]hmMcqd~33 kр]ќzXnFnZ' h-Ψx9H_mtY<{~akV7G:";۶'Ĉ ZMi1V?Km`gV:{*St< WoJ@L.~D3gw hZk eVH*ӥ%mKӛŶqs$ϿDKۆup>##|ze-i}b G.[EI6i--]5(d0<+Y,fyW mbs[Q.T"%#bg ڥ9D;feExu7Haz{[v[ G~8\th/UÀ'NΠJ|xi*V~HVW vnV۱{ H}ANmQ"R9xh,FX#aB.6yFh-8񂨉i [f5uc8H7YauܳwY=3Cx1IN>F 9[\2yHEkV/)(%|qWpJH%ETH_ꆛ3p^ޚ .KƇ_!`$%LEp{:|/olI-_]ʯ?a|gR郫 H32= "tbr Dl:uF8'sK X.^a:N;ecL;M^wZí h~zZIoҲ`-#+Q6D5̳eZL &Ъۜ3$WكlHpU'w'2;m !!Akb#y DHd:Kɦ{ |T[mBh ̝Dli xJP)pTfԕ%,!nK2C2W޼ᅢ縹[ h v{[3y ٵKMrpVhYZdŕ L`g\KgdҡTy57+t@[y7^-~mS|q %`;m]os?@.1<y=È1+AiC$\zM鞥حDgP7yI A߾ ,PZI̽5ܸFfK@^JH@HOۤiUn !F ^-qH,VG?.t=INe;N#:+?[AT:dپ[۶^ GJHIf뻘h"Nzo%vvV/*dq>@[1R0GWo᏾M엿~]\^ߟNuC]z@.>6iJDVm AЭKw0+,Ij"!@~d5@&^ JxU.U7Vj5:,#:c/$2m٫⌑+ muufq80*ðX]j*$bkUJlb<{DЌmg  A#FZp0[c+yF.C 36Id3Ãg[8h !m @5R.pG"@ zg #Y- 5Xuwx3կ-ٳē 0!4u"@:Ǫ(eﱶITX%$O<z|㣧zOo*^ǧo#o+{&\SCc܌ V0Ø̥NOa-Y>_8 uVHgbmg6P`u(dۿz Gl"(4x)af} U/x}5j.mvǏ`o`<)R@ ~akqǨh;L73):#`_|!(;FրlՁXdV7qG`?\zp(/Nb tkL-g"Ƴ= xQ cR1;~>}ٓ twHC;a޼-HnO/@FNM%?ܨΏJ6[a[,x1u3/=怸$^"@Hj1o R, >+Vqn_ X[b y"CgO$gf0<j#ۭ=c g7IpKMzCHKsw(0HCG;BW-,ȷ("[o U++3ʗؤe$Ƒ9o!: hcƫj #Xnnʒcs2}N"sxr |pU 7.B[%>;cRN/bkhHq Ԟi\3m\z3U{=XMkf(QdR6IQZdkGmu\ `'21+t8b)JPϱ. %w3~O1O_ǟ<}Opy0i6RN:D /]簌DgZP$5ÚF%$:h=o,3@yN̓—ym8K發B@_oF+K_ʴqc?ۻsLkqS(6@֋ż%=#@==݊"vdȻWK&G 0Y@7ƥȥw) p8&zJ8Yw+}^-W]ٕ-YEGJkê"ؼ[]S<4rl),Uc r'7H?eVK(x:Àoh;Hz@=K^6i8zt|tRpIlBdUɩ5K1iV\7/?zdSSl5J,fՄgO|u"YLɭk+|%b'=vƙCTbV[uj(Ȩۂmdn=6~&ܿ/!n?ųϲ.x#;Ōw'(Gxƻ?KefԵB TCl`c;dH Y3A=!F-j" fv aP0a&YnIk߼.&? G1<kX"*>jtEl.{ A@|a80}|gq)H`'Mbndqh99 P 3hmR.u&7X,m%-ڈ0n?9ᶝ-I.aI~~-bb%xed.ixf]pj [[$vh߳GL]>UMsA) ?J_?G86O2n>ݘ(.m!h۱@*@S7I __XGUrp.|c*c}e[N1 p8@}1? fbK7Bp 1)Mىix {a O6kyVt3 a\tm/s:HCbkЭ`iY]0XAfYnc =l -A,aPrü}'h&u"M IDATONEHre\,C_@^?y} ,[q8xk+\=j8^0wvŲ|1Ǐq|t|@6 aDRd§'NK*OYD+NL|2Mp G@F h,gs Q^c7ohY<3)x*qa,)YR\Ch'"P:r&07闄q{wX'!42(jISBvgbu3|k%(a&hȓ⻱v>dP$ڜl!O'>gzRoZoq ;cY"')7]XL!癳p-_b J[ y<\) {v n݊MKX2bұm `],1 4z7Hܭ=8Ƴn-۝/?*(^qeDXd@"_1DPs)6|%. .l,UJԯ"(үtZi W؉Y{ 2hݦkݳV?9]EB`oD b~ y>N! ] w&תiD1кfB+^Ч .L\wDPҢu Zfgx&a e#lb4D*!:KILp۰ybZw^Aoθ?Wom}_~(R >xc -hk|͋|%S.@yа9)Г< wsƹqX7Hr`XBFUcaRZpZ~M}mh˼a8!ܡ;;\uPX=ሽVH?mh۽ f֯ri׬QQn@kHo穏bg 0{S<5/Jhos7L~m#~ m Xm R.v&ZҘt ^I* ܶ`'$4h[="wx x4yJ,?ۅa2uq5VR|v43A_]R$p^opy8x^⌁-JJfKk m iۀNKūWk_./ ZU>6*.:%l=bm/RR(X7&YPaޕD\q gJ\4@J^A ]cvD{9psbܙ@{&K;R@_2^ uzu;eE$ܭ#kMf_HAVp @Ad{tW3!5꙳ \ |)KAg$"O=Ӯ,cE@yinNga3xbekX-ڒk,q1%$ΐ,35I ںnPWr |z7x x%+&@ GiXm49!uYqZpw۠Sц.[ he%tHFe[kBwS(Xƽ:v[*lˑA8-}RrWl`h!e-(,D~R %~ Cebv40jdz1D9`ga=W{9}3 c$[+H/+c] 0Æ˵ ]>.xyQ5$@%U%2w=oU9~֓ǒ* OK nXB5;g2zIX&$5ָSV񢒘+]}\"烸wh20[:o"Д(<d4l~3h`V+R1{k2(×\&s`o~PZNV`Xa| MZ!$$n3 ]x/ȅ_B\ij5E) "Hg$)Ŧ *1'ZG!+nRDK`aAGcO"K ք͒$O,jVQ}3ND[7+=٠T֤2cȅ}w %7 _|c<'S< |U|u<²`.`Iܥx"-;=[2(єuUxf y'TlSF.@Pɸx7Aܜpӹ}¿=~o>eO}<ΟxZOXkl{IL`4CWKnJ`Ke A8&q;3 y6(W^SL]H:n]{[iR*.t)}?"Ufw& U’'zZ|@wMT^x7X)W(m %u͵_;+)| ]a .]>FAݤnDc{✬́!!d(6> 'hfH9-R4|2t7.}/jez.EP̑tanVVWr;(@I@TѤYVNJݐp5@v(n߯]"Zۆn90|-*ELP2n5hZq<b,މQFaC]J藹F) j팚E9{SUo ‚c ݫ)E1!C&1X:'#G$QV1OFʎ%2xlZF4 %V+rR3V.4ݯxJǍ=lji͝=7hԨi"kp ffN) !w"8PsF=¶K?;x7FLZ^r9W?7xqoq{sgx|H8~'o?_ IG<WB-m:Xs i2Gc4 c#I[&i1U걐Lq%(i[R9``m=p ^U1z'^VbX̗sVQ{l{<˄赛t[oFȝP&%Hm[ dznG0Wm ZapRI{Fws .!0 Z;+!;3m_@ŸF4vs $%ݨ p#F;N0Fd,4ۺ҅@;ߛR:_ӽ >&]][NOVlfq@Bo_LfW(<.Jo;'0Par4X;I cu3$_@m;ufe`X͗ynW@aB)Gb ZI8^ҨvkCN#rW~9[/֓K|[IZl뼊yѦ@,+p5 ]|jpqxB~2LGī,D 1 GaU͚$"lg4 x5T0֑'$ )|b3fL`Vs!倫GtR9UM~q^q}wӂW7wnL z2*V?w1)sWH9Pϰ˄p3rw9b1/s ˌf, LP )r:nN/.ԍv+Cu&*"̠m|m/n3*qUv붠 =XOn-KbųSCK:e<|V2W\-hΫirPפx4[pTx0ԕW=)Xw;Z99[Rh=`0L(Xv0n|ekDP )\%ֈqc%IO?s`vœk5]jv2KDBpNP1e~V}^ZOf TQۊ2qq8p|su?=ebg+j8Sܬ=# @@,,@*lO_~Gl@#Jٷk,˂_YX78>s̻U ;@`3ҴNMkc:ztnBmww7=}$ޛ-z}Kܞ 5w]&S\`]..̸UP Amu>-g:=*S1'Aotu[#'10ܑ_R|#dz’tdyPH֯zE~aX }XD10z \2]#Aqj:A49LSXrΘrVvZI<5$g9~*Ƃ,L$? b!6͛.Qv >O'V[2l8p t#|w_Q1אߡ8Tsֵ~)x{\V ZQhpyuW_?pjwPKoB%(%>yv㱠&ĵVB˂hU̖޽ƭԕݺ8 8`bV\7~_=k%yEN7W%fA4ohgEQo_ 37|,wO~U uU zN,B |Z'xc;$?D9"J 3=Պ9'͝{.3^; mnJ_~/?Ưkzo^ Kn>Z5c4So唁'Ć9XLƿcGozod?)cebd젮I$ Z;+nzݶkrm VGyI\H}6d?@[#-#1;ϲJ$Zʊbix D-ipjb %2QE*k4Z8{7Bq>bscZ{?h(%RjCw<}"a={'ʌHcyq_Uw9Ȍt т)$̸Nf3f IDATj`!b [䕪hCni<9h̝s6??67o/˺bNMv[| _R//q^o4pyC"E(#?.Z1!|StErDbAg"7^^O@zB@cii,Ȑ]ј ڪ;cZXHDwRahbnw`z9/U:yRJ^u3ab ѭA)$ @OIHA۩c)Ccn U+z~AҘP ZG(r&K6zk1%:n)wq#C[wH6P %>f$@s #Ar& (83XsQǻoE5lu ш]I? F M^@[@v.Pu4:SD(ݥ mXᤁa9=%ng{ LP@1etN$Azui(&3uklȧʂuy6`/ݰq:;S w#=#%j2!K]`BEGPC_oI/evr[ӄO?~~1?a÷/׿;/QEdqM ޝ˯__b5 O%W@a#\pA#G7Wjcr|Tpe$g5eR&ͥ xzY#F=W2i/@D{2NG %2(A xSmzaZ5UL)+ݓ%S(  ^#i7)Jx+=wj%dZL8߄#[{HzØHx9nLnc=es#t˔a )5kwx{ovPxƙ$U 9~|3/'8\>x&} xXPnG\ m*xf[|ɗA=h I;|ɞ5 [$T Vvt^EtGu3ڴկ>f8dd{ _h[=mu]-ƕZ Azlq07Sʭ@`zA ӟ!㚕;8ߘE&C_d;֍4i $ۇB;XDt.h{}!ƂDWdkݭZVWOςKgIWT*/J@@; rJ&A]J./|Oqqy 2o9g >>B֏K`?77PwMՄ"*|@[OdڂiUc),OT,&9ϰޟzp -epIQ֓g'2LkT_ւ֪YVƠ_n!ta Z]fv.+EcmjC&0zR0qA]1[j 1JT ֻNnxޞ ʂ@n4B3DF%}ij>XzM4l"V8r3@ֶ33?Ua׫Ru9f% mt՞L.z*1s1KVi߻G [.^9PN?%tuB7.ڸ\^BJ ,0ޔLgV^ 猔x)z@po;gY,ݍg{!~ 6%RDC+ o'_I@dR6[##<qn&%{=&]q]t+Ŝ3mB2ͨMqZLOg_}G)!.  x凿A_c1rěw/qyqPjBGnxX;rpBl߸UZ`g;콥&<,>V+#M;,] -C,v]8 %ᘲ[KM Dznm;?lQVH,>1n#5cu]bt>ku'OdВJ2.2UvhzUs d~$2tcx+[cɳy=KnEC-+wVx vӄyغb]pzZϦ F ^Gђ\L#ϱF&+xxlo.v(}$xzΒr? ϟ_O}{T%rN{fqOCΈ |" 8U󏙻 @z+:Ef+<ÂmJBqfbVMx01b`VsaiW{ WE]QŲTnV|I,PwΖoo)ޞ&OXO ߼x_SgpiZ+i1T{xv[:nJz2 ܫ,Ncٌ^% e?Kw9x`Z!zK5<ʲ#K^+)J ~ͱ6Op@&f7k a9d tN]Ϩj%VVy}PuF hXo;na.bCL !8^:-K!;`/Bt$ K .yi'0PI.'4m'GLg6:\3]lu0zMSHw`2yFZua$~]3$CqWy1Oӟ.ЀRϷXZ*D\A̭G'b$!Xvв@ ZITo0t͉ퟡ"'HTgfɻgO((Uq%#|Ǹ? gOnZo~XsX/tCFǐdc_n? /p gҶ$[4gGRϸ'GWת5t6&q-cgV.*f&gh 3-ۄ βi]rb:+e $y8CA&%%a80V揤 ,{e-凟+XxjkNIOڀ1#l􆎨0&RH$VR[dSkXkN+Tt9A].aV]}\f_Y-H猺 {{|c-jgc{ >',a\ d-!q\Cjmc!b-bs$atP{Lr@5!?[#lS]>m~~h콁8}/|wJH2\TL"ʺw8P5(* 󊻻KL  @@OG۝_b{Ӝ1M-8w?O;Lݎr1֦|CFRraR,gi]ZbtAtۭxX]xĭ!:-qӏXwSz0deݔ&.Z$A.=x^+Gw*X-E* B 5ؓ^F:.zpK<ϘgaÀIƄW<݄k] ZkL߫+c7.折b.QZk[h: 6Pq29!:h]} .gIݔ?e){6h% N&OG\Lo9aN i6 A8Ohh`9J mA]=\ɧ#(d[UŴ(> lZ@d F%`IZZ\H̍}~ ] 2f5@ $Mq? q!z!I@@7W>Zj_Xoj# 4BՁW>A V!ٞo>cQdwa7P`1x$uDVmCNhœЁaj؃XHsr/[љK8^^F5k4.#2;dGؾ!_b]V'MH2c&Z9hEӂyGzu}Akg Փ']zBG {=cKx=ퟠXN~q{hbiiXKn7/?r^?nvLbt0'%T]]س6i j4CQrСw C ײiw/y@㯩E:M dq"Q19. 2d[ySā1,XK6 Re-;L&Ɍ2rF)X}޻U5jR R* 3/7?o~!Lioo0MsTU철 s:'H[\].+rF&{愡.hR;`;݇::[&bA' j`:o.wձqqj]G<ډfFr-\chH=?bRTx {=c nXeC':`+,SVn:Rtu5r肆J̔=BE/33JoKSp@ \w3 6vOqR-P]PBqJ߃rbH+>8Js&"38.P|DTԂwǟp}B+%k\\ӷbN *+RCa=!ͮ}>)d!O>QNq;F`!coy*L5]uW`F>G  pb=`r20="T?@f? n.^XBiO2yI39LKnarRLyŌ73>9rPm}@wx%~?ëpp/0=H 9ߣd-=yKtC_ ꅉY0zS6$ IDATA7^$Y" kL)k@L&L,$H",gM#eGE{4,ғK$$+Lֳ b !L@n3K a(=.z3y0u},#dxIQ-|x6d4a/qqKr-1a1Pֆu]q<Zòq:RFߺV? jca7#;Lok)'<z=N^p\ YS?,8/]nqsRemYj2rZL/Fi=gf+嘆;۲'nxdHUjx ~vE3+;dއ j0ɠlriWOi4 mhmT)nDӬHd)r/ y1͞I4)S Z 㝻xi_i>M4;}y|Xv/-vh?xehbAVP#$%ZYB081q ɪŧx7~u;@paAp|=fbl#wQ :=wŠ16́F8>,~WK^y 3︕&A#tmSM;v3Gؾ*}R*bNNkwZςL{ k)yDw^T OUAN+#Xzw}/zk(͍2ZǦ@Ҍ/>~ډ񊜀gO/RZqxZQXXw+'?9VDdol qu{ۇ}5y`' E`:w&4sÝRxsLNښ^@9pSjEcQbHG +5Ӎ;qIkba[;܁] x-)$<fm˗ޅ=մԌ}2} )D娸? 2x[rsSx]n~e6&14R;\H9tFfk(N5:(yE(P逦3 `{dI1讶\yT2Bp_"O{W0h-.IĂnL0ѝ@")RL i>K:?u9U?thܟ@ @cuϮGu<7jM V -qBPFc"eV^c)L1A X_:f026Ly }-FOUGqz 7n,$zxv@=ܐfa$X+؊ H٠hA]cY\_^~A 9[֫$ ֵbKR3N犇SŲ6҂{EV9 v@E?߁շ>1'~/?U)o亙($#OI70NcVkd1#Q15}L8~]ʾ>_r"WRB6揱I\ƠD!JyiPX%[1edhlb M ] <[SLФ@~u lSjjI3D2.(;b R{%V1AѤz 3*Nͪ8h匿w/q]tq>k5Vr>bLF)/eŶ# V8mſmqmJ|݄$aCAPӊdJD:foBUd+]xjIJ$Vce'[޽MN`1(K aAZ-v/\-yڹg &^o$5Jظ\D-:ᐤU(h s+'AwayE/h~Ě1 r#IuiCvg\=ldf A3ǡ2yV>=C ]9:)hgg_- 50Z&M@ʘ/!cIcmx<]Y@^BbVI rh`]Oh?'8π->|~7xw~e ~3k\qb-sķB8R* nD?IњGBl i+Q^4@ݓxuui ?5]h yF;imf^7a4k_6|6ampqے5ex[]Jg[3?qQδq2VdY+MUVS, R"tsqF. 5k I$ u#:2֧72tjS`7oZs"K.n|H5u]q ˷30WK9c>_㳟HX>1s7ηoBb*8=|TT¤+  vyzn٢0I^YJZ^܍/ηy@Z;Nka9!hgNN#+{O`r}jsCxhQ6R&4Ykt0UXIY3nSHyhN=>I*}+B P%aߖ|'F@6n|t#ootE 򌲥uB,Z@XVu]t-(Ίڟih)]8 c7u"Dܠ-k_ѭnTPj'|Ċ#%͹ ucn7'P=$helSۇNzm,CB݂v0#3`r L;YluaI{ O+>)<ӥTGwxswI )p: +z %N!:RecsqXq@n r&="W {x8#*eAX^%v;\p{t_suwW/{ $-,PݔUke -cc Iy}>6]NPnC ZD{ [߱qc@޹38ugxTVH"3vOf*R+$ jeEf_V\:Qw x >s|8\~mΞ@+X[9kE[SAtvIML[#Mpn=["F[V8N^0EJB&Ly{I)Bdh!0YAAp*qpٻ0afcI-MswHBr ` AFQ`YEKt- RC~NE6~)S:׍R$ 8,sF Rދ- e|Gàm>Q.Ub#}FǜBg7j}mQ3vל m~mPD iu`o1V!{R9Z-@р M =9=e+OstΙOůAZr>c] {M/ jZnϨ͍>C2Q7qQSB#=w~ðRazJZWLN[cҐ\GY ܾ^PvKxF>YZoi74nm B'*OE f@Pbvp:%zDAf1!Z<) lԵid8~N6[x JP3 \DV wq-d|m HFяb=S2&]yftX5DZڱ`lwHJ,!Baf&ȳs]O(v)'Jm-y1@Z4XsZ10W+ !O3f7x \ܠ_Bh;iC+GZ7>"x5]_Ǐ .j֐$N׮^ChG1'2,2PomkǦPL|$ej=~BlףPu0 ۴Zό cFU%:eF% K>?c̔.i4=Av;0#3*ںX' Na{T@Fc@ dZ!M rrd0p\b7qNc{;! m: tKZO ']ۂPDBƣ$7 qI9' 8Qh)}a9'bܷmy GWuA}[KZô q3&&C)V~&T1\߇&Bz daFB8%n<mcEIyJXGoGh{ js~6ϖ4Z5ZQrQW$~WA9HtX3{8S_a}} =SϾM#?H~2!B 0Ou%JX-vZ~\zm1M Uș@\d.؜aSr86c3`='@)9eTF4"렙EMH6AT0 aK8.8Z-,e*6Z3<ֶNɬj@E^U_HIKe(3=hMQ'B7Z _#bU'Opa:|śȼY7ZZȺ @53*R97O2~}Cm)@!-Lv/E)Kqlk(! s#ѢJ0NwiCY)Z|CnR8) KvaA*;dS$hC0H:xY Z @-.PӚ RS=m22tDyh )7ՊZW'13kY1>W+V݊?d1Qx+1Q#6[)QHpݲTAsJgtKrZV܊Pfw昨+/jq> 1E~9Q~=K>Fؙށ GiڣLӶ@ϧ8?=Ǒ$#G L lҢh gq͔54;qwH|[ E$hniF{hYlJUC x8BZyJ(*X")p>[Ǒ/"blapa+{.:wLB7T<&9vy9ժFm1t;S5 flJ$1w(P?\U# ^+/CbPlԊ4$\"ՌSkP nȜ;rՁ di@-SΨ 焜ja"= C`슜K4B+jJL-Zip Y[T63dk`$,'V [gAw)?aqͭVOEb<;PO~F IDAT&<\K%V`qR ӾxQc7׊r?[L"mz&5pB 93-2VO$Re 3ɀr5VBIe'jCHkm]<"7Ђ{INJ) f֡Ǿ,KrAtF"_`o5İtAbwPRB]@P"k'Yb<& qtFg10WT@DǶ @f*`9 pa( D\X[== 7۰6Go nEh^5CY.{(AjHʶAכSxRJfmk2[퍖xPm_]dLGĞi]S58!h} @ B&4D\-"c/G2M&_"]ه.g?fjX66s*#E3_;_<\;~32@`bdY5nAX"9E+`BMق+D]8댡iV5Ya  u1*^@oݘoTMCW '2F57M0,8w3糉f1e]"MFƘm'Ƀ!H-6è^^+Nx6t,\٘=L>WT75)aw1c.Ӗ[LGh->$z!@6\U.ƈ#Y$ŐQ8qYL GEn!aM­dNS)4Њ1o]ى cUdZehZw$ Z_;Ngi@@@il,yi.B  %s'Ȓ=chSIP tKy?/^ƴXUiNk||ӏ?쑦 E'4M dc}8c}i9O|% y` RP(Tq=\yYV/Ʊ Y!Q Hn^y[ rztC+ro$|U;[2!Z˞ P1+ clCkBVpMWˈtx@4{'猧c4ysJhqe9McV1ׁ~jJ@eKUۦuL02DFkl7}$̍(þ\vI4s"λiEڀ&5I]2{~ OϾai#tS>RAiv^5- usRS[X2~w^ܴ[D>03Lz: PP&Ђ>X4ֆá ܠm^#0Wꭟ;dmzg>j(RxJױxo EWN# H4 "͉R!},]?uWW!@D.RB5fF $z>p5ڍgmlMe 0qGAsX_Y{ـ^rJCu2qR~B!X!К ֐WV(. Q*_-iURBa@DH[˗sz!D> ЁAw}^L{ W_)du8u m?1٥8ܙ=_n?W=LJc*W|vv8 h =eW‡qぞVpx:0eC@!7 k?w+o&xbP&x<5<q`7K.`(4kĠDq\ADd),bfĉC O =NTt|e^H^t bPAY t*K0Q&W%c^T 8k@E%㎊&9(H()$.Ia^v@܃~w~Ҕs%=] kGpH47д7>t/sLV\VRCA]*p3^=/)` 儵~[S⣟ evph۵?6w=t+ i *]by4؀Ò9 (<[' :pB2M(LV'HOω+t&WuM/Ś:PJ`1/&jvpc2z5oP(WPu:[>gU3H2֐cqGY} # ` m0\1gD -]93T?o"w-'d{$? <8)S$~!s럩h^A ]z@=<]P/9ˊ @h>jCzu1N=V٭;BS}bL(D0-{?ٳ#ssCG`LmW*Yp{#;gJfg1h^7R2 o/r:t/XRS\gp8-)1EPR?Q*乫,N@0BZ+Η(PFdnt¶jZ6t‡m8 ェ }״K7!ӇCKIU}6S({wT EÀטD5e僥)i%߯w϶6/†f82W-)#{8+sĪ}$Ye3W !{$P0[ȬML3+LY{2g^t,(zNkr2Z}d] @1?tqhZ+eѶNe­*XLdw?!RGp(A j@{r 6V]ȐTE)#8= LFo!$wc H0 "H&C'C F(\np{e"ԥp!G':L0>+>w:VD0UL7t;a/T@30ypW1ļS38?7(L g7Ptsx dEF-_ptD)SГ"U&b~XQ-W CCOki M%ӢmDoWgtDtL]"Y@zAm%ѧkr$Y  Dz {kP&)85?77m֋l- #γe b_CbEVl)*=lb&^^''q*$2/(Y|{>G_1z2痷iMRk~CThtfm’/䮋_&(u~脤؊4$cz7r"Ʊ BIHƵ>RQ6{@N-".7Yp\[EPڦ=xջ xz< V%q̟EC:R2gn_ } >?'o1UTWwGsB]PS q^;ia36SOUwg,,; st^ D{$0`^ 1^gQ^*Xa˸ZMLiaO I"$=_*:%tC@ ,q0ac3[7{t@RH\*ΥR:fR"ĄyX{ ؝'yh=i &2dR&yxKϺ8[NjHsÞс]x( `N۳cȪ1|uX ~pF&{e'IçYTz @Y # 2H[#7gݔ\vyW߰‡] {5p,H n =Oxuo:B18Ј{q\{{06áC O텢湠AКɲlt?@~^CX"!g)cfɽ ;qˊ98T  ;l6,r*zvpV#'-$ n+(ET5?>vwւ }w0z|N\МR {7|ΦDwofαD"x}Pƣc_*,#VmOac;yٳg}2'Pcni22Q`q6Z_Nt1\?]hFY Lр׃dw(rOR>.] |q9>@On  >Bs/h׵dhTF 2=4w><4-ҘgPU?soa&4s9=\9jxM1WSݘޗgU3;} 7gkpؿ9^׬R8sݱA.s flEf~w osb=|n5r ֭am_`⎐}ĺ`%0$7F  Qi #qBsfwz:7YA;ꍵ e2=.u6[sk(lPK<:NwKpud+;ذK"is8#g($8rA*]eR=C+qn%\aF_~Sݺ|!VAX{[_CC{prcg?p}^R= N}Pz55_|? Hp{l@O+.Z@_ km۱<>| >?.@MizaF8ۊN@>_1}0̘*h+;xpŁMp숲}zmom=RYPW |]1 zG{WǏ@bm+i.9e#vO|_$ *Vk=y7ߦ:f,B9 ]Zx N1 $JbW} 殢Tf ]0lE0*R:`CPRL3xJ56+!HtS;ۉ`9AI_|cC_enSBlq@۫D{T{|!@Lz{ bʺ6骐Zpm瘰" vw2[(y(_> l F$H.fD9ep& BU|ȗ{J{ @?1uű)G{ b}A7K|>@gvdmDki iIwиGug(r^&WV4od+3NmCexp mqu΢``pQ/Ձgs  jR`es"Z Xulryg'\,jZ9x$!8FB*CBZET 3Z{* 4̝1UBt& rݟMyv5^h[1 =v(ThSO1x0'X;𥉉)(UӘ3dUhL.Eny}:?\Ch^n+ЭM0pי'8H{1゙ CCqUyBK {rB hL^kUrpW;*drA{&5$-2 @|bHېEIl9KiZ0bxomrOM@N"v-˴c E}l-J D柹S!]omnJ0OK8/ʸfֱ5$d:ȴ)'Xemڨ>/dI~tagLT/]*ƨ{n [gsν{88 N^h :4 *p4OxX*, 3pMy2P>\"2<DxC;d Zͨ0;>2b k8ߎXFYJMj.?>8rK <",`E/*P"1ӣmAhp# ~e^ WFSɖ&/', lc}Y-,60bh`mX? OJ͘Mkذ>nVe%x,'km |(`mwX?t|r:S=GL=n=G9aYf{{YRXsJ*طUNc/ΙTk⽹8\&. l-(40ɴG׋=19-HZR)d tfřÕʎg}n~u;Vϟ 4l;jņPwXա˗c`5 X@Q$4xS,1n xQ$IB=aFX۽̂ 6Fa|{O@ozD4 >?BOh!k& x-U z9k&neOqƀOL!y>lR ä_/pxP+ޡ Pn.[<{| TQs' q7u琯Ç8GoNwlRGy;{nFQk5A:?WH2 u0X6xyhX,, Cr }5r.w(R~^ϑN1 V)CE%1 <ռsBn{$IjVC&Wk ?~~ghA= e-M\غ@B-֔o]FHtd)3Dl+O@NVPdR%F: MQ#0];{sm/ zѐ;*= +*^'Oγ[Xh<LuфZ8Q76\Wse<1 PtgMӕ˘;$Zeݝhac9xuؕhg]@( i2ov|~;ءT)]lVFcLqisSO_ ,5"8mh`5"]g8Ik%9]bw$&|o!C"; =s.L6X'Z,~O91 P#<1уEώ%E+(vqRyy)ɕ>1UH2 '۾*"& Ԉ=94AyGw ,B(mxt4f@8p(B:ɡt&w\ KúAA 5ˊOB#nግg~ w`Lgey4=*ۖ3뮸xi=zǝ%`q&d8"ʤPVA%ٱuk {WɍUBYk: Ч$c%y!FGFϷ789_`4tƤNEhXoBQ0T!B2++z/b&EO^Ļph(0R(B?D:mDu8²Tp]p:_q(/peT5U *|M6V˫{7@q!H6AQC^UHnwmyŪ/ëI=jOLVLX TP|&ZRYIK-" JX>m#&~Θw3Y{! {fz1\zy.XN9aKWL_e"/e,c%n]M+4pǶW(0FN@-T*%{M w{8;>A0:-׉M$ ܌X8<m}YD+4LmyޒogSv| ϜUQ1~30U]Q5ޥ+|DG)cDË4fw ^WQk߆}ڇ8ecz3 2 J-9[k<=5P{>e(bOFx{sO˸Gg X OI@+H넩r7\3Enͥx}s;H?2¾kw=pgeED:a'Ci(­Prx ;"*r\ظV7±ftƙc2V3ۨtCv6!=,N+3L@d? DhnW~iCP`=mKZ[ʖCg |,W1eNDnkzB$H1^n(Ȼ#qO] 9(s}a$S[r؋CHtc2OSHz_څePI qkaD <πM~<42.g.+D3% "@=*J% n,\Q1;Ҩ`ͽyTИv|@f(xsa `;Bqqk^򑜒d r8T29!d0X;}! j z,I>{ ; CL✶mUӟ95M胀-H<ףn-aĭu]r@ZpӴmU]ݺJ׆uy~J,p# oZb&XVYrǥu{Y9x?KH`bW]d%y҅E>7VOC !;oʪ%6$CHDaԞKPwry_D9m2Űۋi ς,j6yHT0M]>$dz@ypit[q:9/<1-,wDtpz >SAS], ~AnC7#`ԊrdpY3p]6)/̦aHG`~>qxUAOO 8rNxD9Xnj ۇ'LF es^~`];h9O^z?D WPg-JY:,i+%x{3 g e4*VѩAYR[b?4-V!Pc?#XH|d}C~ǜQw!Y ,t Jp! vhӃ29CrDEE-qŪQ!\D+$_<)!&S[؟ D\"`UbdS og^& IDATCn1c팕:VTgD?rY!uf_.}b7 5e'14OVvFw^ C[@nU]4UC=`4є.SfwPE_ D , ^Yu'nT5*v#ne?3l)Z2u2W'G>W370h& ŀ=e{$pO4дܾнoWȦ޾DYA.xݔA={!.=ߖ k2g/m]7s)\RUAPJm*zPE3'L5/ PᳮC_~0h{`HtАUBZۆx7 ZC'1Wjڙқ.D2;T.=1TDH jwBG2e#'pP1I'Ԇg HC,]n~T4}]+Iro{|gil9RV )6| Uu!j6/M b`˽lʰ1ttub(/PYS zϔ6nwb3> w ~GoEs8psC sghf ~x =3ky?\+ nn_"&xH_8(C揧1s m 1|?-J)_yzETu0^-zJ%EyXļ]]fHU V iB8&.M.]ʢp | I_ɚnh6u,֣z"k\e}ÂFγ4d_`_}Vtyg [SOD!cX;qF i_s2Q}3@^ 2-d!HϢ!w. #ں[˪m9u%7=)+)d@+[NrP#a ;xCC8tA}pr2t 5n-oY;p h&0{zSx+"9=A#.(;HA 4T iBB* ʭwe/Ѳ:H??9N?B. n{{v:06 rV/ t8Bx L >Fz7/Q;<^gH|5^{3F2CwHh`b`di5n.\Sp H(Nr\;]r tx2lݖLGAHLMvP$}ۢSǺvH-K[ځuܪa웁Sv6JS>b$ظ?[ԵkN v-؟>L3"QsrP P(R hHP'i!n Vt<`*3h!ma' c;oVL *r&LDO`\.?ihn |ʤ/W_\~~~YGW幆˭nv  iAoW0\a,lhyS+- n9 j \xGIqoݰK q{ NnY«7(x-Ya¾6B-KyA{G$ t0oJBZ,'(;+lW#F3I8ywE`XOW!M YP(p%m nN@+M@e-J`0d"[n$e^flFu>2C1PH+ s.G]<GݣNJ!1kct9 THl? w||7[~3[޾Z ~xWkeӚָYs{\Qf@ 1Y8 ?? 5YsJ `;ydP*Es?z} :Nֺ88OIKy;:~~E֑0\Ȗc'/p=o@-@j`q}sb/cm5S`_\߶)h&ls/ {B8."%\c`gw4&̣CL B:Jf*<)>y H't"KZhT%}< LV1p"-)$@1(iU-g! #˳esc#!3*U&ȕq8.ַcBX*[f<y,ϏÊ'P7U 0wzE}xW%@ۏ@VWS)zՃ p|xӇ!Vys60x0` qkgi)lV{wP =9QEٳ(y8BlLoHQq~Ϳ8]w4?Y~_ũ"~;0s(STLλư+A ɐ&ȰE5i"~vrTs|ڌ>Vz9k\]<)5d>.?cn[~?5ldR`ȟ ^%M> 18fxhZ+nUw=\o:9dǮ} wG?[|+ u/yy҃s PQ)&,_@Wy?-hux .HY6fj}vs:skӹ妩Mxh,غ`}o){a_AlQ.yB[4 V _yg{Ѣ h?h;tסh\WPI%-p*;l:яxs}tVm|i &$)_BbRs'P>!`mA 'p Hi\LKf / d3fjn[OmYΩ}TMUH-YFBUYhu.778xaZP7mYp8̘A~8kԼ"PQRj~(emUO-T4{§ u.xvܰ52-gA#웂W831OD] 6 OkfB0l7 _7J/}o`DӤōnLOwV$ H=*`U#'3GY,G3\J9F]%9%d\㥖`q=1%WQl-ӏ׏TRdϴt 8?KFA{IըdzNqfk)"6*ize\}p!iC+I AM NZ JtQ a]0(uiY&`..jO{5R\QX=D[[Qc &ȏo8A!Or Z;-z)O[TW/qOo?:MVo#NoOZ)?Il0t[$R2R J@}CC/8@C('*5–)L(u IPM[ˀe^i{ZM=,k=,UBi^(!Ϛ,_WpggØWh/$X2Bƍȶ㭑i8OĠ@ Xk-COH)fyWbVgAv!]y.̻4#u{x |R'MZzS{Ih ge@ͳM'yLѺDžݥK`2IeN94|'?3rMUސ!qV W$R\^e )otRF0eǤg s(i޳1:O@ e$atJwY FG@C$#,nM<(7{#7%#Zrx9+^]Jm6(>Ҥ4Ln{C/?9Tv f]W! Qo6wӦU#Btz&PըfFۿ  )]Jc{&ȳkPd%߱y a%٧X]g}&BD茟MS(uBq g5rmD*&$$˭\9#J,SBg9OsZ1v:pًn7;ܭaj C@F7&wa/@olH{u2ROe UȀR,4%GkQp b!dv _w;0cp~6a^Z俪O n^+?ojןа~0u TOs&%۱,r+&S,P`tvd:La l%kx> &߱I BdjYS"k.g2.y@'x,ڐsS~@ o\P=3U잾f~tvC-*L[W\$r@Hۧ\9r٪r}(EnhXzCʘ>H r mWP&~KU&S[pY܉sT25Io!M4e{M miR0bʄa˟cOvOA i6@(O!X ._}^X^ w%1 OM3û¯`ì.ᡡY2# P= ɍL`|Ȑɤ^V8<ޥLx$Z{Q/7Zk8;߂;*a-{qs?l`)^\l= fl̘[HnSӌ3Qg݅2V`mY+K)g~5>g< [ H& xQJJT+/|QHjQkId1 7Ab|v%l BT^{û.Te0H0FO^kV`6ЏYSVLZľT6x4O RW$ P7'+D Hϑs\`FJEV};Y{WMvCX7p=!__˹3N=!E<t@UCH%#3IK6J7!WcDEyQjǥ 4NH2:xF+P9Gn'p?\1m7\ _Oo}Db*B" MIhg <g$l 4`$dNuMŠc}yW*G2<.&i0~ ό+{ΐ<C)~'ayU^('eBV Ǐ[xc ~%#ەm۽l审y=P){3w07?Ga̟0dY= 8Ox{M_4tfS:b-i);Ξc*rbXr0y =:]^nJ^=a^KCk64'AP)27'|KxWdC)93z|7yaOsbCڱul'ۊí;h$Em=KhiE]? $K)IaF_!(kHf̑D;]Z{p{Wg(K4+?)^T%`cF@L:-D) %RKa nI6ds|vzw PS\@Lš #r$_?wfj; SDs_=湳P^:@FƃI38;i3CfqJˋ`|Y^R;btUry `D 3LF"vn@ $Vޣb\7@'`[Zƒ%oll61ٛjtRÇev-9T T 0lC/Hh^H`{ GAe6r'c{ zv&V݃(rglpӶX&̒k6Eb IZO<$I*RNJ_~|4Wt&,npJݮ`S nE=eE&.mT2~z{ۻ(?4v%/emeu1~2j*< kySX6fGn9R{ lqN"%8FFC>XFRi+ 7,z`Y S:E2[m.d&Me@9Sl7rVfz;5")"\[_Bzx sѮ^gԛ|HxNRhQH#3I?}@} Ҽy"U7AT*(? #଀Hy)P?]S[M_?ȿv_4܃SO'`{KlΟsܼy-4j_'DŽDWYcޚ$t* zu=ׄ)1/ qJ ?Fȟcm Oq.ab~5kk0eܣCT"ICp '*nʄvPI{KwuQeUa78$.IDB=z']ƀ;0\FegychO+ A0{ /տr4q"(=[K%mW m!$7HT팑`BNX[ѷF t3|=6L?Kfsڱqyn~z˗hOwW7G)O ]?'ݹq-?.8҄vȣ;.|{ŦI}G|;KqT񘆦.GP"MID1 G1>Oφ_|7- 9` >~B]=(F“ Y^yd]s842D:@3YG~h )M'#\F`/uj'#)s YIgi!ߋ@dg`=@kDwoG{(>=U( [,2 (癐RiX6z ,>`aQЦ]PAlP HnDP>7%(ov>-(\&L^ Dt L?PYAi X}ʭG0K .H?~? k(\k4UL~T%߯'y^sL"U.9@%;%JJGn,΁oa<F7^N9GrC1ž70:WF)mBTI!I+$!XC 0d`8x&l-UU- 6t3@%HGI=]hvH 99!t]ϙ's #t-pU=7+% LpN,4R %JH# <.豼}u=CbBE2RT,d e[7χ8̸1V5X!h.fe7?\p%.kGxtWG|\*|h1py܁'^軳NJSÂyIqСFNf6MheKmk{һ{-iz Y,t9s ̈́^E#q@›BS_<6Re>>/JmRm.dQ2ǵXf% N1PхZg)`ܬ4(Tx<̄Q#{^=SE>u@`-"E %ΤV7!6PoHy'69(E7KFM<<.\iSDAe<$I9Mׯ| B@XnMК+/4Y$ /3І䓏_޿ҊvUnQf*2& C@P}3' ٢3?{] n3nf̵ `Tζ)l=pKu~1\Lx|ynΆ3. @x:M8 FD$-ye5,I:0C^1]ip+8;yN)=MnH*Xy*<9HݻÞLC:1f2G Q0T%;0+G7p1-QG@`A ӈ`q!ࣲRcݯ=VplBΛV?9gmN6Ae俳805%Y%L >R!Pވ^ T]ї= 3Dh׷!B>{ݓW}9waZsJY$zBp)`&cƆ.>+~3KOv4+5p2śӇ2v yJJ*YfNnf[k&ΚKĭGF{ڦRdnzi!?pbpv눠H fmkkԛUV$ ׻cΔZVڹ2r~$oG\t&I 4gahz~PWc(`4e{=k*!߭rݾ&^M;:!!f҉.!D#'. 7'v0 pH%uۛ oi~=NJ˳ ^86` l6]n)5dњ~*VSe79q3><ۊw4@e Z6/h z.h&n44|Ih{#aщ$B6{t)RX T 6;EskEk靭{P6 MdGD\,}`md KR6Yȭ?,% {9\\sf޺A49 F@uˠ#0aHSA磵3Gs%gl6;D ݟ%Cr|wG54,祎*߱w5yZW$ek^\Rq8TEǤ>hJgg HW{|W? ߿k#flW0!FͭБO?OD()"g:X:1zN]T:K_ 3J=P7$V`Ka$6Ƴne竓Rs%d`B Y,O [4j 3k7GÌ&,?HS ;A?݂,pk;m*`mr.-;"paRf`'P١pa i ˛ߣ_g/?\&d|yWGhH&^]zaDhP,ӪҟQiO[N[|_| f-92&JB~T7S`1rBNXNK_߃(E+y5|&`|F7CSD!C:y^fv{1;乁^e"zqFp (0/)c$FK^$~&XH)+M*?%87Yc'f{Q\L1冑ʌ~q)6d /)Axf0DF\RB/~ӻN6vz@þִ٫~(Zb9gvߐ+Jx IDATwXqZ،#z 4|2Lyʴ}uQHszñeQDt#q(Ņp貙YFpK\*vK@ &)yL%_߂:L8݃N&6HTE?%oŋYS{Dhv8"m0} ߂E N jz$eWX3=ȭG~U$hmoґ@ $|̚!v'ŧ>ۢy JTPOv;;>n^c>b“pSk B"Qy;M(w]L*-9hxhA "rOyVj6Qro>^@uڡ 1ez%W&]^N'6;4+,iD%knC.F?zEqqNεCBahf<;C|;{}̰9+]A* ra?N^˽ZؗY@aߛ1Pjo-5v4mk㇄NHi^[ssxPj~6b:PBkU{&נMQ-Hm>WWH/vWX&ﯰ ` Dvpe@7Vx c]! Z݅ |z(+Dl!\勒ir9%ΞsI%MH+ yz {FR"m$1 dt9 A,3P.-B6{y(B K8hERB pvV iJL{C&Pc7X^;Mq"4_LrӋ>L 0@",೒VrgFWD)o8Ww; x_3ٞ1{NGVnM n|+ _Cȓј(f{*y!ü'b&#Lz8 &z0fC;ALeL0ik2+oޱӅ_lO&E\, 49NoB֙( #r:p3F({EX26z%*5/g*6THfVH03F`FqA nW*8_LAS(O~qVkpZ bNLqCICjT4ȆF#go& Uu*^zWٲ=絊Ѹ#Ccg@YJc矾M&4lsV)Ij9+1m+3`\Y=Z pE(!@? Ol$W6!?(GpVj׿GzPzk~4F4l٬:|zvw >-IPf~[/0] 8^oߢ[kH_2nhZ273x$pћ5w EaEBbpzeѫrKڜ 3f6 bDz~cH Cۿ!%ɱ{"he(p~ySAv Jq}"g##6Ov?n3pdUmm+)LT^Yȇ3Xcv +O2 t~ߋ#F"|䍌+L9Ec7\.i6KFʃvL_CL`6`? wUąs}^VȎ ND/X<}+,ZBPSmB턜u+mPƜ9'#rHy<kLӔ<ȏY=Q i 5>sŒg+ l:8Ao7}l=W×{3}ƗږewV@ܛ17ˋlK$έLZ4:1jgB*~G yNyH#iXF/~n?S:wΛ+<0M%1H+@) LP0 1KfAYmTuY=, pb!\H8x]GR |G ̖Vr'(H.TDs-9b* `RfF!¶gSI߽^VA3HiuZE&{SEr(scU/-:nY»31,Q+YuSDnBZR<ǥWJ@HsMQnJ2̛;q|B*S)6!' 2 RM;*m[ۅ y4{=G{,rwM/,B'F. j 'YTUtH-п/P\GSsBhPr, x#`LBn{^ɰ힢RW)3KܐJݚ?d SHw,@ }_ #:Zܭ:c Kx){{ PB@EfبE9 4b8vZiʳYh̚=y5Ӳh#8K$}(de m}? l8!ώO؇>}^~gKGwʔb\.6W/3 Mz=iu@ RZ}Vj>8nqYJb󇚢u KC{k@}.@ݺ>9?RUr"#ʹXC"`z ^:] B$T◥tzX ˻=zծ@ H)G.UZ;$ֆN:^GkuqA5%Pρچ*TA fe<'UeMNc%8- gn2 tJg*ch$d&N_} N#ԳK={_=&;,[#WUq?Crǰ_ҢSxl<.yjg>z\7b]m#TTwVˬoW) !vvg&k{608QÐx&P3kڹ jv:qV4z bӾF͐Mۍ|},~N`Vy> G#2w(< Хgt-=L^';Ak1Wl0yj̩"Ό S_:Ğ4T >3^[3wdVHb?)"{;/o}M\|i "neggN $=p@+i /Owؖ)'l@ؖݶK0gVx=x/2oë8^i)x)I *@soHfT䔐 hw)ȄEM=QGP^5""Va{d($fJP-jX~ Ӌ2;z!pj(_kq?3hB;u7tDpOp/qhDQ}Ì7S!0zR z7֦(&Fnbk0_zֵ*LڴOg#'s"ztm -B[l&z G]]ƌ֚T1E y>-YVg}Lت jt^-9-D.#_?ƟF+-Y 7᧞d,6*ˡ wY؜=Q]J²mo6w/j/.e:a >5DڙdOOZѵI5ZD/ NF)9lhaccQ5<;ζx#l]?YH[#k^\4SWO0<-N^lNN#~Ƴrh9e7u^ ?`4Dę+w_{) *D!|,H'qY8b|  Uwt:*o!QH@׵/zk/- l1ODrMZ]+皓&+NZ)'lsFa؛*~A6{!g'l>DL/?E|=$Y=K.O.y1xnwQ9㉱}|ś DW,?SǾM(67`UZ ^a~%/b@tVDgܟ7u7xۍcd^ͻP4FCo9\h} QZ* avkQ0UK)'MSC;Ph@F]>.M8/V "Sn/lR?S7C=)>'wegqfs|&mH KX ~yyql]g8` $*Zak+Jair59k^R]"%jZdB-ȬR&[n][;Yޮ Bk'Q Dⱖ qW߷Yp.z&f(zpCEZt4u5ofJxvU KÃ3~噹$HAq[vs_Y_BC5dw۩2!0zM4{~UM<)xAMjmrZ?k/"kn< 1k}2V2%m:Y39m2a03`= mY"BvegJ,pX6 @53jXWSZ%+(qgF)?k[¢WJ𓝟Yy\p@ڠ|+,;W콎2%mz,&c>-P𙒷0nz{pgbhRv5ɐ3: ]i84@M9g6=S [ \KUdcFfJ9 lrq){HufFO2w Q>ݧ@xpϿѵFKI)I@zSm w8|WO_Bs~x oot>ayuv F-7J,D.w!sGn173<%zD"4˖aR H^n r8=\е9ؒDOD id_<.hGLDBQ gZ$$^#"KdLV K"Y*ɮGXȾ61.M%IdWMySrv [Q(z .G6(h}O7c&?j{ ,HApݒ\MspRq/ )4 a8Cd^K +MRQkUūV{b9{VIR@@{&Q /ZbB WgH 8x,fDvÉv|*4-Dߣw:@R%P7N'7Mی'_bٗ8{wȷ' %hjByC=k~#¼~}(thMAgr XA{~ ǼPe0!>rGn0 {/Grr$kcEyʥDDz zLU,U=.n5n)^yHiBoOځ4wV$#ަ0ZՅm奡 Ͼb`hSSt69 Q АgK`(r+yV1rjic ڎIff@X GO_,`8ʢ9.yb#D;% '@-@мga/gsA 3((4jiL|6FN?|p+${3P< m-n968 IDATQєP7~;l®|ARѕD.sX71%͏+H?:oHg=B9a-`u5{# 'OExgV!ƞs ƅ_΋(]YVT`&لx<}u2}u7 V Xk뾎1)&yGcu;p;Dqu:6JRhJ@rKLTu^8j}kS'IC`w w"Mβu$n<7,'7WljRLtP'>hz`;jox-) gEq Rg`eQaZ2"o_ɹ̃=;rwv#c(1P!-b i 2Hì$ك'IJU{\ӿ }˸?o:D(یT M a/*_`!cWuo2i"K-gKDƑTP^l1W^K.T8 tkƈʿfXԃ \mqKʹYdLJR" /X6@C0<)K\1 ]{ρT-72M ChQqElp˶Nu|^. $ e$ݯ'D1#LD` >; ȉx8xD*uhHܵ;:;vH^z.~ fXWݳgѢp3~StZ,'UwؠCVF~]p_*g,^jW?T( !aY{F<:] `CH\tMJߺD*5#J v{<p 1hmB7גJ[R}R ),!ݣr`>8۱2EIлPZl?Լ 0%Ãip:!l(*'yFԃܯ :_BzGoR0mCw7_bF #U#>zRX$da-+%5$òRw,x8PnzxƱQO!xM*ĞaUuuc8w@6p?l H܁E x G)V@w'"bNC&qk|N9C=#=8\ >h(%' *PZ6ܣ|(pn$Je yH,ݾ^42D PTŪX[k^X)uNVٖWztxCl*p,ضuX6 nan-3, Tzg^'2R +ʐBD)nˆ5pkƛ+ZSL͓88amv+2b᜺כAtl o:+aui1ϽOCZ"7ϧ uϮ4R0{!Y(X _K2\:Z)I ֣:BPw%!ƃ/%0 # -;b)L `cyaۇzqK3} rÌж9r=4Ln!у0sz;Ppz@77ntHHDG'նFD -*Z\5cJ9 B+t7l[*I eʔ湳YU-:`0N2Pd-bӶ-&l*nmZld}<IJCJV0-dp9_Y0鞩V ux}į~/?^q,P1FQĔE2na海-B 7tCk(Ӕt}:?{ Rn D3yxcEEA(&ZGca @IbCh]e(AAI?DO0)]'K3mv!<ݝՉuR{[SN6ܤPN#6eGY|%$B/=HzK fJW|k@[G=6!T"˅Ftl~(>X.ỞWn5LjP0lsu&{:5=l!U + q87^s 5Xzʥw<՚[T؛vAwږRִa?CëNoK7jE֎媸][,_IļUg]Xʪ`ǵۺYk OKa.k&C/19Eq?◵:6?3p(ppE4ϸ{Ǐ;bX=bE2&jYZ븜Ԛ'x9_#E|аcެ嵕K@]XX:0t0V,aA >=j)1U텚Z4Esv Q%C~p~aC<$;Nz ia, R }jS@x@:=  wA1dᆁLe4B'J~B͠X+8MBJl% @vC\a1A~:5b<КU~\f4\=7;ۆV&,:}t݃r>ZQSPdp_!^q ֛9S>^TS n/{"- ˭5 ׋.P;t|]:|bE5;H}bf8ۡD ?@! 9slһbjawdKMSĚ\0/;ϓy]',g7oq~|xA9 1cAFðMK WzLCߒiU5)Eo D".$>ܶ2`~YnJ5QP62M͊6],[a1y>l'Cex\-gپ]9&~y$R;?k^mL6f2 qW2J6)D]oWyXQaTq|=n xӁeUֱޚ氳l0 xlIg#׾zIAsL8M= a8T6ˢ:x>]8C D殏;G%((SuXW UQW@TUhQc[I Lu3ƪ?;>SLgR:OhO% @g2g&3] 7A/L,a^ a+ \ eO _Dz{/zl鵣b+BȎVS~*X yr.0&lQ3|ENu"&5 nɱG9G{G4BFt x$yS 6y,Si2Irea4j@k|v>0$̷fwLS5/ZZ|s-L3\ &Kr5:m iޡϗ׭4z]qx? /yF+9}%іx*%IɛzZĢZtVKTaSj>wByBɯI#^˯F\5D1|$VScQyQ<1U?ypd4Sw+j+'\/Ъb-M_PpYO.?bKެGtF! p+'ӻ?|__GE:(* CA/mDp+/hѐս<ۨNp'@oq!sE=- ڶ2A Yup6ץ=k,t+nt#S^q@;VR,0]X/5Qu,S&M?yQ| Hp;wˇ /l۞]fGoZ9w'e/8yNy-i:Hbp`zr@ 'Un`w@Xeo[!x5mFTO׸"2Mˊ+ >#)RK=^}q J?ը_e|nTSwxrV'}}ѣk2U0!,7k?R15 茙KK\@2U߈\3 d .ߡ S)wU `Y]Ya>Tlwmxs{^22O5G^!ug8SAQI)٤>y!zPR E 2fO7Ph*DVWN& s# 짩zTHjt!߮k֞L>9H)=ݖ:z8M5sjƺxg _gAPQҹ+(Ŭmĝ`e=^3WXq*o&}1^p=7׎ְn`3;NknE(,|ε^웥o.-NwTpy (;/u*ceLx/Tc>sbJ3CVzGxB' P&om>y%ϩl ! " 쨠,+f^  z1eQPlH='u#g~Q5d}ً"{͍U*D-?.-;beAdQLwM`wK=KZhƺqNk4أC*" 풲Bkf= K5rL3z0=Hh\ww倯=Ͼ|e~7p6'6ge6q"l@ ШP ӑeY"Xl2}3|\f1mrDޖՊH46a J)tU@X<ܖ/uQ\OeE' Q4$]JE2wq·з$h: r/47>|d =~J3|Q9 vk_o[xĚxáGJ@.P4w?ebUu:u=Ό /1ՂYz Go}Wd?4.' GHOcǕc}KsaH+8hK}=4lX7IWNsnsߝ853.>ͅ\0c6m4p8`oZ, {FО}{tj-^Ì{[-f/юy2QT3Gg2"12/ǐ~f>a[x5<]V}-C;ʷ:ڢ@Lzx` AB~s:$/3" 8 qvEB}A>gh:W IDATʢP X>Qj.H)7i-ԆQBӻg!okb =tkٍ6d!w3U~ h+d.$Y~ՌQ]>g{<98w3[/q2@~>'|v`hwS AhNPd|rfb#w5(g,vc`A +琿AVՁkc>z›H1eXT9;}ȗs"6kvkͦƐ #d7dHxwן q~ţ\&pHk l|)0?kY4ͨE"'!Atw@9m1?ۢ*t( ˊC+tqm޾<̬()=y8Tp}>_r1 ^:Z* yz'= ۶zZeuDq];?G^.Ks/'M#}wfGo< Zm|f$KJphptL^C{OIc6"#2 `Q6g`:lbϵ(29 ! 5_EO6PN$ pnw7niPuZn% ͕f* `G:?Yued$Z Z٤k~rd,InK&Ir0آ1.@{=o?*hMq,W@\݌jz3c> ;GGΌLߖrᦊ͍?{(x<es0!V/t9ضx\4ڲbg4U:^Xl[÷ѻt1UAc$ |Kޛ񨑖f #`Ζ/#ov"9| Nvs65$>MZ5h.3¼G;럿hݬ +~a+G-Z /ݻx^D`eR'fz2v,YK(nB/ͽD}8B*cf~T/4yEp]6\n ׵añp2뽩ؒJQ8p;\6,8s_$BD$$F~ȸNw8]Hp͍Q/IJJY!Q*1JDT5|l_ @Ɵm[&;5N!|%WjƖ8mv>4 eXVXc  {ΑqeqHËa9;8?B}@L"|>[ЎT6nT!S(]ވ4)ẕ}/B`>Re,vYZP&r^<=Dt Chkw}m>_?`[7 In.ۆOH59-Hvi zΚ{5߶mV/XSbZgκDN5vW6+p],˂w7QB'<אPp0z˨~a?z #]Sb@m/є=-i!$! MPQ r dh|2{{_❣'N#0 gΰ P-a~˂&10 #*/NfIāKXc C=,|8 iI!ܜ`'C3a}8s/6eD@6*Az`eHy@#q2q)BdHXy< 1-`fNwxm"&&B&e?`lh]m%I7͹2~B/gnXg99~",1(FwZ f92X7azi)CN9x,7h.QMQLY&C0zYq~7X/nO / ۏtr[*v:p+^ /V - \6>fC~>Z'yb#:=Tu.x^Rl`|@6k. k2=CIS"|q嶅^ Fqz,ш=^R7ht~p&4@K5B ,0~(i! )sa >FnFJA嗯kxxQDx_f6D:ᰁaLM Pox hک4x4 ȕt0NpWGqpŧi^0a U`'j5gq ?RlƱٶJ9 F "ڡ󕆂Ppw"祈ݗa++F®KlZGѼRB Ƅp;ʶ.qY n 'V=A#ݷXx(QOV_ȧSpd$XC@}Zۛ Ӡ zH#JCH< h7Tj1D]RD ^3ڸP>f$ . `!ks-X$2쏼_ؤ 12@ѭE'Q*Of~ȼD6Lh?`^3!I'Hr B^ry+P6A#ss&->xyZ(q|e_{em-+o+x-8/MB/+?_ ߩ5%;;m wKΦsǻ >^6՟=O~^ϸ7{MNg@Y#w~gmRliGNqI~tcw =717d|/ x\|4Q+ RQݶ50KDa|ܗ"oܼ[ꀰv^(ӌf݆VPV)XpoA~ +'q1N| y1Н^̠Jz1LAН>]镠/)0-\c!6$V3zf+;N%7*0a@t8~,B s8}ov{Ԃ_Pj(yN&i30#N^xwB=ΘDpS&L iE(;vɽ^jd\Ϙ_?Z?)*^F~MCM% d!uo#B'ɷfOdc t D&/X8%1ANARXh4z; {7U{N(6Le. {Dm2m"Vջ'<6c5^.ZsoXؠ u6Թ7]6| :˂{͛ι<k}5yJ(ӄmmfKϷkkx-8/ W32d9wO/wW{rkD\QDpxxeKԗ#o$y  1GS%w+)uxIzv! {U%e'?'xvWvhɋUb[zdmzzeÏ/wCWO5,nem7P䜧+JYu<=@9g| 툇情$\uNjC g,%BkIBmTdy5d{w)]6K}/2 s{FX\3@Ot%~_Sj{x&U'邞GYՁ$e)V"f>LPA6UTJ$a1&D pJpp"Iy v*oʔ] D5<>Ѕc?Ş#v UwksuD0[>Ǽ6Km(Օ!&jGgYN_g5ÆдO~n EIdRDatغԺGgT(tm˨V+6R09MBШfd29M'+֦jMC8a5Ìe(ӂ4c'1 ֫UN21p; C'T]4$ oym&8|\&C*GҖFNG~8z^q*~_q7+v<?^_. ;6|%9aQHUz-t=ѝJ-ؘZ X(fSiBUm(Cט n@ (C] >ǘ#%.bX>jǏ'_E/~ mжa R夑H~7˷ D<k4(v> y*dD,6n6؉a3[5HKƊWP>U.7~*l[ɵUZ#єc$Z^<åDrNL O”R&-M-{w<*LQ ӬK IDATT4vu(@Tj~-$7$կcއˮy^{#1}n<U \̟6d=>=ڠm Ω_$>'4 wݛF*{7I/9 ! o?TnpLr0/ꠌ,hK ׏7`ٚ;mff!dIѺW[gd?V|܉5]il nm|>o3O.RR/^.=gȉ.Ūx:x{8z$J`mi^ 5rH˗^,ghS[3UVCy\' Ž)v?r{ZS5Lu&1K*;9h)LB&T)X.7;34"&fB, YMڨZ{ֆu4tzuy{*o,]mMQaZkSQlakв3O}ZNnhщ:@@uow3 ԍB!9Xj{h8r -\PEH_紗SkRq*:Jd;/)|ї=z]f;aK#2V_^лiڬaeQmBr !I>"7`R|Th8R7);W81Tȧ#V C+> 4Cq4 `olh7t|chG%iDL!8_xGQRҰƟho˂ 53,\ڬ㼬nνU m wΗb3y3*C)x97uq{??ϊU\D a!mbnok3޾5 "em?o^Trn=B[zezfIę,NV;_s҄<0{]{3"'Ɍ~B 8WF)$`ٛ> ?5p걁SJś^7cySDatBP' AÅQZEU;Jo?fXR):`( GPY3{Rj|>:x1sB8#dۑ>T#%ۖQGL1f*箰@$M Cnj,><qzh^8н X67ߡPvt7Y>6j([E maS?Gt7cۆ /M-L[1:4 =o; Hɽf-YՊ"b,k`uxԊT~eò>rY|ᶬ8* u\Weku&ߠpe 8/8Ƙ&ܧ" KUh>c0bfȀQ#|ĭ1(%Lcgg\AQ._*/m۰ x86.j@zmǹox}m11 JMƦ?ָ dQ-@d\** RZϢ̧Bf^ƽaOZujecXݔJ2H.WZM݅`dkN\F}h3^٬qֶy[ Cju',*8[3(b `xdu!s&|8X{wjTbJg ST*y݄(<_Wn o?;ADp>by)5ܟlBp(V+L.lHS=fLDYu`S̞*`žo!^yHPD2z$E檁CAL˗ywy 3ؼcۻ"hP|a*Ӏr^/b_hҢdPt_[` QO:hp@zv^wZLYj\!ɒ_i2iA!RJj M r4ZE|o `RlRwmi?'_ځq6<.7MjBË= X׻{!Y1oo8Tby|}ADbƌo4n_ ?ͻ'|p<˺庡ⶴԑj40+FB.Sчp D_, Mnv1HLMHm\iw;.|$ߗ,1;<{Yr׾6;7?Fk1~_mVMx[m(!8 np(v=L6:NDp7᳇#^M4W>{8`ݬ'ֲzco \x: UWw" W(UV \x" &:u $rXITDQJMac(5=9>>ϛ幈{{7ZoPCջl[ön}_X=0w[@3Qhee/ؠ(ex~~x4er>p8XuPw֭YI)<ؾFMQC"бxy&th[м{*nwBjϻLIAz 0@&LjqdPtBB,Qt`E`odaQ>߮`^ƱW5X%L `w?+Um2sZ+=M5O@tNH-H n lx&0lJ*30ޅ^@ʑ4ElsP]huKx[zfͨ"H܋Grϵ2 ,wTgޣH\{7^p誸}&C2_vM %~B$un|Wb&T}zϺp%ruoce{[׎*޾:a|YpJTpmr8O`=eQWe'$aPwn: <Df5c~PJC}|yyF&x-7D6rq7ƳAS -_&C/+sϿ|mY(2¤d5Upw8:*ޜxsq+CZPA䧇V2^!xx8L ʏݹPZ,@5R C³@f$z ;V:Ğ1+Q9(xPu?h=ጒذo'潨H.?w FP{23IBkRҦH=|{M QmmOzǺBy~|`iЋU81&xnڣuvov& *#ڝ6w7_;8J3eHZfB7GR[ 3 X޾O#RW ?NKkQzƌ+ab[Y1; @"y>u7nY8P d w^6KT|<аYZّf_jT?3RJ;}- uT~$t7Egm-`[6\_X o٫;pCT֣E{0ϳǐ/g DFҦ'u0mmm٠^cՖG+zߡ\pgbF8cVl[ud,􌪫awHre q`(:s3 <+^4T @3.i=8K#GS9chexiuY۶ƋZ77݌W'm٢9mPO뾵;Ԃcx}#~^5,`\U C*#ѽ8AZ1 ǚ,C]A#ܒ )=*y9;Z%8AZ2`/:ebF?ct -rmƻ- *(y̎,MۘƞHV1 nٟY%ɟji آ5Nm6nV)X=X\C㇠&깰}S-b)Z$r;TQ`[3f#]&@" ̽JW0QD 8>gTn<3)p%>i -"}pC~if//Rw=PAH hT{&|?=#Se$β8oEt;}GwŎMIF* * 8KE&{ޠjN &??: wju*怎_}|Eez];z !#,>Q@ڣc#:+ ]g|u.ggx[ @pbP};з\r[9战ia3 fK-Nh%^r ӑi'hTEbH@L`d)qa<l?}0WdMbP@@h[ᎈ`mp]yB&yUb<ޱjG<8%9Ke.¨'p` ,]ky4V::{&G$=S3swyUUwu\$"—٧uw9Bΐ9̌fz#sd%Uv~z+1ˋt ڰW )AsO1-ĵ݇VeKY=XRS A z2{YIOj|ʃ{)2K|g8:0`E[gYjy7mT(p\rY ^l jqN)iוp[u-HN \o`k|@]Ls3m `A ժ'B;+]xL%u١R8L k˟?}/WKʌOƌyZḚpSP=W։ItٽS'\޺sΚIxvriW_Z? bLsP)|?R1jYoL i0/syRFDUHn ͎,,y`, mM Y?ܒ=wװ{(n6au 0}f3XW={,@GFg4GDwM1/+2[*DD}h->C& &D DҀ3O4v,;i$ؼbP+Ǹ`B羀  u`T\ڪ1jsO4=DŽ⯚HxkUJXZ'ymAV2%3 d)@?@5fF$pL6WEN6p2 T֦{PWKɜE)Ea?MukXɳ-> $LuJK"][8A2b,HNn`@`,FoATAV*Z`30;9ta !VZ' &@?ufsvenN͸Pֵ!3kx ⲝcJzNwp0' Vy= bő5ԞLR70I\RTΜCnՅг~ AeQJ*ʐ1_7Km8oԹci^VuZEK=וQ[z ~g2(G?[ St!9:IǾ@~0wi.O$9b9}9K}ʌWw#~=>>|EьO3_fd>xGjAu/0/m\MXS8ۣeN3հPѾfvVeVBۚo< l,e bw񔄐FX3hb/t|GQ/,j'~m Vn㸘u"̙e ~}%²UՓE3Z*g cèZfqJI\µ5\k^ BhN#ˆ5ӄL(G߼n"8 8 "^$uq.t|mE7e}u]YKL2MdXt{gF8IZ4+$if}J;}d4aTŴ)?:~q:-HbL)Ē.L2DL n7Q5>+'ic.&xۼl2ʂ qZP"gw}#1VkZ7Yb'q-B0C~U"qЁNC_ |@K8zlej NxnV2^'A콯`H,CݏJN*Djkf]qsVYlc0IZIb[wɸӢWRpc4̳qT$H>'|<6409R+c(2f\e.D0suceVq%p}YR6 F@*$%*tES IDAT ѐt^ۀvc]07A5eK َ#> ,))93,S 3[xFXZ޼iFRϨ+lI )Si e֝5GBII]r:@Ds(̐ZԐ _ĝy@{eF@׍:Ϥ[{p]"'(nbߝ?{~ӂ@6gXJL,DaDk;;%WӔ(fe=4ǹd:R׼!Xy۶z]?g/+ZX*Z}nEzgW9`'-c}\"wQ3_a)eB˹bw\q޽9bL KM\ީmRBW?@m?D~F?Tu϶] -3a^׋'ahҼ^ c AumH )])4xIcn bhI +D~"T{@skf6bkYT=h)UfC+=Yt2q2ێtXj'u;s!Zb'$ QQ(`mZF-*sMЦ0ӹivoI^L] kHgkRze6,|P594PRWKuʅnڐGD52.Qdtu{fX3Z{0sTgΓ3°xJ|]Cxv bXTCwyAp:#b(A- u;$@hY6L?|txjuEm Ke y,ucS;# |>[e`/?3ȿwV4$AX@D8UߵOn?~Ww#㳗x۴bVyߛ&4\;bځy4`@*u/ЗH?ҿ)(Wng?Mil[`h3;'Jyn ^ 3҈=/a,zҥ$.r7[E&)`ڬg( , 㟞P~y7opƐVP7qC $F?<# Ȼ 9'» _:˂놵IWC)8 V^a=m!#e@X+άuJ DR6m< n܃W;Ōung65,?s=aAˆZ{ S%kZ R%Hq;xf͋P[{LHc*PVOnU2Ҳt>8`7q00I, ʥF`2ơ`^6U-6w f&!xp7~x5T+^ʲ(e(w8z]n*2Ki0o8rA5[pjW iņoJXΟ. ^^θ^b)S ( Yt@\kΘ;3#Vk*X}7i"5RR%ܶ(!Z; Io FM-zMs}:٭RZr1k8j[ZZuM(6|(Ÿ;VP$T *ޡ's cHAX@u+*$MH`He"n\n;%EQ\9ah>^,Ή0 RO 3*ȡ@kW\ UkxJ)}r<+g?ЈI*c%^Ǔ:e?,vH0)=1{ٳdf;4{Z>CϒRr)ZNDR|CvC ;Ha/ISg Kbx˸/ fCȂ$saF|`8 jkߋs+1axpħUeï/+1[D, U%!3p2?~b,E }sd5)%aݘqZebs~x94`wSAoNMZ3\k.p!V.hXu 5~LO-3!Х!+ a $` eBpG+z hGtu ,9z*Mlje<\H]PĥKY3eŧWMbj*q"iu@=ӬI,$V7<,He·߾ x_0G+h^"Y7opڀkЕ%X,ӻ !-%Jw1&A 0?6!#-dMHM ݸ'a䒜Xp_/kq5I=2?y f@$II]V[W 5eH"2ˊ?x `݆lܬb:IZEÿKrR{_~ºD~p 2%s0a[de9mkN̬{שIjȒU3Y߻PtY:?L?L~/dgmpndcp|o۽}w/|}Ӣan쬪0&TO.+Fm[~~pX,[Nncy0d͜1KG=pcK)nxw?N%XBRe U[S @Nf5U bf|֧87% ı&0eg1,/"@2'MBAw3an 8YF`e0^0",J7.?WF{ X!nʶ(iclݔ*(Icڥ˵b p<8+.{}7qW4)KpW,kCFY%/'\UR],S2i -`y^q`|~#n g༁ ^*hP/oG:@e@ɇ;pg<~;:ag-wdNb)Sog8k)&:Ya # :dg[Y3 0{C!-18H[3ui\ÞOJ ]2n'uHQ@Y ;Ugg`-k&n癙H|7PM˂oP~WLۏ \Ш;NGcx܅Ywn"Z+% P=( Z|n$$,h&dIoʡ4SbgJ46 +#K"[`\D9P]^[ov0Uxr1G}f5{ߤmmj뀍k 33&׵dEIdt񌐢Z@?@8?C >>t]Hլۚm$V؞3zz!/ ߅!b2еaAjHn,5+sxnR: Ev` ҙB%i INK9I،u)0Lq6^2)Qd_@η03f9B뗝/wicc$Rxl{nH]xhȸ!|MӰwb=nsG9gV7 pq:>h7w迺|Y1k5~xFòˠ 8P#bMPFƣC<x3-Vܭӿzo2LCՃsɘT0! wcABD0lĒ]B݊7{3ń@9jEy2$l2fX}2q@ P*wRuRiQK!'\4;Z0itK> `^V_ӌcN,$8 xi(8'ҶeOcBk+޽ Z?!C;_{o P}B޼B @BQXwEQ+wkїSX(g? 5JAuFCRN.۫gL[?,{̔>,7ƘĜY fc8A⢄-~L9 Nt11d[(~keu83Kn3`׮PϿ,G Q~0 T5ϛnVZn9x} *ҹe{ҽ1e,]: T_>]JҠA)-r* Jn6akn<_~u=f~৻}4,T "§˂M15L})= yEKNI;;-zrf6Ypmg>w/B:p7sҍOflnfu Ai9\܃)C?wѯ5zZ# e@>۶ P.ii0 E~nxJ^+eöIk,"BV׏8/ BaY3p2XzchtY`Dbʣn*f..tyqdw&A/z+z4:2{nc1re&,-B.4g*ܤ +uQϾ Zصks9ul^˺ Wj;$=͓b-nehSH4P'Ab'|ki~]%QDYvIJe0Byzr]%*UmY@08u$V(uU;Aq0ܵw_35|A{@+#گ?#˯X^aֆe1Muc`i]@ܰ+P\>aS+:sI:w%q̪IݸR8'Wo)Av3l -杕ʞ`)OGt!;)Hzn46o@ú/EJ)yЂ-b/.u"DÀfJnX5Hc<I1i)Ho[m?hAu4!\ޜl||`_[_?O-C< "RJm\,Z$Q{K`<@bd"MV83 3/vzp6\7%e[W޽eA"~pv`F}$Fş'Vji#RTKuo#i;FY3F˨ۧn+1~s`u@<`gqvhyf7$ϥ8V#]ݲe78N/D jV8q:R:-I65Ɛ:)a܏OoOei1w[ Y@ o5I*ZOps!-[lc>#>í{>2^i!fW`5i좃8^1I+OQnB\l_ָ~ϢVkDK0P7"uِm꾏6) x|>qü43x͑+ϷޕK}w1_$Qc2~=i+*.&b^*^+X?q@)2~/vCpmWC8_WlZ8 ޿p2edBVQ.ΖiV p7xVg[옞굚Tg~; Y?C?&}]#HL8zͭ]Qt|qZaXxG iԴ ?Ǟas3ܯj%(ϬgŔ]k ^ϓ'H~]) v%\,I:8$qh(*3] RJһUj +2.sQJ IDATe u`²V,ˆuˊe0fLc8J¼nXֆ %Okl{8(ܚ <<\fjkiX#$SrE]O[oH^a{bYh5]L6Wra%K({6$*^¢KVz'i 2dCbP_,ĭ'wZ:!4FM]0 xܔ4qB;l{ Fg5N}VV1>T]k 8ZZ+rI8Gę\k\(_ \ ޔ$lou1*hiҘ?,;o_{ku|ȞOZ\xCV+?0Ӑ{|k UTXV^"<3'a,ѭ5(a'ki ݚgyȹ/D|8}+sQ=2#KEK€`\eo7FkW 0< =g)t׭,ǧ+X>>^Ţ5|0զ$,KӄM1~}tNӀuX%iׯO8 /Qg鋱1 J^fHM77\ 7հSTe6yo{x -c82NQ2#J r_FV>c6fVNbn&EqEO$q=VrYh $_5q/e+ФB=p 2Pۦ.bjCyE/SB&Ui[*5p%Vt l@&+D)+{q^Z1Ee@7N=@)rޝ-:M$Uެ' uq^ΨEWW]^9ҕʂ Yx1I]V,ެ=?X_ɚ_O[b#oU%ày.Id唢tra_g?&y>]7lZdJ1z1~{@hxE =PC?}eu#:HKozˊq烋?/GdѷhnU^g|m%ٴ-vǣ{Hg=n:pgMAֽk7Aqw0$@2b(7w٘LF:^zt;N֛?؞KAw뺺6F x9K i&/[IA/kCb> 1e?0{9}ُJhwrόW ;.Xx1؞v (z<1Z-!/jB|pmriafɩ/9Z%80S.s'G=79gbؚΝ/3VQ[ëQPy=+{/T.nYF.y1/"ZĪu׍qB;s%VTj7_c ΗE#cx-u\bdi `z{anan؍,ȁO`{Yǒ0j(:Wڝ ;wkC;ԁt9Nڭ[7c?󙸎yqحyX c"@|Au@\OUϹL_S;]tK]~w/^sA>߭*G(Bw=6XyiXu<@6yƼV}ua(X i@^,ptW:P_|5s@dZ9u N6`-Zwscڟ]BA0۰>~O)#!Sr;^̄NSme`Y3v4lI )anۈY1F NWhriQޣ?V( S!d/U/µg#62{=#~:'] f&/!R`adzĆlb2I @+D2DcSBtx![˰nZE**bRD qB%.MkRޜy+ X$kz0:9ӑ }JW=ޑ݉wDyW#g %h]@ ֬ 7CSRh[ԝ ]\ -&w4~mM?pYuß;rKnO'E얌2k)e mhHJI߿8Wȴ3"sxB H Zp:nRkr%1tsGhs,  crQe?|,5Z ݯjR9@ӽ1+/;`>^>AI!zPi.vL&'%k`QW"}Bb0+l˄uuޤ1N#R^hEke8 2%oZ5CP4IR2d>/dm։$`]+ # xպ 17VW_c]Wv^~+|X~ԄbΗZRgF/(#NƄV+5 4cW֊6-nIMd-]8hgHY,Fv;nh)3z7=TSi"fPed KN̊e>6 8 )d;A` D1Abt +d}uOW3N§]i yp]VPzwOVdWfY4/2}nA8Jи>[Y%4΄Eҭ%]Jk9Dl#L%[Ƃ!42 NeFʬIËTY>+;v<ΐi /3!Kr^AˌW'N>=02$ C¼Jea4Sɘ^#07+<=~_1τe''By56\kuk5akRsm kc,&g& Źs bH-63Z3wfUZWELMp'? tqFhr[4gƑ\»x1b.3QwЌlym|`c n _X oΘuMn]u; bEQCR<++8EضըfBJ'dhi)˼.O cy^ )'|x^pYw*kŵ6/itO% -u+V n` /_փ (w сHrpkκ~\Y<: #0 )Tp7 -Ȟ[cdousG|0:c skFԭ^go #)u!);"ۣo7ϥ p۶5.~cavw7|]qWݥ9PkT5^0 e,j7ZH v㗌)RZ2kצ)+1Wř"J1"6n#(*w=sc@nQTbe)c_ œMC뱵+XlD2k.Gey|mwhrFH4WƂa,Ȓ8XZ4~8g;i&-Kpw:b2uuWYӽtXCx%4WK_\4!'< d}sB]\Xdmir#,53Jβw C~  rE .g, t80ADŽmuuĬGթgLˊ!LyB= X3$,攀Z|K*$k(h+xr".!B*l{3nFOhATqQ eLؽ:z - ___LFgZk-ZTKE~!FZ~4(\I!v@ff@kﶭ deú5e(rMTv0.OWLcK*\v`+KD#>L̚ nj "ڨꍱM$.d8XmxGݚ#)wkKْv#*kdFL&HlPX>?Y a[>3A)rY[% %[W壜PNjc1/+֭:mx@I _yAmbŻ޼>tq[q*njEkh]Asۿ[/3WURxy]$YT M>;²xx^W<#֗' û.uO.8|0IYQ:0ɉ1PPƄ2f 0 N a~{rЦyz-cC}vBn<T*8ߛbd#} C~~{"ϟa痹KNoꅝbaϾ8$=d&.b|1ӁrYS:ϰX놡HkuٰS X"f-5+Ml7jj9%ʋS>f*Ms@au^͏nIM&k$9+ӐZY`5jMb凶OMmvY~sxNн=RE鶶vV͍R>m %4hi9 gƑoURF\m*ap>/I+eu 1b1QJ{eg,-c5+ueJ* ~5: 7;ޯ8XmDY;5K@cZ,Lf޻H(82.F ;SOb;  ň-rWfi}`SJضh[gHz.\mâʧAZík@$5{s:cY,늭 w^ֆq&! qHfc!Ѡp0 Ð2#$/ d,ۆIN;pL9p7%%18`x^}|в)pzyC *5BA2a`nZ8?Inf9aQ6e .فYY9iځp4FY!s?{Zr/WxpHlOkEV@]k b0%A?v>H{Aڷ1`č9#*y Kr#YSNx~YhuJ يmr`k<ԻEY4`^*r&į,& #A¸&g1-JySS]&ٹȾLK>$ N:PB87}B%QйT Z 4AE m/$~4!k{"²[MVoލ :\\frE"w_=ĵ&oԄ~&>Žn®&wR"pz?7HiVLŅ 1^ v`XP2u9%6wR"=R@hkel,brgݲ4wlb6~6Y92f4c-2 C{Tg}y@Gpg-k-`=Q זÂ1CL7fdV] d U81&ᄎFd!@^y`wϸgltië ~㈥VimXU>hu3;xʄrHȃt8F\gcAIIɄ ( IDAT_}cY "/u7wdAnj1Qdْ $|5v=^W5l7gNI5:KݎcOhŝ]}b),cJ8L+eo |LSF{7Y9 iݸѱu@i'' [Зfc:eXsj)9JdzSbVљ-M8z!戓fHaq=RDag }_. JNoWTPK B@hA\,-uTkjů.Xm48,jk; U4,"Hmьn Ám˺.KYu+P}p#Q@.z^qb;o?T;@SƐwC3Ax{_pԑ$2G6-q`e ƱG`Gվac|=0Ie=.@wϾ 8>hu`cݺs3 '!oO`f XW_д-Yr0E:|-(%m Xeo[Ǵ' ߼9#5Nuͳ`;8 !h .Vzxq^c0XlBO Se #%)9Q5ܬEkl:vi9sY1@V (I)ϸ5!|YBKeʸ;<Ϩ:?ryRpl=7$]?k OǂaVXU GLcARyFSGQzM${ Y^Rb3W3k8ܭE"TM A:8,d \R-2N\MjzMj"řuzL a(bAyIߤuz ՝2g<6+,禷;/ Z6˶XOj9K@"QgE[ \ \5B,Rj7Qc-%V/*)Eda{&Y*E#ьY*V ں>т$vEqhx,a1[DQB.HcDs@,R|6o N=^q."!n%sCE p;[L}h 7MRx<p%dE~YJe˺"'iB"ᑱOJCDqgkAoY|8H)8!u)\È8zɌL{4^WͿVTPI;{ɔ ]r& c7mbY )BN}0Rht.Bj6˽-c]ӎ[Yh?W!"~#IyƩi@.AnTn-Kמٕ9!rJo3phƟ<@vm M9rj/`m|ı.Dתy0କ%vSG  #{$8_i1m5knUJ[̲l6{Y$C+ƼMٰ6we.I,M $ZRt}Y6Hn ޾=tq<ض*0q*Lc4Jh;#ӀqL8ǩ87m$ױHGDVVUwmdI*33~kw' }Hj3̭Ό êFf:*ڄfX׍vspYΌ;8zU;|?@Ő(3Uk}s qę Yfg?˜h؏?|5o[~ѳ5Oqb́7p'99qn7g0UO~NrQUtL6D?Ĕc8:C3$4\Y,0g(B:$ᢴ u@YW$%W6 NxExw_c_89<[= TμbvW1m5WZ6`qbVK U9{_Wx4n߾=pi9 n+^6c+m?~۸;>>+uR!}+ڱ^2RWˊ(WN\H2yI#a#5sEP׋\ o% Mj 'F ^'EB-E4܉&zR`,k"¸E6cIozth!5KPzwꩬϝ1k#&by g ʬz 8 Wk֪mJP[Akka%bb-ݫiC V*Wjʛ@ya13T(:)R,˂un %-SڋoR eF{(gwqnal5]^͂<Ӿ> G!G1 `={ kds qLVR^D+}b =Vaq/pƼB)cPgÓb20QM 㭵pQJɡP{MC'J|?f|ef#ŁJ>E0*i_AۍUMS~/PX3 hjŧ "mD`5K]09 Y7;BRu-xO]XȸPYI`],&1׊hb>}MK1w4A=g+c"HFo> ;`,zpWFY_&$# Zy<@:d@Ae!Y'a5mK ~8'"nhdLznv:2) Q*V%~: /ue~ϕMR¶MˈQNIx\JX#w䒑JכY kj@^k@fudAn"mzlXej5j$\RPkG)qY(A) % jG9hxܮ WmkDMse}pge-λ3%f֔p+Y530gTFv \ A\s> dp08͐gP珞~yybi|AZݟ7B;yhБ/%ig>;d;?g{cu=1c,'_?cZ!$$+cW Ƹ12j ;@/;׿|ĺ|݌v{GU+LNBW)iۄcbƁafWӸ&$?OBfA{*ifTOWZ `:\.0QZ q[$ -}Jj$֙GMD$MgҢileq]UN~ͧ ZS՘~5K;/8z}۶X+( n˂3V3jmޖe OЮ˯XJ=nu/[nZ~#AŬ{;jQEZwk)hjOˊ)%g\/7ZemXrF^g/`V g%A2X*yS#bxdּQ4E갴s,MIy'eehO\bͨ2%AmFiEI3iNM8RNu&tRC1_X'ZPv<|CHPv͐8&[G) V-Ly[ @[C)Ծr'H??!Pܮ\PKp,|rcľ^օXزѽY 챙zq ɭ/ޗl54GE=e5l[p]EV0 Z2DwUyi_W,@$'$^˳+ʒ.VK8ˌCcO?NS Z;<I, R!AOd$hvhqtWśҸ/Df87 SߛyŒ;ېUa<?BOO3OU0Z} =āo?i/YRsg- cq3#,}?,.GmD4\d|};:nD[GAYp=ہ_>^V3'?@!&7w7BZ9 {XL <,Jtat9 ǠPUC&'͵sٖ40fA5TL.#>,#ǐS൧BIpdH^v.$,0ʒPJ snhH)c^qGݱV}ÿb]_~˚Z Y+ nnlM^7z+N,rY,.* ֋) hu"pYe\zm?С%DPRFZkK/- 5'KdA&$jT8ցrYmww4HI1fQ2gDyEj-dQk@ט?;])Ft]խak <o;ܑ-L88#^/.QhIw>4~hӺ4^ 2T$YmuژLE2c: P-v,sb冦8[z96 懃uޮVLXh|À4xJJL5 MXAf?j䭋LX6cL 2P̓=%'bւ$K.$l{{b0k` KIa):/*)5])1Ŋwxt}h`VKY;wt\LcxܣUمk4Ww)eJƒI|4ʧ)_Ǡ G`_,v}wg-ļ@NQׇNXN HbUp`،Q[ $<] e09bgCS/f cJw77ӷxe +"[=52gL“wtl(0ns@ՍNL."pO^N.sK.MD5\I\3g'sp(bX,.%+ަ)ѪUvPk&Y}lK` &) 9p[ׂaVuYv˙a)%MI HXup&޻+7k^l|] n Drvmc.}q{J*%f,v0EZ+J,,WejiLF xo 8f1 [ꇆ+yM"pӼ/F3{oÐ/|E1@b eF|{}w%0Wajȅ ʒxTDXA D> 2@8 )KPۣb] ]#'\>ڌq.[ؼpqPUxY~k8:}hP ZMo{a74NUxL>DLk? e͠ޟ%*5{-3v~&7v's_s.HIpj0\F&L'P' ]z$\'Kb0}X!P@%ZܥaksY .kPIُ׷辸%hYJ~߰ղ$$f얰R0[i]. ׂ\ )ZJT;Z`.\5Vk  \\&3erE[mST,П2AKFaO>N {&hsb.ɭ"lGE1]3mJl2GautQ2[:[l/ju|M̽i >STЍgL}}5~ZþwO3e9b790Y9-.9a3KN؏G€Պs&ԝ h J.t|UfJ*ky^.j50ێ騄|rfe%I*Zr: L|=p!mNPJX K nNke6/~޿YXÔ #o8{c1L: Y:X ƚhy41zګ󦍼pZO-S>)r.׫I>?"@[G@ "* @.KAՆϭ ˺da&xye)xxϟ>^[Q޷mmYG(okrV`VĚE %YUQmdR% c 7;oa I%ɜ<|^t<$%&m[@Wt%\z3F+C_GYS yH2KkM ("e@)`X '8#|z׾zbxtg#ܒgB6ؘl8vyov6?!Uq6LCfŎ2yo2fnt{$qoGWP=adai񻢟=JANT&݉n, zș/Vx{;o8O麸ݖdDz?T_}kVh9ꊭ+޽h\}MdR4Fx*eTH> G9:\#a,kLNw EL%}-ɼLٛqwT!_[4,6\-K1mEY k1/(֦UQjMxpV}\ }QqY6슺,%DW<n+.?ݣTu'",%̪xlH(hKN^&,x{jñݞjso;zo;jV$2!4ƑK#bY"V=7gRt0f;{I˟m3Xs j`q/nBVX`Rɖ -b  +óH6)Y紮f`k#=[8fEHkLDV#H];h DR{)5˖b On{-iXhk}t1_Wai{V@ztˠ+KX :a*(,u:?:tp4*cFWѮ0e|)FK?zoHP0V@F7e{>w:8srz>eXsv;= .@;=cx<; 39AL^/C&q MO S(3A>escH)}xR8;##za6`LC٠&=pi%??ڮ$xy٭b|:{g;R__7O7ւQq4jL~y@tg-XS ߠaAf[4(Lx$u!A-_D~ĺǽdj3' ( 'A@+*^?K%Xzfߵ<%[\^RHJx{{v-8ջ|zG+Ь}x<l[CeUޮ Jڽ#u$O _+^xoeE}þ7ǁjmd)\xQXŲ ]?6H jGJ_O/ޠ¢h5;TXqe_c’h֕VLuf: w`I AڙQz2Zk^J`)SAxL$ U@c$C6fM FO3EOBzX|ZU30c[@mغ̥dHvXŨ$h|BTR˥KyI(EKiq+QŸ߱^Pf9m7{E*al*ƌX8# Y74 9zpmѤȈm7D: Ig[ߛ">Id!qP AV-0{kC#ase)m,bu87n+`f1 r׽y}@~G8dCn bqhƑ ={!X ] zx1(Ld)ƒb<6ab&ezbߣdlar~ԴHKyiSy;SfqME/ɬ%b1x&$ B`#+rO|┴> lqy1Q(8%HNw(_O;>z`k&9t^Py~=7wcKɜ'dwc/φFi*W|WtUb  QnR19?%Ĭh"IBo~c;>\|pAoS\ lYIBZ_q 1Њ2 #ӲSZ ]?ilzR:5.ۜ#4cX6{l~2ي<@sDYa_:5ޔ̺ݝ޺b{IOi܊*/(\SuabS<s/{ ,Z>|XLǏYo%ƞ,cl_U-4]nm07 ZZ5zg W,aӠeXRg-yiCQ]mmMy ":2ZRAP+h' F"`~{.{c }Бo!rg D= "Q,7[B BCd{O|z:ӲS&%qyNGw3cL؄ $ ֔k\G< aP~LzZ1翥`"0H ߽7X낗Y_ƒEB4-|ׯN\"4Ӳر#knG"<['"$>bdO{6i*,0e3o[~Nt `Y,*Ӕ 4"?bg)5?:eL\zab?}KI#}Y='yًlt.k1 H%yB\??zGa&2`Pk 7L<5ģ TTN( 0c9gn#6h}`L8xXDxS7٭}xO"``܋qR *f2xwpfЩw传urbD"7Vɯ& qZ V2!D\w# K||^;Լ#fq˩vEJrˏNnyƮ\ -oV-KhJ鈷Գ{.k8ab>fcVzƙp/"CHOIE,?ok'4KpbEęn/\2ڹ)'X{˚G6fN@m Ubl1Q+u:o g*r12?(݀d][SKQK>HՏ][޸a&r1 G va3Q&2 5C"Pd}{YLLEphHŁxuԍvcV"KcֹHgAHBLGGG 0CΔ^̤Au^g3\^Q`2^w1Nmܳi}Cq 3x^<~*{Ò\¯oGx b$ŠDaBLj%9YEq+TJ"¬3 x)>͗&L5%ʀ|V0~Ι\RJԍ 6!V2M@HcaΦl3'loYA"ȣČ5gEvIozY@EiATfYb3[[2kA:Œgd->1]s@eO :raQLZwzrRX|N}?B lq^<[a}%c-Z|CJ)fέmMvZdѕ rIi{^:j7\ZyCXs>~ :g_YF|Q2xXyt(Lk "P8NI#;?{9&˒dЈ/p TVZM6IxrujQ | >GZ11y5&L)F7)dJ} &t.;1h!lI-SňJ(7w}vGNSM\)&sAʂ4#cImӷ>>= :ϓ?$2|j>`%猢At1 TZ, ~%SL":t ;bLeL UY6GYN V3@SAf7FȆA93Bbb0 adA +s)NCL7O￿S3C8WaIc4d\eߑ0@]"vi_}ח cl:7Z:8ѥ JSd.փ1n9 {B qj=_"ƞ YC{br^bju`bj:0@YܬlIDhL[4 r)ǁcXn 4[Y^z3ɬ ԭbqiv8b.KX'ΠmUs>] J2 "'/ IDAT{5@j)^ \V)W@!!, 9 5b=?SHjKe]p<*jk0눁],lmj8Rm(1^|[-FS7dXsB<q"wbYs.,p $#jfgv6=\R p Y! YڭǺYx3=gq߾?xX׌7+ǵ~.*M|ƎHJHpdVQZZ/;,L^%"ѹfXtZ$ffV$-%Moɧ˸8HU hqv}. U J:gֱeqûF9"u#nb] 9ZS q՟|8hג@y&`~V` Q uӸ0ytyO۸6 A" x,b, t><ɞzZ^ xL7 lgn=5RI8ASYbFĆ5Ϸ+.p$mQO3zu0Y?vYv@`Uww~,dll-I;6`X`|#%W`ohJF r!JTQ.PG4qѥ`L$C/3x꼵LN:.(kl~C QQgAHT h1^LΚnO"_>[z` 4z@W_4M,R(Pˀ Э';^ b`&[f"TZ;ZkH)Aea\hvZ,JjRW7<m l QD)MC򴬐f"M=:ҒoX.BJZ5w eQ!$P/Z3m ǒ!h5a`ؾ[ѢRZo 5dRda]3֒q[;uA"+3yZK,ֱ.ź"Z ^(v+X׌߾]6>V حpR%DՆg ;ÊssgIRl,y94Οb[.9Bu|lV|PXRN+|ζi×̊ 1(LIĤ;n,檵3I0 ʚ-@uzf}G3&/ 0B"(uwr4Ps7i8M=gva$n} JA$DW7:@D9:r!k>KWuJsn%hpqyxĢ!](0A9{.<{~Tw?} w3,vLh-M=Kcy3=79f.y*WŕK ?x4(cZAqb~j2朦ň+Jk F1% At#;og|~Ǐ( SClxvr2n"!)m;JOWhW|-t79aNh{Yk_pZd5\;MPL5d0ZrpA@Fδ3%Q%hd_7x|sǺ\$k%I2|.I&FBYGEk S#/Kz$jOtnA-YŦpa1H.(*f^F%YD[K25 Ҁe&w|~2p]OOoaɣ_$h ZK9Gl)2G|ǁuIn]vWՠ3 e/O$ QԽG䄒r)Ej4j,a'J_k:Rh]I &=䵩v.fD.4t3dn;~~%_$4Q )#*NtN 0! 0[gȮXi8L;AORo!t@IuZ2΋O!1cQ43u$O|ݴߎ^0֝< 1ɘ ޴b.}owwR jc\! ksV\ 2tx<TUk,M"eZ,Vh2:H)AH/\.޽*by<`P`g\{(z)|z)v`)wu"MGzέglɋ WGɕ%g/z¾7U+d5~X dcK@q{ZLtyYWdd0-[zMuPH0aq};Һ)/gݘKZ}!e KCqƹ6oi[praLMQo?xx%|-+^jĖ@uY\xHvI 3nլ`#eP1l8/bN?]W6mn=@r0H\!PRRS,rr^,[Ѡ#GV{ & PB?tIX1]ȃx;(ѕu6~NfvHy0E<sb`F8 a;L|΢ =#0soZވ hӾЙ~ZwQ"v%nlm{~t~ohwHd} O"S?.] 3Lt]lVwt8;l)%bJ)y,3s5 ;H8 HA|―ĭl P[g;uRԂ@ -`֊+S#k ^bXTɃΠfI G/F[.PH½A n j0Xv #F̓;<uKFNck <|xZKNxz~2޿t( VL#y4`\Jz9^3[~J )/|}CrYp;oV6Wlzۛç'@zXe& Shxfd}M-pe>8c` &){Of ò-9 1lf1[k(7XݿQ$<zZB7t΂q@B@!zjgpBY 4#vl2@?L.͂gkFIMVѕL`e~{>H0uAJN )@ 8Lt?LoCB\Nw@Z|iL!@xApN\Qw$bM*"uН e-}mhF8zwrDO ]W+.3?ZdZ`(!1(F](a!i 0M3fb["08-@Ѐo³xlAmaB 3"jA $+2Njea5hbs?2Џ\̽KBRA1%EK3) ZhAR25hZoXɦgMa5H82t5iPX V֎%#)ێw,EWܮ ڇRs߻Z6jvqͫ3+nY͓hjűW{^͊ MuY??_zS\JH8 [o Kn9@q i0O:εgd$Ap ןB=S e `hxs)nV*\PN(lfj=i/KvŇ;-N;R ! x= K>2Ұr0`G>i;|eOM"Y ٳ8I}0TxىO~wʔLA8$1iW-[ym 8]XvIǚ%8!xl#1"*EҒ|齬<0,O>2GO2\txvۆu1?kZKH:gwV`z\( c >WȺO3}'#M-Ѱ2Aۣta|I:xa.`qP24!ﻊ$u%5r ɐp qo=UXc~b wi}˷{hj"Q3_NFXr~q` jAH2lejg=_Wo.-%c ᒋ~:֮- : Y% BˊY}֜=H.[mM 8@p)ù[P/OщwK%t{ & 5{@a;G1Mm?uq$APh Ljż̀(cʔY Vzl,mZsMdž Z^euo6S)5R XWbleN:2 ca*.4M(8[# eHK8W N8#cSI S5PлwT윽JxNqn~C!h :^;@D U˰a%#q##0V蠌 x@s( hߛw  Rqɒt0!`=*EpnxyսO N# 3Hc+_٭xyz#T<}%~5iJDu%uHw89&)DϽM%?$8o8*N0|.nC14>K;݋Iۀ[=^>ܶ22pr\ Ad(K$xU.!3hq{mpx$ d?Qڎ1p SSʇ{؄coc5mX8Z$_A$C>Lo&Qrȱt<_{a`"`._8j׎DN/ 8Dl{$Dӂ{B*IO%4As<;М/Ij!~uhRTcP}{G&6.c+6ȇyq.,yQMPLUp9/x@wa/A)\! 9adn'NJHN%Wt /ӂf~h-ڱf IDAT+"̽YI>y&!+:u0UA 祠O{oxYXZ, qP;lE[۝(vrH[<{*fO_gmC WD,}W+p߱ޒ,"O A_I#˶uDs=EܥdmݣTTqZ ދuJz._5Ҷ+deWǥsŶjȐ.n ZZSA%ye`R+$f5 HASs. vWQPՓBmY{`̝lҲ׷-3`&n1v3TnNXf\fLKn,nt:b@Kzo#p+!tA jXwɖgLC)b)kϰ73I84,l:I< QdCv8bPu EB(^>f[ux5\KPXaR v(tּK%]ӄòBYxd!qQJr]F޷3հx F1hzL89ۊx Ҝ@!y^o gy'hٍ@=N!C*2:RդWb iq 9:2M\&yl\H+ :UmKD,&̪fLW%{X*n zm]{낽b'e1lk;os՛uG6sb0[l_78^J{}_pDRi)XAL\|YB Xx'B!'Ò,d0//8z=Ə e( 44ĸ ؉+2"<91|qK:s94Uj5 1QsIh$aQXy})AUEb: <אTvpY v؂^ԴٺuW@w|}:tU&4"F!t8/fX]薱=tkœЙꐁ,9.q! @HO1~Xhls=zZ-Xİ- i+ss ԇ&εab)rHmk3We~~:Z9PAF?h%aD{ܐH4Af}'j91`֛le3nKO[ZjjꙸYSsĶZյmN1ƢL a`,'ek]rrk&eKi,9*fx/<_^sY+LbVu|m 炰j55eCUTf΀}KanfUa Nn}DԂ)%Ȅ0R˗׋׆7 ضffV NYJ,˄˗Or>DaSN1J)MFV=~ )$Pz68mc U*ܔ? sT΁ `b JO 0_\BΩ#7wejV6ڇ!gws8QLy.I\!nv\*xF<<&_G[l:LjXQ>)gGw{Pn\R1MSykj)WiaE Wit}DԊXL[ߣZ%po owJ!:.XZ47rܴz8K~Ǖd>ItmJ|x8Wt悷{ %F $ܢ##7mG78O<#"hf 6oD'ݤ!F" &$׆j tp4j7.j,s (0ZyQ:橆mar7rk݋";>ukfAq]^DJHX9 H[czwVʥ+R -bm& ,өT2u[gMߟ-t0;Z.nt{Fu[Sj)X7fY'Lq+a يN{^q.i&n]m{%xGj-ʪTio&a"Ì?*.]4uYBԂeuEW4]|6t|b |zZ n ye xu_1M{iWA&9IpLGg0]$՘xRc nJ %fxHX\>;B 5e nx kw( ZYh> ³<9+n ]-伽e@On9x {e8t!9$%TK"œ#$=f6cTrO*-#"!|nD3 4OmDŤ>_㳨21nE5pE^h_LG( 1{k)"Ę o |HJ^a M3`dQXZXp/o;ޮ[R@1a7M8ó#|N&1cXJ^;S5x9O[}ut"х{fSjW i0/ yEb%)!i#K:-n㺔ܼ nY*[ }ZW(^Ö4л>84 $#L7ԁH(>!k55FkX]@Xw䋔I5m"=&Ȏ'y ;$xQ[d4φ?Ǘutu 0Ο]Fb=^ҽw>bz G { X,t 4^+)ӬL?[˘s˭OlUڮDO~׍G:4 Sݜ7x5񻄔aܔy m(o̹G}(r'OO,= TbxW!)G<`!6r ?S&c8xLk$݌l+TFە'Cǟo8x+ pV5F$bLOҰRGaY ^o 匧Ox[(p˒p JO+_@/iA,^$ֻC#wlXp(.Qx\gd)cE)1Yޡz 5܂cl~oy(]'@f2PّV&N̴bD]P,mur14aۻ%FQPF_a?FLөӄ(cڀZloi2)SPq:M{\eYsw\g/UWkֶBz_Sw@nt?s,pmne1SP%dtw3u8[-@2yY,&S[ݷXl[G=ԕ3Kp}o;z ,E7E_l@e׮8WKukDXE 3Vjh" H$Xec3 2f4chB|~VE%J4Uv1Bho7vp?biko?|dt(v)uغuiؙ:sNg^ ĢO8|k*k~? &ڧiZ24.:#0{+xm>S=#FPqǂ70{~Ps3L*/YڭFk4$p~㶇mڿȎ߷};\F y$U2&i k[)6@kH+ǗQc[l&LE ^׵r E"Dœ"^2egX!{"~Y! RK&zĸy[M )4K1jS*+麴VgYdV5Tβ GW]0֭GͮXo uW^{.Ҫ^ڶ#0iFVm" Gk}4rК7,susRXix}s~P{.?M'[64R ob ْCUinhv5 FؾW=[];p:/Zr܍ѽ IeMe:0|mź6ܮ;_] ̲[3D,sݲ{ w&bZx;_ 0Wlt_ g"K5gm:(.w%9X*D 4v{$3OeM1P<(ψQ" ("*TXyOu#w @*kW V9 "`XxA".@ſ !:̉8,;L}~x_Ưa$1|Ebs;! BLd(dPlqV4~!;kF@_7v+׌7{8 pmGHg ,+HGTv9/ߓ27?`f|ܐx?$3ιx&] eqf Ʊ0Hh/<=uPpͳ RhT +*1Bw-+H)X`9[!$㢓aQ8f;,=(jL.*aVj͸u\3E.Ǚ3Z6/;}ݺug(f1+^kh`nwcMXc۬ {g3ɀU<]fRv v84լkbqTrp˗3Χ{f3mÌmk!8NaŴj,RYzDk?oküT<'lh f4WhD@Ez_eoXofwˆۭ}ö)?}v255k%%Ynfnr`$vEH8-훵݃ Jjn98MYDuڗ̒QRt $h&^" D0YN"掸.`\+stP*1 kO?^ٹt@i ⣈{g'fY ͗^^q/l]w7? ܍w'B4(acwy6ySib-nZFp1-p8a\qvALrFl{DS{+uely7?E5,^>ce~ݒW(5 9h cx5#kao_. 7ӹvh6aFj_0xM}ΕqkltXض8X"+hZ.IHEe-ZK0 )Ah)UJGbLƭ\1.^d@1-6>ְݭ+fACgoqG!k+cuuawL_7Heh&R7M:NfYA=6Uq5k×O ޛ^{ũ\ͩ+Ns͢t+׌ ic2mE3LCIVӺ;{Po+r:5PawLA[Qcp&m$[XC0?ka5y 2EAtTJ!gһ.36t%umY;qF̬S=DG,C24ChK/yzP a"){1 3EdI /Z {{0Ώ80}>7 cœЇ=%blun8c臗{#x0'<6oy#*(=sT q}]--:`i_ߡjXC=`ߚr| 0gH];`]W<\(펾5|z:9{{tmkï~Fq~+~)jO3n :>?]p<`v| '{o1@ ;{ ei$I߷TJY"I,wϟX} 2R(+{ Lx#Gi 5fcQFywa0ppo lل <,F2Ew

LQtx,DH\6̂mHL+ׇv|@E.bYmn1l਷nU؆;j{^ֽ`5^0cuߧl*ڴ< Z;pSž+2]q^*N)b]n=>y&43"4`Oa=IEIanQ#Ttvr ͡r[S?s0+@:s\eRFyYKE/^@pgB;ky3?`RkSr$ qokR+|RnAp|?,Us}I~@øhp9X#b28^ŷT\'zeBn/J1w<}~_~{}G{_.owd ^ox|\]qZrv Re>?qO3㩧ۊ/_rf<ag|zz ` +ur?^#U,3eCj0qIgRtLd\-X9늿o?`Z4E33B#U;=Lz<,` {يk!v\f_lܵt,.XV^,J޷Clg ~33GA@dq-5Lhd)=T ubq-E뎮֞2Փ7 '1.!Zy1C?W Ae+h[Hz({ tY(x`"^7 6]i*,^ xZ95WR+Uwަ!ZĕSxHx%RHo6JH8a9'F٠ }4@I~H>!pyK%NmR"5I7J8_k _~y? ]q9/]7lլ EӆZn,zkx}b~Wd]S[z2uݽ[v SrztǾ[8ԂeYD03i6 Űetl`p"Π׭Â{t /?-yf#XoxB#Tg<,1c6BfO{4;E\hyY Xi-\  N&v3޻StH= bB;ځ;cN`L>"˘ZXzPP6ȵ忶g`ֹ'+g5 ADDbYqpu6 bc&P.nQ7-Ae/gUϞ.Q6[ifu=T<u1?{:mvv|6vtV wuV[0/%ZKV;jLU"sl^rLD| VaҐ[Hlq/vuk5uh@"O9q:` %K܈[tiC h$XEk{!a|VJ[  PXzxT.]9!RT]qn^Tv<7w̧dvp:-6po ۊe7l}|:֊mi劇2r 4ULSŶ+xpy9A~^ŀ$0>vdYnH$^<~ f PhCEFpp99jCh]1HLްhZ 0V(("8/3/~xGkVom.@fv4\(S]VÁ86qqcr51JupA-J#ݲr`#ehτ ʈy[5>(6w+{[1[VKx\{~QbФ"U7khVkC< Yp}o L5 XpX {*3g ( }>>O@%7Tb⢊~Ku[{ްE}]bYlnU-\z-݃ xof)_>[,KouV\]qsooMoN]FWpV][{vD 3R\55IA ~HfQF 0C5G~sd!|=a >ieȔ8ȼDqk rX1iApT GK;ɭevx&V2!:SYz[>WV_Wf!u3-@g7;Nu|XgvM%XFֶnly {yzKNCЌZFZi; {Q7q(!uL{xx: ڞi$pP"RSS0sːR;|\KR>2|>s]OJ 9=($GDʖAI2l}c:pb]f/{./nVqO}-.i"ѩ zJ$uCy–lYjf:ep:aJ%.iW`]<>رH\9y!E##mpZGOFdx]&?j\:@`ѝbuZk"Vo+uE-.Zk.术$cA$I#M c, iƌfԁx2t,@1PB+kAnT[\ZX(nVY^v=ydxLiS˳D[qr.7Y)HoY#`M a'?'Bٽ+ɓ׆t}3kխ*oXe- LJk3`m7nVRݴEnUٻ=Zyn骯5P.u(} ^,ȾקD&z݈Y'&ML('T"L(4k8W su1Tt5kOǵְ1\'py:p'P9YYN%c5ᾒ6ϲh)ܖŭnRd XHZ"q؃cq|t-sUyjpe5v{ ŌqL$ˮ9m]\腿q.qk~t'W֊ΝJ,I*ĶEGo^LFB%&yQ%q G<#>iocǽ/YjӲLi*`ֲA.`Ԝl`U1Ш΃Xգw`LV zS-,9S ޸ EZ_64"'wNG}ょeuqe)!NۚZ$X<EJ@2, c\W1ke h(zW컙jO˄yAu 7 ]Q"` @d`qZ1EQ&7n_L) 0n9J k]/}$ Eú u}3z((#b>ҁL81T{ݫrX_ >$(‰Sg/%c"d²LVe`ݭG3y'lu)rT**i,dʧyrcE<^ﬤ/A SN_{w^{Gޛ :n?/nkp8L*>4&phB C9($LSCPj]ltWOݶ/`[IDATju}j-߷؏{½taՙ1-a;Z4u,2]t6W+lmkԳ4:bu7瀯f!^KɳɶOPQ~b+ KKdAkzina8k+b IN:Nٳ-|(& 7ɘ 5. nq>Xĭg.L,BZM,E]MAy,6E=lءj2BX8Ÿ<oDtXO9Ҁ?~漁r4f{7Q "ƞlDBF!4a@b1!#P>z"Jo2]X] #(oqc1Px]@3o4:_z 2QuXƻx97d:V˨734:4y+bmḘ9!+ ʱ_1״AR`֠Ni,ƮY0NeW=̥T@S=t~jeKլ)w4D gT 5F9xᚯ[.As{L_s Es;6b;s5fakRˣ@Zf`.WQX2p?p`IddD?%~,bfI/L QيZÝw辠E:E,nOҧ'1~E%'Ҳx8>#ynr3%Dllh kBq>{s0qO1IH~[rk^vi\3)[Цiķkxֵ 4bm,vOrmyTuO"d pGjZpgAX G/_(^dnI k84)Wg>伾h OFv?ei\ ޮ[ZqQ oIl=6 48ɏZtp#`Ϻ;fn{Zj5Ud ޞvv2Mb[7/+ps7f Twsֈ4-9([عWW`-C֠j(nޚɬE׳`"4O YmvgAxXJqpF.SŨ+KmF0^E,Zdm5Υk~"tMZ^V[xօpڝzX&nƛ xqW >mIB!|əѺFF.إ$@+9vXKn8Y7 ?QIeo׎I>Caق4]wK*UplrW@IC+8*` hj^n 篮u|@q=wFb{0F_룉{279*Op .>9ڭ{JGhBMHGk 2"?D~$ Ja d! ;pV(4$!_G<kP> T TY]b%{g+-*K_̄iV҅}WXn?gj,q(\=(9r  I}$loχřmֹD (R<^H1goO4@Z#mF[iJ0.+ǖ4RMY$ ~8WAYJnZdtZ]iS|5^|c]xĬ+JkW1%${]]x*`[cb`au WmkM~θݟ[ 4~CʠaX%M9~K>UjUN >{ |fGdB|2y\C`S X\QTx`䵣E܉%jY>q3:B}X^0cz@clUP 8s:v1N.0A>$)<-E4O q2.Ç2ua,\{DLԎ} y8k&yMU6؛Vm1Seie?A`ŒLn[Q4<laK)XM+69=q-k`ĺ6y6 ^S$ΥbC;xYe9ne?E@rzL2ڦ _u^9cA("RU!U.d8lsccБ hZ7jǙeSeTE;ƵJFW6ɓH 绖iՇO+R 8}9"*紉S~bE0;{a3kWq(jqj&?O9eNŰe{TRQĘ*uaLj!fGW~?Ah]T3")%㉚C3῔ܙ /-S%h26tϷ0+\ J/pdZ8S:*9EƦT2 [JK!@)ֶ/h:&u,7,r~(G,&HJ"{D vZ(wBY*(C2y4ޏ;"5:8Yzg0j |sqZΒ?h lژW7}VUGd fYSCNxCDn菌['^.h 2'5my 5\!2Kg%|l[ݹcz~{obh)>y~L Q t1U]g}T 1&?dca"e{ٝI g0{%`Єɚ(:+sZ`#ȐqB8r.،;meD' Q13'[J^cfȚ\e.O9}n-4{/~afG.m>y<pw|M 0sYs"6qF3%916 (7oo-3OV~`byA5p__!"N IENDB`sdl/config.c000664 001750 001750 00000003644 12702465756 014122 0ustar00sergiosergio000000 000000 #include "osd.h" t_config config; void set_config_defaults(void) { int i; /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 1; config.filter = 1; config.low_freq = 200; config.high_freq = 8000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.dac_bits = 14; config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ config.mono = 0; /* system options */ config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */ config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */ config.vdp_mode = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.master_clock = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.ntsc = 0; config.lcd = 0; /* 0.8 fixed point */ /* display options */ config.overscan = 0; /* 3 = all borders (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */ config.gg_extra = 0; /* 1 = show extended Game Gear screen (256x192) */ config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ /* controllers options */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD; config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; for (i=0;i!D0Ɩ{I !D!(1o^ 9XGe2:: }B1:t_/^?VjĝVOu:'fx^4BG$rI}PD"066+MӠZBR߻|2|Wpms|gP]پ|BiO?TUB!ӟby)Ed:B&&&ZY8mOX=44!طoݻB?zMvDQ_ BPhKP'NX?&}f>(䥗^_~EW6<EDQEQ %ŋ'|/_ͶӧOk@޽ =Ϧh #kmf'a92ׯLP(XHfff,mke^4B;3DQ$!/~AŢ&Sܒ$DQjoԎ~cF,y.$ gϞv:>kzCh6,dY[eS" :Ȳl*&&/veRh&[N~ayyժLܘŮ~'"d2\^m[ ; L&C]FL" -f NBjKkkk-D<׿[HZuE\.hdʊ-jtﳓF!tU~cccg( Y\\a)_tv_tD H. - DH4txz_###-?4Mvf.)h|l[;w BB?~B t# B@2jᰐ=YۮNVfTaR)O~b^mnQi}u%5_$N$ɾQ>n$ dYn;C0Hd1O詩)B Z'Lro<;m?,M+5|2L <<<54 +++077R7prr H?~heEi=7ɲ ?Og#8q1:+!8p-G{5Ryf(cuc}iż!8z=S@Jr/[yBg^LN cb$Ԯ}VW^ͳnbXy8"[+ 4eCQ*AbM]K)6lՎ=ozWcɄվXt:ݰӪLj#Ip$L&kEr!U@5 `;tOa8}ca˥/x'e }Ux7^VFg:!t|vA'BJS^{5[ݖځ,dffFmV~~-X'+%YK/TWGB `v3j9(A#[z1(+lJt}go?NL6K3)P0B,3Mӯ*(dyyٱAo :X;=X> V 96mnQ?JOxnSԼ֫s wz*M,O[ ]| l:1B"wQ_9c[hgJ(H4ȳၾ?yd2=xDnzllדy-?eRHDN<ɥ|731[o娷iMaVzh4.NXh,SO=FȏLR q)lyg+C&8{X]3D5 2~A8U;x8p*G}al$ y2lY_O?m*{W^p4w7A\(40}(ү0pQ=Mn)p8y7("1R1e$Imx [?VAO(̘aH$ǏRDWsBD@$tV)x1+W@TNСCO$I:V*=yN;a}eokxP?kE]#@Q8v[bk,#DBhpn6)x(vDQ( +/oAzVlUUf"7h1ư e%!qFp1V+ ^׌?z(WC)pY(m;Zajj!dz֘m1DQ$d-]ֵ̔or}|߾} ^'k: x5z\" )-SnvRZ}f޳gO*ahhݚ4 ޽,''JO6T*pc1ER(y$A<o0=P,8R?яRR>~1d~~^f$s=v)C>oӎLp/+ӭV5fﱯ777P*/tWR8!,066=XCUǡ{@f[$N@;Ν;mzۻwo~g͛7} Ģ( k0==m"o>i={Lh'=rxxXdY&F AX,M꙳b(EXXX 333FAQF0??o6~z/DB4M&SFEO___B@"i=) /f ܹsZ.-ʠl$@$X,12mDӴkCG}R̼|bh}>O?Od2|PgOc4 ,h&e+u0;; $N[ڽn~ gZ͸/ |e= l{)B:#Z-ٿϝ;0==-E|>/ cccp)(JM2A>#> {7ԗFS 0ǙAvꅗs&xz}ҹw}]zî~rY D>gZTu;)5/c\.  , |N:BPhpWG‹/P,~Uܓqu[aXխluH$O4q4M1r-WU V;;c#?W@׎1gdKH^x*{1'ek*1SvY{7Jdf'Ndm<*iEDyכd݇fNRlUvKM;glr[Pn޼ɥ\znXCaT R@c ipɓ _ lǔݎ@cY1^r\7vő&sVӿy j.+fuld|DQ$TC)Jp)f\fnRuL9N+?nw b1˺afbfp&! @UUxW|ǷWxJMDQL&t|7k5H1@=l;dIMcx333P=36C*h4mMp(R)=}~Rvc7ݯMpv8ܾMKNa6-}ŋce~߂(@6h][[ӭ n-Bd!G&۟$Id2 hrG(̰T@!R?FUU= DH=>puwP۷Ν; *ٳ>Liw5Mj J!~_鮧7nГBh&0;;`U1DQx饗G^^kvmrrR~^EQ 2[eB(VC큏zy͛7;nE$<3-SuFj ۅM1٬3@TZ4h^];,{98qyk{wyM Rm!KDx)Y1^p~Mʕ+:$%KuP*gylC6{cɲ ?O516KUUc}) A$_*Jµ9r:9Heϳ x0W'od܌X`4Mfgg r劾VXTޭG1i䤐J|DT@<"K(6@{PUUώ^Tw yQ~,ӊB {7&ng0սJ!ï2[5uBP($J !Y٣]#ʙ}u4M( P( eVDh٬~:/{CL l{sssq<:Mݷo֯*Ϛ T￯OJ{%Ip9qnߺ1!BduuUeE{?N,P'' Bz!Y8+0244ĥ2y=0ZipĉlкX7ޫD< FTYكUtua|k{l777r9$ۢ:T.1Cqs}}];pwE"u W;[fMI8.BAZc*a 5jYW=\Vd_H?uk2`r,LLL4y:YH$B!I.f}z}}]Z^V@Jk[ggn71qk'VeeaaaӈnZV{RfϾ]{bXSZk#̓;ÏW 1GMӄaаRv0SdG}cXA$e]-L6JU~P2LSЮU*AEX^^x{ jh25@( N3JMMӄ[nI۷oNZ+++L&Ԅ՝ٸjT@ƕ]ʌYB&v뮐uؼhn+%\ʮǐp-c,ܺuKokY6>^D߼yt: Du^okXɖ&j B({$IY,ǍV n{xX/~ˌʻ pB{H"$Ibg/Ȏ9 !Dǽ՝bbkk)+"r9(JSZs;wn/mhhq c!sw7VygOj!87wWmH@Xwx0@>Q!Ɔn*Gr_Qs"zeTU*J=3 DQl$ܚm=b1XYYY;w덴ZիW]-#&׽Wc{@VD8 Hӄ沸1$I"t :5 5(w6Q!Nß'8}tը 45{ ʕ+:(lnnB:nhi3vQ^A:figڙ hVO$\.$N7Z 7}߶P(+h4b _|Aq_mD~Gb]!d8>\ c_!CCCz9/z\}x/~ 266 ᵷWmU, 2D"㰵| oP(BHStbN^-xRԔ ͛7Pibjv\,eºR̘E^KlnbS$,˺Zꃩ%{ 7K1UZvu 2$Iu[4j-WUUU4QvvP(PfffիM`ss|w h@UDt: h\)/T޿.VfP (Ի;ɲ쫾*WOZub((xmr*РZ5ss}8DQP(6H:E~򓟀S%oxm#4q[ﺡ!ji3Qf61ưB4mW6l1r9]ж044jnݺ#7n܀7o2;!ϜiV*rEVp1kp?ƳxjyL?hqɏO?$ 7í,ڙ;vߎ|>:BDȼE(ɲL^~].;+NS_-x*_5pf]n<\k:tVEfDo9 U f{VG/^x֑N)qʕ+P,CT(V3a_k[[[\7b'}͸q"xJ?Ɋ1nH nܸWي .JݶbI+<;CRo[UmQxo{1uss677=(g}}]HRHЊr ---s皾k#4W>oݴeKYJ Ν3g΀Q׃_}݄ ʶbس mlֳw !DucWT7^^VrRSvm|(45J>Ξ==bK0p=s=!krx. lv 6  YN=(ya\)cVfVUU1ӎP|^8q%1ܽ{k1\P(S7c.ǯ;wI )@1h~^ϟ[< Vy=?+c[0i={i?ұj4UU&&&<>Š (FBM ^Lnoփ_UUV?;?TJhՎxqY՟ȌY10099 |cdRhÊ\. 'Ojd*JaoF"0G`"=AXSNA\nh;'Qlx]dY:PꫯB*Xs큻Rdz +310f{~!LLL9= o͛e8uZ{R@X0\4ϠWb묛`W;X8s挾Is W4Mk2Ԉ1y6Jد!X__SN4gr,LNN P(:>UyveT*ly?b1$ nݺЕ+ޏxwvG=^ejgTٳz!PV5(x1ܾ}ܹ7nܠy ڰ x^SJÀYGm>;ӣK._p¡_^7صaLwvyn7.V{gӯ~7G!|b:ݜ#=g.^'h'׺Yn^ ( kGH`E6z$P@ o%Ю@)u@v3``66A#pMr.EO/s@А-ve^*o;EQ{Ǐ4ѫipر`Rp8Lb#lܷoݻP.Zz҃6]&}6ܼynܸєh!{ۮ($I$C,1Q>evE,,,H!xgoMkVщe6&5Wݸq&''JH$kؖM&&&::mxu;˜#^SVIV3M666r$X,FE!{[+ dggA!ڵk$LLqnBڵkVy}ʼT?!LE $P@] ;;;/ DhVw<ox.]DhAwDQ$׮]잺$ڞ,dccVv-$P@]377g9\\b1@;$IjӕV2e2"˲#uۯ H$߿7%P@HA>C{=u(_WH& u("ϟD"P7݀z\%Ir`49uzLbNU|3w|p8&kkkg[Uݘ&Hx=r:VdnnB髋~c{{}J?ؿK.No( vZó7[x"Z[[U; Kj3=$B4|MUIRN{:KE5D"]ש(֭[c5eJ=rk*Y-=ul%$XuMjG G6`vEQښ5:;jdnnc qR.ZO. v PdV$LQ*"YɥK<78I/ W* Bu"PL}$P@]ǽn\`[\Nt}Cz" A&IXeД$I.>H<0̸,w؍9~xSO?ѯqj^(Yk7$Ɇ.NJt /HgdS vi8Pi(077-*ی7ؘti߬BZ(GE˸qlk}mvqh4 X;v  zQ~͔}S*2hxNO^ LW0B*߳E!/?akkTwBa] B4Mm󰵵 7jM$mX=6w+H k"HDhVjJ:X\\Zt_dL=GQ",{zg{{BDEZSn Lp V@= b0өCgbhw,'O,] ͒JҰ ڻwke\,!j5s}o޼ cE;+Mc w1ZXVwC*|>́*UX]]EQLMM(A0]H~MF6Z=r Lz-1j: V_nAc0U\7Y( C]f31`hW^mx޽{cؿ?9r=_!׿5Eˍtq?SSS n}۷;[\T*BRSN /eb4=wBd||LV 0== N'NP*fLNN{Ύe&O6\(!! kxz5v 3"zИ+ z IH"h-;SCz t{X^vZ!K^}af֞g&&&yJafx*$<3[_~߫ʻ-$Ip86zqf(,dYnB們ӎL{r^y(˦YRI%nrڴ!"a?XS^{T<=oiw>$I@q@A8|>/(BabbёT.\Tʵc BVެb$UUI=6|Ν;1/ĥCCC8@>wz*P3'7| <Q!HO<o6YZZ2MNj^MH5hKӉ EQВ&|hX:J)/XժZt?$5Z]IZiG,8G`i&,,,p ÀmWU=;lmmvm3x:}.?.NEMWTa mVx<\⋦L^O hrEhرc{<258|M fr5Z]]r`Vp}X\\89'P@$q1;ωuxL@u 3k,TUVVV4k6-H;JS7fJEp9Ж͖Z9Le:iм4slr@ uNzW`;w\iмXx1nHüߓIΘ= B),ːNxfSg@&6@`pTU VAm0677FT*™3gLP:LBJLWB PJVG1 {Vˌ VOIDATp̙jVe!ts3\{0 HW/i㐥\. / !x뭷   6 .&09CP" /zE~_s\k:J27o޴]:*9s_R4, ;EhA`7( ֔UTia~~OzffF &P@}:V@StҮLYTJxX,fC$ yC Az`7x;{qG}w`?`̮ RI8qℐN;yE"x뭷  .;; *c'N*X3g}3ws8oĦA{Bq1v}y\&''V&L 'Olz?Ovl0?EQJDx`q0_ZZN8B+xO#~BR,.(w|,zBVEԩS0;;g\ylXCp*!@@?p8 ǏV>M j2eYIM?e}]jT*TUr@W7LUUa6k&R)"IqW& 766hYB`:IhIlk0>>bq`~(a>sBa]c,R)4$!A& s玣v}ۇ~{ev 3k)\ϜYZZ \.s)'!Cpؕ&4m1{8099Q,A4& M`jj B1*v+!v/}?Ʋ;BW_ L" rs1RwOOz+xi(8b].JgZ=7*P,//s7%nmmx*V nܸ$I?(1f0tZ3)w &P@=Hnr)B]4MJxwh4 +++3VB!ryEtT*35b)&  A.?( 13vL돷*7PGqH{=Ek,areÌX,+++)8ͪ{h?xg>@ATݖ1ƻf@ ð ^V@Y{&/"v FFF6T Bü£nmm5 R/8A8( d2dmmͳA/Xs[e7CA" ԛ= 2W-JOzN#d!i:0Oc,y"%h4JꁔDE"$H$BI.^f`!5pm"+9$Xߊ"Od2I5GQ+H1殁@wK.#s4Mw&T* I8 vfnc!A?z!a@[U/B/ɭ[~,g<x<r2aTD"\xXW> ^+H$p!K1 t00|X2 !~^x)ә1̨=nvy5۶ ;te7t*| x A1_|*fI8nF} H$\OÇÁ֭[po&{>44ZM?c{< Ɣ$cMfk<($pBL&Ɇ&!aӹӛvH$BsG LvGn/nX[[ Y 7>jπ:y@+Jpܹ]-~'vMpe;0ƠiZ~5tvjuVP~#rP@g$P@=FnٌAUUc}W,W!L>p.5Ӡ`nЖ0PVa}}t, P@= @UUя~Rɲ|3lMSyEJ+̞,4 O:hgBXwNFRl6 ևavpE sr  60Buk v)Jz1PTL -<^o"@tsY˃쮂y6~Ml6Ϙ{{1J7e[h$P@=0A'E8s T*ˎfwOW*پ[EQ:>ʕ+0;;۔LbZi:~M'RukuM":Ā+l1;6_"8^&PrcS^IpyCM!t {a@kPm T*ٳgҘϛwV ;w^}վ ە=̙3qcVBIRiW4M^[5|N< rɵ,?X&wN 4 Μ9=bVǃWw cݻ^~~p`@{eEJrvΔs'D)XZZ껕4ɸ>3=!D{-R[bx C8FJ0??/* t:ݔ|f?1VVV^/QS*#P@=iP,?>XzN~~~^h(#Ƹu=|;a/e8qDS$ [; GLLL@X^P(_| UT JĄj|h;;;#jf8uJp H5k\_|A$$5jBdqqуL&PƆ׷(.]jʜ( !ĿG.=@54XujJI4%(vx)VY4VkVu{%''۝x?u5Ǜ5ނA.$P@]W갺jJI&!D(q~\TP(D2 ] u_D"A]i+%Xb1r%Ϟ-}dnnȲLn>݌@A̔ݐH4Z K0pp:tJ?,6~WSQ255X̓`Mzj<Ɔ~9/a<5hL";< Website : http://www.slack.net/~ant/ Forum : http://groups.google.com/group/blargg-sound-libs License : GNU Lesser General Public License (LGPL) Language: C or C++ Getting Started --------------- Build a program from demo.c, sms_ntsc.c, and the SDL multimedia library (see http://libsdl.org/). Run it with "test.bmp" in the same directory and it should show the filtered image. See demo.c for more. See sms_ntsc.txt for documentation and sms_ntsc.h for reference. Post to the discussion forum for assistance. Files ----- readme.txt Essential information sms_ntsc.txt Library documentation changes.txt Changes made since previous releases license.txt GNU Lesser General Public License benchmark.c Measures frame rate and processor usage of library demo.c Displays and saves NTSC filtered image demo_impl.h Internal routines used by demo test.bmp Test image for demo sms_ntsc_config.h Library configuration (modify as needed) sms_ntsc.h Library header and source sms_ntsc.c sms_ntsc_impl.h -- Shay Green core/cart_hw/eeprom_93c.c000664 001750 001750 00000016427 12702465756 016422 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Microwire Serial EEPROM (93C46 only) support * * Copyright (C) 2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "eeprom_93c.h" /* fixed board implementation */ #define BIT_DATA (0) #define BIT_CLK (1) #define BIT_CS (2) T_EEPROM_93C eeprom_93c; void eeprom_93c_init() { /* default eeprom state */ memset(&eeprom_93c, 0, sizeof(T_EEPROM_93C)); eeprom_93c.data = 1; eeprom_93c.state = WAIT_START; sram.custom = 3; } void eeprom_93c_write(unsigned char data) { /* Make sure CS is HIGH */ if (data & (1 << BIT_CS)) { /* Data latched on CLK postive edge */ if ((data & (1 << BIT_CLK)) && !eeprom_93c.clk) { /* Current EEPROM state */ switch (eeprom_93c.state) { case WAIT_START: { /* Wait for START bit */ if (data & (1 << BIT_DATA)) { eeprom_93c.opcode = 0; eeprom_93c.cycles = 0; eeprom_93c.state = GET_OPCODE; } break; } case GET_OPCODE: { /* 8-bit buffer (opcode + address) */ eeprom_93c.opcode |= ((data >> BIT_DATA) & 1) << (7 - eeprom_93c.cycles); eeprom_93c.cycles++; if (eeprom_93c.cycles == 8) { /* Decode instruction */ switch ((eeprom_93c.opcode >> 6) & 3) { case 1: { /* WRITE */ eeprom_93c.buffer = 0; eeprom_93c.cycles = 0; eeprom_93c.state = WRITE_WORD; break; } case 2: { /* READ */ eeprom_93c.buffer = *(uint16 *)(sram.sram + ((eeprom_93c.opcode & 0x3F) << 1)); eeprom_93c.cycles = 0; eeprom_93c.state = READ_WORD; /* Force DATA OUT */ eeprom_93c.data = 0; break; } case 3: { /* ERASE */ if (eeprom_93c.we) { *(uint16 *)(sram.sram + ((eeprom_93c.opcode & 0x3F) << 1)) = 0xFFFF; } /* wait for next command */ eeprom_93c.state = WAIT_STANDBY; break; } default: { /* special command */ switch ((eeprom_93c.opcode >> 4) & 3) { case 1: { /* WRITE ALL */ eeprom_93c.buffer = 0; eeprom_93c.cycles = 0; eeprom_93c.state = WRITE_WORD; break; } case 2: { /* ERASE ALL */ if (eeprom_93c.we) { memset(sram.sram, 0xFF, 128); } /* wait for next command */ eeprom_93c.state = WAIT_STANDBY; break; } default: { /* WRITE ENABLE/DISABLE */ eeprom_93c.we = (eeprom_93c.opcode >> 4) & 1; /* wait for next command */ eeprom_93c.state = WAIT_STANDBY; break; } } break; } } } break; } case WRITE_WORD: { /* 16-bit data buffer */ eeprom_93c.buffer |= ((data >> BIT_DATA) & 1) << (15 - eeprom_93c.cycles); eeprom_93c.cycles++; if (eeprom_93c.cycles == 16) { /* check EEPROM write protection */ if (eeprom_93c.we) { if (eeprom_93c.opcode & 0x40) { /* write one word */ *(uint16 *)(sram.sram + ((eeprom_93c.opcode & 0x3F) << 1)) = eeprom_93c.buffer; } else { /* write 64 words */ int i; for (i=0; i<64; i++) { *(uint16 *)(sram.sram + (i << 1)) = eeprom_93c.buffer; } } } /* wait for next command */ eeprom_93c.state = WAIT_STANDBY; } break; } case READ_WORD: { /* set DATA OUT */ eeprom_93c.data = ((eeprom_93c.buffer >> (15 - eeprom_93c.cycles)) & 1); eeprom_93c.cycles++; if (eeprom_93c.cycles == 16) { /* read next word (93C46B) */ eeprom_93c.opcode++; eeprom_93c.cycles = 0; eeprom_93c.buffer = *(uint16 *)(sram.sram + ((eeprom_93c.opcode & 0x3F) << 1)); } break; } default: { /* wait for STANDBY mode */ break; } } } } else { /* CS HIGH->LOW transition */ if (eeprom_93c.cs) { /* standby mode */ eeprom_93c.data = 1; eeprom_93c.state = WAIT_START; } } /* Update input lines */ eeprom_93c.cs = (data >> BIT_CS) & 1; eeprom_93c.clk = (data >> BIT_CLK) & 1; } unsigned char eeprom_93c_read(void) { return ((eeprom_93c.cs << BIT_CS) | (eeprom_93c.data << BIT_DATA) | (1 << BIT_CLK)); } gx/images/Option_menu.png000664 001750 001750 00000004662 12702465756 016615 0ustar00sergiosergio000000 000000 PNG  IHDR<\2(sBIT|d pHYs  ~tEXtCreation Time04/20/09( tEXtSoftwareMacromedia Fireworks MX*$ IDATx{UR@Z塈E Z"SDZ_X ** UDC%FFH+" EE|!C("Rz=9z9{Ϟךk qJ g`>ZPكf}a;a:˸;7A%x9*% S=$j/\#fs^a!/)A`%ҳmXb=k놡B <cJYe1".BqYH?r)~pѝ,LWI}jPLmZ+o:cZ40R#jgx3[b n8A,+I`M퇏4#,"vIv|,󭠊|%V~OׯfcwIWM,Bb9qVc=pÃ-\>F0=Ǩ q ka\7,>)+ALMU<_|܌_㍮J3\{BdߌQڊEaoMڭ+x'.M2< {6 ?7]T(-zRZqN"Ev3oaED~10wDz_6?$[݆ |@\Y?Nׅ"}^Z7rT/.>)80!8WwOHhcyعE'NtID'1[NV"} n—pg :NC]QTخԜ͸w1GO Ggf -{x paX;ٞOm+(_RIyyfzl2;`A ~VŮ=7\SHGض9սr$5d:=&-Mx]y$~[VjpW ˅c(;=Cs hj\-B-"GwKmbW 5^4"+5Up/g On^5[B"DU\jGb1Gg׸6C ?-<Ȳ»A#Cu)*N n_ "~E(mQ"^ "<0OīxMVRjlE$#X#e}sϭ&fmiz&<{:ޅo 7ݐx }Q"ь!爀ޠq8H-~'Q+hl±KѨ*춈E¸8Rc E+,1\c1YPqxeanSr H:"E58˨V!ܲ~cZDleBᔕճ~LV )ܲiޢnymGQ4H}0"NX-4^KE.`$DD3fdgQ\㏻'k26ׯDN})2""{w(,N| !ܹ$*+ pѦI!+fs{qN|$ZZb)//N͒FVdy `bGYq.yXCdHBW1?(lLlm`-f*3  l2/TCFF:.-Eiqy@vI<q VDL 6nlWXmh+?VdyZn]])zhS#Xod[0a"7~vvt+fEEŗ"C8~SY > Ia`VkD@!W`fFn8%%9Z;ь;z)kƂh8[ʊteO5Ӧ96jF,KOS_qqsΝLx |vZ[cq0K˰l0e/,T'dar 1[OuX[κR#\MNwA.I==T5yN-B;Gxo@hEY!r45O7%!`yr͢69쀁:s&' ͺ{lh.+'Ogٗ:%!4Q;Olg K(l.a2SPpU:BT5 ̿x׬dz:P8N^MKKl`e*55Ej #include #include #if M68K_EMULATE_ADDRESS_ERROR #include #endif /* M68K_EMULATE_ADDRESS_ERROR */ #include "m68k.h" /* ======================================================================== */ /* ============================ GENERAL DEFINES =========================== */ /* ======================================================================== */ /* Exception Vectors handled by emulation */ #define EXCEPTION_RESET 0 #define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */ #define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */ #define EXCEPTION_ILLEGAL_INSTRUCTION 4 #define EXCEPTION_ZERO_DIVIDE 5 #define EXCEPTION_CHK 6 #define EXCEPTION_TRAPV 7 #define EXCEPTION_PRIVILEGE_VIOLATION 8 #define EXCEPTION_TRACE 9 #define EXCEPTION_1010 10 #define EXCEPTION_1111 11 #define EXCEPTION_FORMAT_ERROR 14 #define EXCEPTION_UNINITIALIZED_INTERRUPT 15 #define EXCEPTION_SPURIOUS_INTERRUPT 24 #define EXCEPTION_INTERRUPT_AUTOVECTOR 24 #define EXCEPTION_TRAP_BASE 32 /* Function codes set by CPU during data/address bus activity */ #define FUNCTION_CODE_USER_DATA 1 #define FUNCTION_CODE_USER_PROGRAM 2 #define FUNCTION_CODE_SUPERVISOR_DATA 5 #define FUNCTION_CODE_SUPERVISOR_PROGRAM 6 #define FUNCTION_CODE_CPU_SPACE 7 /* Different ways to stop the CPU */ #define STOP_LEVEL_STOP 1 #define STOP_LEVEL_HALT 2 /* Used for 68000 address error processing */ #if M68K_EMULATE_ADDRESS_ERROR #define INSTRUCTION_YES 0 #define INSTRUCTION_NO 0x08 #define MODE_READ 0x10 #define MODE_WRITE 0 #define RUN_MODE_NORMAL 0 #define RUN_MODE_BERR_AERR_RESET 1 #endif #ifndef NULL #define NULL ((void*)0) #endif /* ======================================================================== */ /* ================================ MACROS ================================ */ /* ======================================================================== */ /* ---------------------------- General Macros ---------------------------- */ /* Bit Isolation Macros */ #define BIT_0(A) ((A) & 0x00000001) #define BIT_1(A) ((A) & 0x00000002) #define BIT_2(A) ((A) & 0x00000004) #define BIT_3(A) ((A) & 0x00000008) #define BIT_4(A) ((A) & 0x00000010) #define BIT_5(A) ((A) & 0x00000020) #define BIT_6(A) ((A) & 0x00000040) #define BIT_7(A) ((A) & 0x00000080) #define BIT_8(A) ((A) & 0x00000100) #define BIT_9(A) ((A) & 0x00000200) #define BIT_A(A) ((A) & 0x00000400) #define BIT_B(A) ((A) & 0x00000800) #define BIT_C(A) ((A) & 0x00001000) #define BIT_D(A) ((A) & 0x00002000) #define BIT_E(A) ((A) & 0x00004000) #define BIT_F(A) ((A) & 0x00008000) #define BIT_10(A) ((A) & 0x00010000) #define BIT_11(A) ((A) & 0x00020000) #define BIT_12(A) ((A) & 0x00040000) #define BIT_13(A) ((A) & 0x00080000) #define BIT_14(A) ((A) & 0x00100000) #define BIT_15(A) ((A) & 0x00200000) #define BIT_16(A) ((A) & 0x00400000) #define BIT_17(A) ((A) & 0x00800000) #define BIT_18(A) ((A) & 0x01000000) #define BIT_19(A) ((A) & 0x02000000) #define BIT_1A(A) ((A) & 0x04000000) #define BIT_1B(A) ((A) & 0x08000000) #define BIT_1C(A) ((A) & 0x10000000) #define BIT_1D(A) ((A) & 0x20000000) #define BIT_1E(A) ((A) & 0x40000000) #define BIT_1F(A) ((A) & 0x80000000) /* Get the most significant bit for specific sizes */ #define GET_MSB_8(A) ((A) & 0x80) #define GET_MSB_9(A) ((A) & 0x100) #define GET_MSB_16(A) ((A) & 0x8000) #define GET_MSB_17(A) ((A) & 0x10000) #define GET_MSB_32(A) ((A) & 0x80000000) #if M68K_USE_64_BIT #define GET_MSB_33(A) ((A) & 0x100000000) #endif /* M68K_USE_64_BIT */ /* Isolate nibbles */ #define LOW_NIBBLE(A) ((A) & 0x0f) #define HIGH_NIBBLE(A) ((A) & 0xf0) /* These are used to isolate 8, 16, and 32 bit sizes */ #define MASK_OUT_ABOVE_2(A) ((A) & 3) #define MASK_OUT_ABOVE_8(A) ((A) & 0xff) #define MASK_OUT_ABOVE_16(A) ((A) & 0xffff) #define MASK_OUT_BELOW_2(A) ((A) & ~3) #define MASK_OUT_BELOW_8(A) ((A) & ~0xff) #define MASK_OUT_BELOW_16(A) ((A) & ~0xffff) /* No need to mask if we are 32 bit */ #if M68K_INT_GT_32_BIT || M68K_USE_64_BIT #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff) #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff) #else #define MASK_OUT_ABOVE_32(A) (A) #define MASK_OUT_BELOW_32(A) 0 #endif /* M68K_INT_GT_32_BIT || M68K_USE_64_BIT */ /* Simulate address lines of 68k family */ #define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK) /* Shift & Rotate Macros. */ #define LSL(A, C) ((A) << (C)) #define LSR(A, C) ((A) >> (C)) /* Some > 32-bit optimizations */ #if M68K_INT_GT_32_BIT /* Shift left and right */ #define LSR_32(A, C) ((A) >> (C)) #define LSL_32(A, C) ((A) << (C)) #else /* We have to do this because the morons at ANSI decided that shifts * by >= data size are undefined. */ #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) #endif /* M68K_INT_GT_32_BIT */ #if M68K_USE_64_BIT #define LSL_32_64(A, C) ((A) << (C)) #define LSR_32_64(A, C) ((A) >> (C)) #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C))) #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C))) #endif /* M68K_USE_64_BIT */ #define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C))) #define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C))) #define ROL_16(A, C) MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C))) #define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C))) #define ROL_32(A, C) MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C))) #define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C))) #define ROR_8(A, C) MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C))) #define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C))) #define ROR_16(A, C) MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C))) #define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C))) #define ROR_32(A, C) MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C))) #define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C))) /* ------------------------------ CPU Access ------------------------------ */ /* Access the CPU registers */ #define REG_DA m68ki_cpu.dar /* easy access to data and address regs */ #define REG_D m68ki_cpu.dar #define REG_A (m68ki_cpu.dar+8) #define REG_PC m68ki_cpu.pc #define REG_SP_BASE m68ki_cpu.sp #define REG_USP m68ki_cpu.sp[0] #define REG_ISP m68ki_cpu.sp[4] #define REG_SP m68ki_cpu.dar[15] #define REG_IR m68ki_cpu.ir #define FLAG_T1 m68ki_cpu.t1_flag #define FLAG_S m68ki_cpu.s_flag #define FLAG_X m68ki_cpu.x_flag #define FLAG_N m68ki_cpu.n_flag #define FLAG_Z m68ki_cpu.not_z_flag #define FLAG_V m68ki_cpu.v_flag #define FLAG_C m68ki_cpu.c_flag #define FLAG_INT_MASK m68ki_cpu.int_mask #define CPU_INT_LEVEL m68ki_cpu.int_level /* ASG: changed from CPU_INTS_PENDING */ #define CPU_STOPPED m68ki_cpu.stopped #if M68K_EMULATE_PREFETCH #define CPU_PREF_ADDR m68ki_cpu.pref_addr #define CPU_PREF_DATA m68ki_cpu.pref_data #endif #define CPU_ADDRESS_MASK 0x00ffffff #if M68K_EMULATE_ADDRESS_ERROR #define CPU_INSTR_MODE m68ki_cpu.instr_mode #define CPU_RUN_MODE m68ki_cpu.run_mode #endif #define CYC_INSTRUCTION m68ki_cycles #define CYC_EXCEPTION m68ki_exception_cycle_table #define CYC_BCC_NOTAKE_B ( -2 * MUL) #define CYC_BCC_NOTAKE_W ( 2 * MUL) #define CYC_DBCC_F_NOEXP ( -2 * MUL) #define CYC_DBCC_F_EXP ( 2 * MUL) #define CYC_SCC_R_TRUE ( 2 * MUL) #define CYC_MOVEM_W ( 4 * MUL) #define CYC_MOVEM_L ( 8 * MUL) #define CYC_SHIFT ( 2 * MUL) #define CYC_RESET (132 * MUL) #if M68K_EMULATE_INT_ACK == OPT_ON #define CALLBACK_INT_ACK m68ki_cpu.int_ack_callback #endif #if M68K_EMULATE_RESET == OPT_ON #define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON #define CALLBACK_TAS_INSTR m68ki_cpu.tas_instr_callback #endif #if M68K_EMULATE_FC == OPT_ON #define CALLBACK_SET_FC m68ki_cpu.set_fc_callback #endif /* ----------------------------- Configuration ---------------------------- */ /* These defines are dependant on the configuration defines in m68kconf.h */ /* Enable or disable callback functions */ #if M68K_EMULATE_INT_ACK #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A); #else #define m68ki_int_ack(A) CALLBACK_INT_ACK(A); #endif #else /* Default action is to used autovector mode, which is most common */ #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR #endif /* M68K_EMULATE_INT_ACK */ #if M68K_EMULATE_RESET #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER #define m68ki_output_reset() M68K_RESET_CALLBACK(); #else #define m68ki_output_reset() CALLBACK_RESET_INSTR(); #endif #else #define m68ki_output_reset() #endif /* M68K_EMULATE_RESET */ #if M68K_TAS_HAS_CALLBACK #if M68K_TAS_HAS_CALLBACK == OPT_SPECIFY_HANDLER #define m68ki_tas_callback() M68K_TAS_CALLBACK() #else #define m68ki_tas_callback() CALLBACK_TAS_INSTR() #endif #else #define m68ki_tas_callback() 0 #endif /* M68K_TAS_HAS_CALLBACK */ /* Enable or disable function code emulation */ #if M68K_EMULATE_FC #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A); #else #define m68ki_set_fc(A) CALLBACK_SET_FC(A); #endif #define m68ki_use_data_space() m68ki_cpu.address_space = FUNCTION_CODE_USER_DATA; #define m68ki_use_program_space() m68ki_cpu.address_space = FUNCTION_CODE_USER_PROGRAM; #define m68ki_get_address_space() m68ki_cpu.address_space #else #define m68ki_set_fc(A) #define m68ki_use_data_space() #define m68ki_use_program_space() #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA #endif /* M68K_EMULATE_FC */ /* Enable or disable trace emulation */ #if M68K_EMULATE_TRACE /* Initiates trace checking before each instruction (t1) */ #define m68ki_trace_t1() m68ki_cpu.tracing = FLAG_T1; /* Clear all tracing */ #define m68ki_clear_trace() m68ki_cpu.tracing = 0; /* Cause a trace exception if we are tracing */ #define m68ki_exception_if_trace() if(m68ki_cpu.tracing) m68ki_exception_trace(); #else #define m68ki_trace_t1() #define m68ki_clear_trace() #define m68ki_exception_if_trace() #endif /* M68K_EMULATE_TRACE */ /* Enable or disable Address error emulation */ #if M68K_EMULATE_ADDRESS_ERROR #define m68ki_set_address_error_trap() \ if(setjmp(m68ki_cpu.aerr_trap) != 0) \ { \ m68ki_exception_address_error(); \ } #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) \ if((ADDR)&1) \ { \ if (m68ki_cpu.aerr_enabled) \ { \ m68ki_cpu.aerr_address = ADDR; \ m68ki_cpu.aerr_write_mode = WRITE_MODE; \ m68ki_cpu.aerr_fc = FC; \ longjmp(m68ki_cpu.aerr_trap, 1); \ } \ } #else #define m68ki_set_address_error_trap() #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) #endif /* M68K_ADDRESS_ERROR */ /* -------------------------- EA / Operand Access ------------------------- */ /* * The general instruction format follows this pattern: * .... XXX. .... .YYY * where XXX is register X and YYY is register Y */ /* Data Register Isolation */ #define DX (REG_D[(REG_IR >> 9) & 7]) #define DY (REG_D[REG_IR & 7]) /* Address Register Isolation */ #define AX (REG_A[(REG_IR >> 9) & 7]) #define AY (REG_A[REG_IR & 7]) /* Effective Address Calculations */ #define EA_AY_AI_8() AY /* address register indirect */ #define EA_AY_AI_16() EA_AY_AI_8() #define EA_AY_AI_32() EA_AY_AI_8() #define EA_AY_PI_8() (AY++) /* postincrement (size = byte) */ #define EA_AY_PI_16() ((AY+=2)-2) /* postincrement (size = word) */ #define EA_AY_PI_32() ((AY+=4)-4) /* postincrement (size = long) */ #define EA_AY_PD_8() (--AY) /* predecrement (size = byte) */ #define EA_AY_PD_16() (AY-=2) /* predecrement (size = word) */ #define EA_AY_PD_32() (AY-=4) /* predecrement (size = long) */ #define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */ #define EA_AY_DI_16() EA_AY_DI_8() #define EA_AY_DI_32() EA_AY_DI_8() #define EA_AY_IX_8() m68ki_get_ea_ix(AY) /* indirect + index */ #define EA_AY_IX_16() EA_AY_IX_8() #define EA_AY_IX_32() EA_AY_IX_8() #define EA_AX_AI_8() AX #define EA_AX_AI_16() EA_AX_AI_8() #define EA_AX_AI_32() EA_AX_AI_8() #define EA_AX_PI_8() (AX++) #define EA_AX_PI_16() ((AX+=2)-2) #define EA_AX_PI_32() ((AX+=4)-4) #define EA_AX_PD_8() (--AX) #define EA_AX_PD_16() (AX-=2) #define EA_AX_PD_32() (AX-=4) #define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16())) #define EA_AX_DI_16() EA_AX_DI_8() #define EA_AX_DI_32() EA_AX_DI_8() #define EA_AX_IX_8() m68ki_get_ea_ix(AX) #define EA_AX_IX_16() EA_AX_IX_8() #define EA_AX_IX_32() EA_AX_IX_8() #define EA_A7_PI_8() ((REG_A[7]+=2)-2) #define EA_A7_PD_8() (REG_A[7]-=2) #define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16()) /* absolute word */ #define EA_AW_16() EA_AW_8() #define EA_AW_32() EA_AW_8() #define EA_AL_8() m68ki_read_imm_32() /* absolute long */ #define EA_AL_16() EA_AL_8() #define EA_AL_32() EA_AL_8() #define EA_PCDI_8() m68ki_get_ea_pcdi() /* pc indirect + displacement */ #define EA_PCDI_16() EA_PCDI_8() #define EA_PCDI_32() EA_PCDI_8() #define EA_PCIX_8() m68ki_get_ea_pcix() /* pc indirect + index */ #define EA_PCIX_16() EA_PCIX_8() #define EA_PCIX_32() EA_PCIX_8() #define OPER_I_8() m68ki_read_imm_8() #define OPER_I_16() m68ki_read_imm_16() #define OPER_I_32() m68ki_read_imm_32() /* --------------------------- Status Register ---------------------------- */ /* Flag Calculation Macros */ #define CFLAG_8(A) (A) #define CFLAG_16(A) ((A)>>8) #if M68K_INT_GT_32_BIT #define CFLAG_ADD_32(S, D, R) ((R)>>24) #define CFLAG_SUB_32(S, D, R) ((R)>>24) #else #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23) #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23) #endif /* M68K_INT_GT_32_BIT */ #define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R)) #define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8) #define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24) #define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D)) #define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8) #define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24) #define NFLAG_8(A) (A) #define NFLAG_16(A) ((A)>>8) #define NFLAG_32(A) ((A)>>24) #define NFLAG_64(A) ((A)>>56) #define ZFLAG_8(A) MASK_OUT_ABOVE_8(A) #define ZFLAG_16(A) MASK_OUT_ABOVE_16(A) #define ZFLAG_32(A) MASK_OUT_ABOVE_32(A) /* Flag values */ #define NFLAG_SET 0x80 #define NFLAG_CLEAR 0 #define CFLAG_SET 0x100 #define CFLAG_CLEAR 0 #define XFLAG_SET 0x100 #define XFLAG_CLEAR 0 #define VFLAG_SET 0x80 #define VFLAG_CLEAR 0 #define ZFLAG_SET 0 #define ZFLAG_CLEAR 0xffffffff #define SFLAG_SET 4 #define SFLAG_CLEAR 0 /* Turn flag values into 1 or 0 */ #define XFLAG_AS_1() ((FLAG_X>>8)&1) #define NFLAG_AS_1() ((FLAG_N>>7)&1) #define VFLAG_AS_1() ((FLAG_V>>7)&1) #define ZFLAG_AS_1() (!FLAG_Z) #define CFLAG_AS_1() ((FLAG_C>>8)&1) /* Conditions */ #define COND_CS() (FLAG_C&0x100) #define COND_CC() (!COND_CS()) #define COND_VS() (FLAG_V&0x80) #define COND_VC() (!COND_VS()) #define COND_NE() FLAG_Z #define COND_EQ() (!COND_NE()) #define COND_MI() (FLAG_N&0x80) #define COND_PL() (!COND_MI()) #define COND_LT() ((FLAG_N^FLAG_V)&0x80) #define COND_GE() (!COND_LT()) #define COND_HI() (COND_CC() && COND_NE()) #define COND_LS() (COND_CS() || COND_EQ()) #define COND_GT() (COND_GE() && COND_NE()) #define COND_LE() (COND_LT() || COND_EQ()) /* Reversed conditions */ #define COND_NOT_CS() COND_CC() #define COND_NOT_CC() COND_CS() #define COND_NOT_VS() COND_VC() #define COND_NOT_VC() COND_VS() #define COND_NOT_NE() COND_EQ() #define COND_NOT_EQ() COND_NE() #define COND_NOT_MI() COND_PL() #define COND_NOT_PL() COND_MI() #define COND_NOT_LT() COND_GE() #define COND_NOT_GE() COND_LT() #define COND_NOT_HI() COND_LS() #define COND_NOT_LS() COND_HI() #define COND_NOT_GT() COND_LE() #define COND_NOT_LE() COND_GT() /* Not real conditions, but here for convenience */ #define COND_XS() (FLAG_X&0x100) #define COND_XC() (!COND_XS) /* Get the condition code register */ #define m68ki_get_ccr() ((COND_XS() >> 4) | \ (COND_MI() >> 4) | \ (COND_EQ() << 2) | \ (COND_VS() >> 6) | \ (COND_CS() >> 8)) /* Get the status register */ #define m68ki_get_sr() ( FLAG_T1 | \ (FLAG_S << 11) | \ FLAG_INT_MASK | \ m68ki_get_ccr()) /* ---------------------------- Cycle Counting ---------------------------- */ #define USE_CYCLES(A) m68ki_cpu.cycles += (A) #define SET_CYCLES(A) m68ki_cpu.cycles = (A) /* ----------------------------- Read / Write ----------------------------- */ /* Read data immediately following the PC */ #define m68k_read_immediate_16(address) *(uint16 *)(m68ki_cpu.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)) #define m68k_read_immediate_32(address) (m68k_read_immediate_16(address) << 16) | (m68k_read_immediate_16(address+2)) /* Read data relative to the PC */ #define m68k_read_pcrelative_8(address) READ_BYTE(m68ki_cpu.memory_map[((address)>>16)&0xff].base, (address) & 0xffff) #define m68k_read_pcrelative_16(address) m68k_read_immediate_16(address) #define m68k_read_pcrelative_32(address) m68k_read_immediate_32(address) /* Read from the current address space */ #define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space()) #define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space()) #define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space()) /* Write to the current data space */ #define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V) #define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) #define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V) /* map read immediate 8 to read immediate 16 */ #define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16()) /* Map PC-relative reads */ #define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A) #define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A) #define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A) /* Read from the program space */ #define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) #define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) #define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* Read from the data space */ #define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) #define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) #define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA) /* ======================================================================== */ /* =============================== PROTOTYPES ============================= */ /* ======================================================================== */ /* Used by shift & rotate instructions */ static const uint8 m68ki_shift_8_table[65] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; static const uint16 m68ki_shift_16_table[65] = { 0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }; static const uint m68ki_shift_32_table[65] = { 0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }; /* Number of clock cycles to use for exception processing. * I used 4 for any vectors that are undocumented for processing times. */ static const uint16 m68ki_exception_cycle_table[256] = { 40*MUL, /* 0: Reset - Initial Stack Pointer */ 4*MUL, /* 1: Reset - Initial Program Counter */ 50*MUL, /* 2: Bus Error (unemulated) */ 50*MUL, /* 3: Address Error (unemulated) */ 34*MUL, /* 4: Illegal Instruction */ 38*MUL, /* 5: Divide by Zero -- ASG: changed from 42 */ 40*MUL, /* 6: CHK -- ASG: chanaged from 44 */ 34*MUL, /* 7: TRAPV */ 34*MUL, /* 8: Privilege Violation */ 34*MUL, /* 9: Trace */ 4*MUL, /* 10: 1010 */ 4*MUL, /* 11: 1111 */ 4*MUL, /* 12: RESERVED */ 4*MUL, /* 13: Coprocessor Protocol Violation (unemulated) */ 4*MUL, /* 14: Format Error */ 44*MUL, /* 15: Uninitialized Interrupt */ 4*MUL, /* 16: RESERVED */ 4*MUL, /* 17: RESERVED */ 4*MUL, /* 18: RESERVED */ 4*MUL, /* 19: RESERVED */ 4*MUL, /* 20: RESERVED */ 4*MUL, /* 21: RESERVED */ 4*MUL, /* 22: RESERVED */ 4*MUL, /* 23: RESERVED */ 44*MUL, /* 24: Spurious Interrupt */ 44*MUL, /* 25: Level 1 Interrupt Autovector */ 44*MUL, /* 26: Level 2 Interrupt Autovector */ 44*MUL, /* 27: Level 3 Interrupt Autovector */ 44*MUL, /* 28: Level 4 Interrupt Autovector */ 44*MUL, /* 29: Level 5 Interrupt Autovector */ 44*MUL, /* 30: Level 6 Interrupt Autovector */ 44*MUL, /* 31: Level 7 Interrupt Autovector */ 34*MUL, /* 32: TRAP #0 -- ASG: chanaged from 38 */ 34*MUL, /* 33: TRAP #1 */ 34*MUL, /* 34: TRAP #2 */ 34*MUL, /* 35: TRAP #3 */ 34*MUL, /* 36: TRAP #4 */ 34*MUL, /* 37: TRAP #5 */ 34*MUL, /* 38: TRAP #6 */ 34*MUL, /* 39: TRAP #7 */ 34*MUL, /* 40: TRAP #8 */ 34*MUL, /* 41: TRAP #9 */ 34*MUL, /* 42: TRAP #10 */ 34*MUL, /* 43: TRAP #11 */ 34*MUL, /* 44: TRAP #12 */ 34*MUL, /* 45: TRAP #13 */ 34*MUL, /* 46: TRAP #14 */ 34*MUL, /* 47: TRAP #15 */ 4*MUL, /* 48: FP Branch or Set on Unknown Condition (unemulated) */ 4*MUL, /* 49: FP Inexact Result (unemulated) */ 4*MUL, /* 50: FP Divide by Zero (unemulated) */ 4*MUL, /* 51: FP Underflow (unemulated) */ 4*MUL, /* 52: FP Operand Error (unemulated) */ 4*MUL, /* 53: FP Overflow (unemulated) */ 4*MUL, /* 54: FP Signaling NAN (unemulated) */ 4*MUL, /* 55: FP Unimplemented Data Type (unemulated) */ 4*MUL, /* 56: MMU Configuration Error (unemulated) */ 4*MUL, /* 57: MMU Illegal Operation Error (unemulated) */ 4*MUL, /* 58: MMU Access Level Violation Error (unemulated) */ 4*MUL, /* 59: RESERVED */ 4*MUL, /* 60: RESERVED */ 4*MUL, /* 61: RESERVED */ 4*MUL, /* 62: RESERVED */ 4*MUL, /* 63: RESERVED */ /* 64-255: User Defined */ 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL, 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL, 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL, 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL, 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL, 4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL,4*MUL }; /* Read data immediately after the program counter */ INLINE uint m68ki_read_imm_16(void); INLINE uint m68ki_read_imm_32(void); /* Read data with specific function code */ INLINE uint m68ki_read_8_fc (uint address, uint fc); INLINE uint m68ki_read_16_fc (uint address, uint fc); INLINE uint m68ki_read_32_fc (uint address, uint fc); /* Write data with specific function code */ INLINE void m68ki_write_8_fc (uint address, uint fc, uint value); INLINE void m68ki_write_16_fc(uint address, uint fc, uint value); INLINE void m68ki_write_32_fc(uint address, uint fc, uint value); /* Indexed and PC-relative ea fetching */ INLINE uint m68ki_get_ea_pcdi(void); INLINE uint m68ki_get_ea_pcix(void); INLINE uint m68ki_get_ea_ix(uint An); /* Operand fetching */ INLINE uint OPER_AY_AI_8(void); INLINE uint OPER_AY_AI_16(void); INLINE uint OPER_AY_AI_32(void); INLINE uint OPER_AY_PI_8(void); INLINE uint OPER_AY_PI_16(void); INLINE uint OPER_AY_PI_32(void); INLINE uint OPER_AY_PD_8(void); INLINE uint OPER_AY_PD_16(void); INLINE uint OPER_AY_PD_32(void); INLINE uint OPER_AY_DI_8(void); INLINE uint OPER_AY_DI_16(void); INLINE uint OPER_AY_DI_32(void); INLINE uint OPER_AY_IX_8(void); INLINE uint OPER_AY_IX_16(void); INLINE uint OPER_AY_IX_32(void); INLINE uint OPER_AX_AI_8(void); INLINE uint OPER_AX_AI_16(void); INLINE uint OPER_AX_AI_32(void); INLINE uint OPER_AX_PI_8(void); INLINE uint OPER_AX_PI_16(void); INLINE uint OPER_AX_PI_32(void); INLINE uint OPER_AX_PD_8(void); INLINE uint OPER_AX_PD_16(void); INLINE uint OPER_AX_PD_32(void); INLINE uint OPER_AX_DI_8(void); INLINE uint OPER_AX_DI_16(void); INLINE uint OPER_AX_DI_32(void); INLINE uint OPER_AX_IX_8(void); INLINE uint OPER_AX_IX_16(void); INLINE uint OPER_AX_IX_32(void); INLINE uint OPER_A7_PI_8(void); INLINE uint OPER_A7_PD_8(void); INLINE uint OPER_AW_8(void); INLINE uint OPER_AW_16(void); INLINE uint OPER_AW_32(void); INLINE uint OPER_AL_8(void); INLINE uint OPER_AL_16(void); INLINE uint OPER_AL_32(void); INLINE uint OPER_PCDI_8(void); INLINE uint OPER_PCDI_16(void); INLINE uint OPER_PCDI_32(void); INLINE uint OPER_PCIX_8(void); INLINE uint OPER_PCIX_16(void); INLINE uint OPER_PCIX_32(void); /* Stack operations */ INLINE void m68ki_push_16(uint value); INLINE void m68ki_push_32(uint value); INLINE uint m68ki_pull_16(void); INLINE uint m68ki_pull_32(void); /* Program flow operations */ INLINE void m68ki_jump(uint new_pc); INLINE void m68ki_jump_vector(uint vector); INLINE void m68ki_branch_8(uint offset); INLINE void m68ki_branch_16(uint offset); INLINE void m68ki_branch_32(uint offset); /* Status register operations. */ INLINE void m68ki_set_s_flag(uint value); /* Only bit 2 of value should be set (i.e. 4 or 0) */ INLINE void m68ki_set_ccr(uint value); /* set the condition code register */ INLINE void m68ki_set_sr(uint value); /* set the status register */ /* Exception processing */ INLINE uint m68ki_init_exception(void); /* Initial exception processing */ INLINE void m68ki_stack_frame_3word(uint pc, uint sr); /* Stack various frame types */ #if M68K_EMULATE_ADDRESS_ERROR INLINE void m68ki_stack_frame_buserr(uint sr); #endif INLINE void m68ki_exception_trap(uint vector); INLINE void m68ki_exception_trapN(uint vector); #if M68K_EMULATE_TRACE INLINE void m68ki_exception_trace(void); #endif static void m68ki_exception_privilege_violation(void); /* do not inline in order to reduce function size and allow inlining of read/write functions by the compile */ INLINE void m68ki_exception_1010(void); INLINE void m68ki_exception_1111(void); INLINE void m68ki_exception_illegal(void); #if M68K_EMULATE_ADDRESS_ERROR INLINE void m68ki_exception_address_error(void); #endif INLINE void m68ki_exception_interrupt(uint int_level); INLINE void m68ki_check_interrupts(void); /* ASG: check for interrupts */ /* ======================================================================== */ /* =========================== UTILITY FUNCTIONS ========================== */ /* ======================================================================== */ /* ---------------------------- Read Immediate ---------------------------- */ /* Handles all immediate reads, does address error check, function code setting, * and prefetching if they are enabled in m68kconf.h */ INLINE uint m68ki_read_imm_16(void) { m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #if M68K_CHECK_PC_ADDRESS_ERROR m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #endif #if M68K_EMULATE_PREFETCH if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) { CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); CPU_PREF_DATA = m68k_read_immediate_32(CPU_PREF_ADDR); } REG_PC += 2; return MASK_OUT_ABOVE_16(CPU_PREF_DATA >> ((2-((REG_PC-2)&2))<<3)); #else uint pc = REG_PC; REG_PC += 2; return m68k_read_immediate_16(pc); #endif /* M68K_EMULATE_PREFETCH */ } INLINE uint m68ki_read_imm_32(void) { #if M68K_EMULATE_PREFETCH uint temp_val; m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #if M68K_CHECK_PC_ADDRESS_ERROR m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #endif if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) { CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); CPU_PREF_DATA = m68k_read_immediate_32(CPU_PREF_ADDR); } temp_val = CPU_PREF_DATA; REG_PC += 2; if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR) { CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC); CPU_PREF_DATA = m68k_read_immediate_32(CPU_PREF_ADDR); temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | (CPU_PREF_DATA >> 16)); } REG_PC += 2; return temp_val; #else m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #if M68K_CHECK_PC_ADDRESS_ERROR m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM) /* auto-disable (see m68kcpu.h) */ #endif uint pc = REG_PC; REG_PC += 4; return m68k_read_immediate_32(pc); #endif /* M68K_EMULATE_PREFETCH */ } /* ------------------------- Top level read/write ------------------------- */ /* Handles all memory accesses (except for immediate reads if they are * configured to use separate functions in m68kconf.h). * All memory accesses must go through these top level functions. * These functions will also check for address error and set the function * code if they are enabled in m68kconf.h. */ INLINE uint m68ki_read_8_fc(uint address, uint fc) { cpu_memory_map *temp = &m68ki_cpu.memory_map[((address)>>16)&0xff];; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ if (temp->read8) return (*temp->read8)(ADDRESS_68K(address)); else return READ_BYTE(temp->base, (address) & 0xffff); } INLINE uint m68ki_read_16_fc(uint address, uint fc) { cpu_memory_map *temp; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(address, MODE_READ, fc) /* auto-disable (see m68kcpu.h) */ temp = &m68ki_cpu.memory_map[((address)>>16)&0xff]; if (temp->read16) return (*temp->read16)(ADDRESS_68K(address)); else return *(uint16 *)(temp->base + ((address) & 0xffff)); } INLINE uint m68ki_read_32_fc(uint address, uint fc) { cpu_memory_map *temp; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(address, MODE_READ, fc) /* auto-disable (see m68kcpu.h) */ temp = &m68ki_cpu.memory_map[((address)>>16)&0xff]; if (temp->read16) return ((*temp->read16)(ADDRESS_68K(address)) << 16) | ((*temp->read16)(ADDRESS_68K(address + 2))); else return m68k_read_immediate_32(address); } INLINE void m68ki_write_8_fc(uint address, uint fc, uint value) { cpu_memory_map *temp; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ temp = &m68ki_cpu.memory_map[((address)>>16)&0xff]; if (temp->write8) (*temp->write8)(ADDRESS_68K(address),value); else WRITE_BYTE(temp->base, (address) & 0xffff, value); } INLINE void m68ki_write_16_fc(uint address, uint fc, uint value) { cpu_memory_map *temp; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */ temp = &m68ki_cpu.memory_map[((address)>>16)&0xff]; if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value); else *(uint16 *)(temp->base + ((address) & 0xffff)) = value; } INLINE void m68ki_write_32_fc(uint address, uint fc, uint value) { cpu_memory_map *temp; m68ki_set_fc(fc) /* auto-disable (see m68kcpu.h) */ m68ki_check_address_error(address, MODE_WRITE, fc) /* auto-disable (see m68kcpu.h) */ temp = &m68ki_cpu.memory_map[((address)>>16)&0xff]; if (temp->write16) (*temp->write16)(ADDRESS_68K(address),value>>16); else *(uint16 *)(temp->base + ((address) & 0xffff)) = value >> 16; temp = &m68ki_cpu.memory_map[((address + 2)>>16)&0xff]; if (temp->write16) (*temp->write16)(ADDRESS_68K(address+2),value&0xffff); else *(uint16 *)(temp->base + ((address + 2) & 0xffff)) = value; } /* --------------------- Effective Address Calculation -------------------- */ /* The program counter relative addressing modes cause operands to be * retrieved from program space, not data space. */ INLINE uint m68ki_get_ea_pcdi(void) { uint old_pc = REG_PC; m68ki_use_program_space() /* auto-disable */ return old_pc + MAKE_INT_16(m68ki_read_imm_16()); } INLINE uint m68ki_get_ea_pcix(void) { m68ki_use_program_space() /* auto-disable */ return m68ki_get_ea_ix(REG_PC); } /* Indexed addressing modes are encoded as follows: * * Base instruction format: * F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0 * x x x x x x x x x x | 1 1 0 | BASE REGISTER (An) * * Base instruction format for destination EA in move instructions: * F E D C | B A 9 | 8 7 6 | 5 4 3 2 1 0 * x x x x | BASE REG | 1 1 0 | X X X X X X (An) * * Brief extension format: * F | E D C | B | A 9 | 8 | 7 6 5 4 3 2 1 0 * D/A | REGISTER | W/L | SCALE | 0 | DISPLACEMENT * * Full extension format: * F E D C B A 9 8 7 6 5 4 3 2 1 0 * D/A | REGISTER | W/L | SCALE | 1 | BS | IS | BD SIZE | 0 | I/IS * BASE DISPLACEMENT (0, 16, 32 bit) (bd) * OUTER DISPLACEMENT (0, 16, 32 bit) (od) * * D/A: 0 = Dn, 1 = An (Xn) * W/L: 0 = W (sign extend), 1 = L (.SIZE) * SCALE: 00=1, 01=2, 10=4, 11=8 (*SCALE) * BS: 0=add base reg, 1=suppress base reg (An suppressed) * IS: 0=add index, 1=suppress index (Xn suppressed) * BD SIZE: 00=reserved, 01=NULL, 10=Word, 11=Long (size of bd) * * IS I/IS Operation * 0 000 No Memory Indirect * 0 001 indir prex with null outer * 0 010 indir prex with word outer * 0 011 indir prex with long outer * 0 100 reserved * 0 101 indir postx with null outer * 0 110 indir postx with word outer * 0 111 indir postx with long outer * 1 000 no memory indirect * 1 001 mem indir with null outer * 1 010 mem indir with word outer * 1 011 mem indir with long outer * 1 100-111 reserved */ INLINE uint m68ki_get_ea_ix(uint An) { /* An = base register */ uint extension = m68ki_read_imm_16(); uint Xn = 0; /* Index register */ /* Calculate index */ Xn = REG_DA[extension>>12]; /* Xn */ if(!BIT_B(extension)) /* W/L */ Xn = MAKE_INT_16(Xn); /* Add base register and displacement and return */ return An + Xn + MAKE_INT_8(extension); } /* Fetch operands */ INLINE uint OPER_AY_AI_8(void) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AY_PI_8(void) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AY_PD_8(void) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); } INLINE uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);} INLINE uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);} INLINE uint OPER_AY_DI_8(void) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AY_IX_8(void) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); } INLINE uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);} INLINE uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);} INLINE uint OPER_AX_AI_8(void) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AX_PI_8(void) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AX_PD_8(void) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); } INLINE uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);} INLINE uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);} INLINE uint OPER_AX_DI_8(void) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); } INLINE uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);} INLINE uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);} INLINE uint OPER_AX_IX_8(void) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); } INLINE uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);} INLINE uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);} INLINE uint OPER_A7_PI_8(void) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); } INLINE uint OPER_A7_PD_8(void) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); } INLINE uint OPER_AW_8(void) {uint ea = EA_AW_8(); return m68ki_read_8(ea); } INLINE uint OPER_AW_16(void) {uint ea = EA_AW_16(); return m68ki_read_16(ea);} INLINE uint OPER_AW_32(void) {uint ea = EA_AW_32(); return m68ki_read_32(ea);} INLINE uint OPER_AL_8(void) {uint ea = EA_AL_8(); return m68ki_read_8(ea); } INLINE uint OPER_AL_16(void) {uint ea = EA_AL_16(); return m68ki_read_16(ea);} INLINE uint OPER_AL_32(void) {uint ea = EA_AL_32(); return m68ki_read_32(ea);} INLINE uint OPER_PCDI_8(void) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); } INLINE uint OPER_PCDI_16(void) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);} INLINE uint OPER_PCDI_32(void) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);} INLINE uint OPER_PCIX_8(void) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); } INLINE uint OPER_PCIX_16(void) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);} INLINE uint OPER_PCIX_32(void) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);} /* ---------------------------- Stack Functions --------------------------- */ /* Push/pull data from the stack */ /* Optimized access assuming stack is always located in ROM/RAM [EkeEke] */ INLINE void m68ki_push_16(uint value) { REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2); /*m68ki_write_16(REG_SP, value);*/ *(uint16 *)(m68ki_cpu.memory_map[(REG_SP>>16)&0xff].base + (REG_SP & 0xffff)) = value; } INLINE void m68ki_push_32(uint value) { REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4); /*m68ki_write_32(REG_SP, value);*/ *(uint16 *)(m68ki_cpu.memory_map[(REG_SP>>16)&0xff].base + (REG_SP & 0xffff)) = value >> 16; *(uint16 *)(m68ki_cpu.memory_map[((REG_SP + 2)>>16)&0xff].base + ((REG_SP + 2) & 0xffff)) = value & 0xffff; } INLINE uint m68ki_pull_16(void) { uint sp = REG_SP; REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2); return m68k_read_immediate_16(sp); /*return m68ki_read_16(sp);*/ } INLINE uint m68ki_pull_32(void) { uint sp = REG_SP; REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4); return m68k_read_immediate_32(sp); /*return m68ki_read_32(sp);*/ } /* ----------------------------- Program Flow ----------------------------- */ /* Jump to a new program location or vector. * These functions will also call the pc_changed callback if it was enabled * in m68kconf.h. */ INLINE void m68ki_jump(uint new_pc) { REG_PC = new_pc; } INLINE void m68ki_jump_vector(uint vector) { REG_PC = m68ki_read_data_32(vector<<2); } /* Branch to a new memory location. * The 32-bit branch will call pc_changed if it was enabled in m68kconf.h. * So far I've found no problems with not calling pc_changed for 8 or 16 * bit branches. */ INLINE void m68ki_branch_8(uint offset) { REG_PC += MAKE_INT_8(offset); } INLINE void m68ki_branch_16(uint offset) { REG_PC += MAKE_INT_16(offset); } INLINE void m68ki_branch_32(uint offset) { REG_PC += offset; } /* ---------------------------- Status Register --------------------------- */ /* Set the S flag and change the active stack pointer. * Note that value MUST be 4 or 0. */ INLINE void m68ki_set_s_flag(uint value) { /* Backup the old stack pointer */ REG_SP_BASE[FLAG_S] = REG_SP; /* Set the S flag */ FLAG_S = value; /* Set the new stack pointer */ REG_SP = REG_SP_BASE[FLAG_S]; } /* Set the condition code register */ INLINE void m68ki_set_ccr(uint value) { FLAG_X = BIT_4(value) << 4; FLAG_N = BIT_3(value) << 4; FLAG_Z = !BIT_2(value); FLAG_V = BIT_1(value) << 6; FLAG_C = BIT_0(value) << 8; } /* Set the status register and check for interrupts */ INLINE void m68ki_set_sr(uint value) { /* Set the status register */ FLAG_T1 = BIT_F(value); FLAG_INT_MASK = value & 0x0700; m68ki_set_ccr(value); m68ki_set_s_flag((value >> 11) & 4); /* Check current IRQ status */ m68ki_check_interrupts(); } /* ------------------------- Exception Processing ------------------------- */ /* Initiate exception processing */ INLINE uint m68ki_init_exception(void) { /* Save the old status register */ uint sr = m68ki_get_sr(); /* Turn off trace flag, clear pending traces */ FLAG_T1 = 0; m68ki_clear_trace() /* Enter supervisor mode */ m68ki_set_s_flag(SFLAG_SET); return sr; } /* 3 word stack frame (68000 only) */ INLINE void m68ki_stack_frame_3word(uint pc, uint sr) { m68ki_push_32(pc); m68ki_push_16(sr); } #if M68K_EMULATE_ADDRESS_ERROR /* Bus error stack frame (68000 only). */ INLINE void m68ki_stack_frame_buserr(uint sr) { m68ki_push_32(REG_PC); m68ki_push_16(sr); m68ki_push_16(REG_IR); m68ki_push_32(m68ki_cpu.aerr_address); /* access address */ /* 0 0 0 0 0 0 0 0 0 0 0 R/W I/N FC * R/W 0 = write, 1 = read * I/N 0 = instruction, 1 = not * FC 3-bit function code */ m68ki_push_16(m68ki_cpu.aerr_write_mode | CPU_INSTR_MODE | m68ki_cpu.aerr_fc); } #endif /* Used for Group 2 exceptions. */ INLINE void m68ki_exception_trap(uint vector) { uint sr = m68ki_init_exception(); m68ki_stack_frame_3word(REG_PC, sr); m68ki_jump_vector(vector); /* Use up some clock cycles */ USE_CYCLES(CYC_EXCEPTION[vector]); } /* Trap#n stacks a 0 frame but behaves like group2 otherwise */ INLINE void m68ki_exception_trapN(uint vector) { uint sr = m68ki_init_exception(); m68ki_stack_frame_3word(REG_PC, sr); m68ki_jump_vector(vector); /* Use up some clock cycles */ USE_CYCLES(CYC_EXCEPTION[vector]); } #if M68K_EMULATE_TRACE /* Exception for trace mode */ INLINE void m68ki_exception_trace(void) { uint sr = m68ki_init_exception(); #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON CPU_INSTR_MODE = INSTRUCTION_NO; #endif /* M68K_EMULATE_ADDRESS_ERROR */ m68ki_stack_frame_3word(REG_PC, sr); m68ki_jump_vector(EXCEPTION_TRACE); /* Trace nullifies a STOP instruction */ CPU_STOPPED &= ~STOP_LEVEL_STOP; /* Use up some clock cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_TRACE]); } #endif /* Exception for privilege violation */ static void m68ki_exception_privilege_violation(void) { uint sr = m68ki_init_exception(); #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON CPU_INSTR_MODE = INSTRUCTION_NO; #endif /* M68K_EMULATE_ADDRESS_ERROR */ m68ki_stack_frame_3word(REG_PC-2, sr); m68ki_jump_vector(EXCEPTION_PRIVILEGE_VIOLATION); /* Use up some clock cycles and undo the instruction's cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_PRIVILEGE_VIOLATION] - CYC_INSTRUCTION[REG_IR]); } /* Exception for A-Line instructions */ INLINE void m68ki_exception_1010(void) { uint sr = m68ki_init_exception(); m68ki_stack_frame_3word(REG_PC-2, sr); m68ki_jump_vector(EXCEPTION_1010); /* Use up some clock cycles and undo the instruction's cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1010] - CYC_INSTRUCTION[REG_IR]); } /* Exception for F-Line instructions */ INLINE void m68ki_exception_1111(void) { uint sr = m68ki_init_exception(); m68ki_stack_frame_3word(REG_PC-2, sr); m68ki_jump_vector(EXCEPTION_1111); /* Use up some clock cycles and undo the instruction's cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1111] - CYC_INSTRUCTION[REG_IR]); } /* Exception for illegal instructions */ INLINE void m68ki_exception_illegal(void) { uint sr = m68ki_init_exception(); #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON CPU_INSTR_MODE = INSTRUCTION_NO; #endif /* M68K_EMULATE_ADDRESS_ERROR */ m68ki_stack_frame_3word(REG_PC-2, sr); m68ki_jump_vector(EXCEPTION_ILLEGAL_INSTRUCTION); /* Use up some clock cycles and undo the instruction's cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ILLEGAL_INSTRUCTION] - CYC_INSTRUCTION[REG_IR]); } #if M68K_EMULATE_ADDRESS_ERROR /* Exception for address error */ INLINE void m68ki_exception_address_error(void) { uint sr = m68ki_init_exception(); /* If we were processing a bus error, address error, or reset, * this is a catastrophic failure. * Halt the CPU */ if(CPU_RUN_MODE == RUN_MODE_BERR_AERR_RESET) { CPU_STOPPED = STOP_LEVEL_HALT; SET_CYCLES(m68ki_cpu.cycle_end - CYC_INSTRUCTION[REG_IR]); return; } CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET; /* Note: This is implemented for 68000 only! */ m68ki_stack_frame_buserr(sr); m68ki_jump_vector(EXCEPTION_ADDRESS_ERROR); /* Use up some clock cycles and undo the instruction's cycles */ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ADDRESS_ERROR] - CYC_INSTRUCTION[REG_IR]); } #endif /* Service an interrupt request and start exception processing */ INLINE void m68ki_exception_interrupt(uint int_level) { uint vector, sr, new_pc; #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON CPU_INSTR_MODE = INSTRUCTION_NO; #endif /* M68K_EMULATE_ADDRESS_ERROR */ /* Turn off the stopped state */ CPU_STOPPED &= STOP_LEVEL_HALT; /* If we are halted, don't do anything */ if(CPU_STOPPED) return; /* Always use the autovectors. */ vector = EXCEPTION_INTERRUPT_AUTOVECTOR+int_level; /* Start exception processing */ sr = m68ki_init_exception(); /* Set the interrupt mask to the level of the one being serviced */ FLAG_INT_MASK = int_level<<8; /* Acknowledge the interrupt */ m68ki_int_ack(int_level); /* Get the new PC */ new_pc = m68ki_read_data_32(vector<<2); /* If vector is uninitialized, call the uninitialized interrupt vector */ if(new_pc == 0) new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2)); /* Generate a stack frame */ m68ki_stack_frame_3word(REG_PC, sr); m68ki_jump(new_pc); /* Update cycle count now */ USE_CYCLES(CYC_EXCEPTION[vector]); } /* ASG: Check for interrupts */ INLINE void m68ki_check_interrupts(void) { if(CPU_INT_LEVEL > FLAG_INT_MASK) m68ki_exception_interrupt(CPU_INT_LEVEL>>8); } /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ #endif /* M68KCPU__HEADER */ core/sound/ym2413.h000664 001750 001750 00000001071 12702465756 015107 0ustar00sergiosergio000000 000000 /* ** ** File: ym2413.c - software implementation of YM2413 ** FM sound generator type OPLL ** ** Copyright (C) 2002 Jarek Burczynski ** ** Version 1.0 ** */ #ifndef _H_YM2413_ #define _H_YM2413_ extern void YM2413Init(void); extern void YM2413ResetChip(void); extern void YM2413Update(int *buffer, int length); extern void YM2413Write(unsigned int a, unsigned int v); extern unsigned int YM2413Read(void); extern unsigned char *YM2413GetContextPtr(void); extern unsigned int YM2413GetContextSize(void); #endif /*_H_YM2413_*/ core/tremor/backends.h000664 001750 001750 00000010743 12702465756 016110 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: backend and mapping structures ********************************************************************/ /* this is exposed up here because we need it for static modes. Lookups for each backend aren't exposed because there's no reason to do so */ #ifndef _vorbis_backend_h_ #define _vorbis_backend_h_ #include "codec_internal.h" /* this would all be simpler/shorter with templates, but.... */ /* Transform backend generic *************************************/ /* only mdct right now. Flesh it out more if we ever transcend mdct in the transform domain */ /* Floor backend generic *****************************************/ typedef struct{ vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *); vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_mode *, vorbis_info_floor *); void (*free_info) (vorbis_info_floor *); void (*free_look) (vorbis_look_floor *); void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *); int (*inverse2) (struct vorbis_block *,vorbis_look_floor *, void *buffer,ogg_int32_t *); } vorbis_func_floor; typedef struct{ int order; long rate; long barkmap; int ampbits; int ampdB; int numbooks; /* <= 16 */ int books[16]; } vorbis_info_floor0; #define VIF_POSIT 63 #define VIF_CLASS 16 #define VIF_PARTS 31 typedef struct{ int partitions; /* 0 to 31 */ int partitionclass[VIF_PARTS]; /* 0 to 15 */ int class_dim[VIF_CLASS]; /* 1 to 8 */ int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1<>KSR */ UINT8 mul; /* multiple: mul_tab[ML] */ /* Phase Generator */ UINT32 phase; /* frequency counter */ UINT32 freq; /* frequency counter step */ UINT8 fb_shift; /* feedback shift value */ INT32 op1_out[2]; /* slot1 output for feedback */ /* Envelope Generator */ UINT8 eg_type; /* percussive/nonpercussive mode */ UINT8 state; /* phase type */ UINT32 TL; /* total level: TL << 2 */ INT32 TLL; /* adjusted now TL */ INT32 volume; /* envelope counter */ UINT32 sl; /* sustain level: sl_tab[SL] */ UINT8 eg_sh_dp; /* (dump state) */ UINT8 eg_sel_dp; /* (dump state) */ UINT8 eg_sh_ar; /* (attack state) */ UINT8 eg_sel_ar; /* (attack state) */ UINT8 eg_sh_dr; /* (decay state) */ UINT8 eg_sel_dr; /* (decay state) */ UINT8 eg_sh_rr; /* (release state for non-perc.) */ UINT8 eg_sel_rr; /* (release state for non-perc.) */ UINT8 eg_sh_rs; /* (release state for perc.mode) */ UINT8 eg_sel_rs; /* (release state for perc.mode) */ UINT32 key; /* 0 = KEY OFF, >0 = KEY ON */ /* LFO */ UINT32 AMmask; /* LFO Amplitude Modulation enable mask */ UINT8 vib; /* LFO Phase Modulation enable flag (active high)*/ /* waveform select */ unsigned int wavetable; } YM2413_OPLL_SLOT; typedef struct { YM2413_OPLL_SLOT SLOT[2]; /* phase generator state */ UINT32 block_fnum; /* block+fnum */ UINT32 fc; /* Freq. freqement base */ UINT32 ksl_base; /* KeyScaleLevel Base step */ UINT8 kcode; /* key code (for key scaling) */ UINT8 sus; /* sus on/off (release speed in percussive mode) */ } YM2413_OPLL_CH; /* chip state */ typedef struct { YM2413_OPLL_CH P_CH[9]; /* OPLL chips have 9 channels */ UINT8 instvol_r[9]; /* instrument/volume (or volume/volume in percussive mode) */ UINT32 eg_cnt; /* global envelope generator counter */ UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/72 */ UINT32 eg_timer_add; /* step of eg_timer */ UINT32 eg_timer_overflow; /* envelope generator timer overlfows every 1 sample (on real chip) */ UINT8 rhythm; /* Rhythm mode */ /* LFO */ UINT32 lfo_am_cnt; UINT32 lfo_am_inc; UINT32 lfo_pm_cnt; UINT32 lfo_pm_inc; UINT32 noise_rng; /* 23 bit noise shift register */ UINT32 noise_p; /* current noise 'phase' */ UINT32 noise_f; /* current noise period */ /* instrument settings */ /* 0-user instrument 1-15 - fixed instruments 16 -bass drum settings 17,18 - other percussion instruments */ UINT8 inst_tab[19][8]; UINT32 fn_tab[1024]; /* fnumber->increment counter */ UINT8 address; /* address register */ UINT8 status; /* status flag */ double clock; /* master clock (Hz) */ int rate; /* sampling rate (Hz) */ } YM2413; /* key scale level */ /* table is 3dB/octave, DV converts this into 6dB/octave */ /* 0.1875 is bit 0 weight of the envelope counter (volume) expressed in the 'decibel' scale */ #define DV (0.1875/1.0) static const UINT32 ksl_tab[8*16]= { /* OCT 0 */ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, /* OCT 1 */ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV, 1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV, /* OCT 2 */ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV, 3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV, 4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV, /* OCT 3 */ 0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV, 3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV, 6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV, 7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV, /* OCT 4 */ 0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV, 6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV, 9.000/DV, 9.750/DV,10.125/DV,10.500/DV, 10.875/DV,11.250/DV,11.625/DV,12.000/DV, /* OCT 5 */ 0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV, 9.000/DV,10.125/DV,10.875/DV,11.625/DV, 12.000/DV,12.750/DV,13.125/DV,13.500/DV, 13.875/DV,14.250/DV,14.625/DV,15.000/DV, /* OCT 6 */ 0.000/DV, 6.000/DV, 9.000/DV,10.875/DV, 12.000/DV,13.125/DV,13.875/DV,14.625/DV, 15.000/DV,15.750/DV,16.125/DV,16.500/DV, 16.875/DV,17.250/DV,17.625/DV,18.000/DV, /* OCT 7 */ 0.000/DV, 9.000/DV,12.000/DV,13.875/DV, 15.000/DV,16.125/DV,16.875/DV,17.625/DV, 18.000/DV,18.750/DV,19.125/DV,19.500/DV, 19.875/DV,20.250/DV,20.625/DV,21.000/DV }; #undef DV /* sustain level table (3dB per step) */ /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,45 (dB)*/ #define SC(db) (UINT32) ( db * (1.0/ENV_STEP) ) static const UINT32 sl_tab[16]={ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7), SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(15) }; #undef SC #define RATE_STEPS (8) static const unsigned char eg_inc[15*RATE_STEPS]={ /*cycle:0 1 2 3 4 5 6 7*/ /* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..12 0 (increment by 0 or 1) */ /* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..12 1 */ /* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..12 2 */ /* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..12 3 */ /* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 13 0 (increment by 1) */ /* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 13 1 */ /* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 13 2 */ /* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 13 3 */ /* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 14 0 (increment by 2) */ /* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 14 1 */ /*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 14 2 */ /*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 14 3 */ /*12 */ 4,4, 4,4, 4,4, 4,4, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 4) */ /*13 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 2, 15 3 for attack */ /*14 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */ }; #define O(a) (a*RATE_STEPS) /*note that there is no O(13) in this table - it's directly in the code */ static const unsigned char eg_rate_select[16+64+16]={ /* Envelope Generator rates (16 + 64 rates + 16 RKS) */ /* 16 infinite time rates */ O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14), O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14), /* rates 00-12 */ O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), /* rate 13 */ O( 4),O( 5),O( 6),O( 7), /* rate 14 */ O( 8),O( 9),O(10),O(11), /* rate 15 */ O(12),O(12),O(12),O(12), /* 16 dummy rates (same as 15 3) */ O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12), O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12), }; #undef O /*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */ /*shift 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0 */ /*mask 8191, 4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0 */ #define O(a) (a*1) static const unsigned char eg_rate_shift[16+64+16]={ /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */ /* 16 infinite time rates */ O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), /* rates 00-12 */ O(13),O(13),O(13),O(13), O(12),O(12),O(12),O(12), O(11),O(11),O(11),O(11), O(10),O(10),O(10),O(10), O( 9),O( 9),O( 9),O( 9), O( 8),O( 8),O( 8),O( 8), O( 7),O( 7),O( 7),O( 7), O( 6),O( 6),O( 6),O( 6), O( 5),O( 5),O( 5),O( 5), O( 4),O( 4),O( 4),O( 4), O( 3),O( 3),O( 3),O( 3), O( 2),O( 2),O( 2),O( 2), O( 1),O( 1),O( 1),O( 1), /* rate 13 */ O( 0),O( 0),O( 0),O( 0), /* rate 14 */ O( 0),O( 0),O( 0),O( 0), /* rate 15 */ O( 0),O( 0),O( 0),O( 0), /* 16 dummy rates (same as 15 3) */ O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0), O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0), }; #undef O /* multiple table */ #define ML 2 static const UINT8 mul_tab[16]= { /* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,10,12,12,15,15 */ 0.50*ML, 1.00*ML, 2.00*ML, 3.00*ML, 4.00*ML, 5.00*ML, 6.00*ML, 7.00*ML, 8.00*ML, 9.00*ML,10.00*ML,10.00*ML,12.00*ML,12.00*ML,15.00*ML,15.00*ML }; #undef ML /* TL_TAB_LEN is calculated as: * 11 - sinus amplitude bits (Y axis) * 2 - sinus sign bit (Y axis) * TL_RES_LEN - sinus resolution (X axis) */ #define TL_TAB_LEN (11*2*TL_RES_LEN) static signed int tl_tab[TL_TAB_LEN]; #define ENV_QUIET (TL_TAB_LEN>>5) /* sin waveform table in 'decibel' scale */ /* two waveforms on OPLL type chips */ static unsigned int sin_tab[SIN_LEN * 2]; /* LFO Amplitude Modulation table (verified on real YM3812) 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples Length: 210 elements. Each of the elements has to be repeated exactly 64 times (on 64 consecutive samples). The whole table takes: 64 * 210 = 13440 samples. We use data>>1, until we find what it really is on real chip... */ #define LFO_AM_TAB_ELEMENTS 210 static const UINT8 lfo_am_table[LFO_AM_TAB_ELEMENTS] = { 0,0,0,0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3, 4,4,4,4, 5,5,5,5, 6,6,6,6, 7,7,7,7, 8,8,8,8, 9,9,9,9, 10,10,10,10, 11,11,11,11, 12,12,12,12, 13,13,13,13, 14,14,14,14, 15,15,15,15, 16,16,16,16, 17,17,17,17, 18,18,18,18, 19,19,19,19, 20,20,20,20, 21,21,21,21, 22,22,22,22, 23,23,23,23, 24,24,24,24, 25,25,25,25, 26,26,26, 25,25,25,25, 24,24,24,24, 23,23,23,23, 22,22,22,22, 21,21,21,21, 20,20,20,20, 19,19,19,19, 18,18,18,18, 17,17,17,17, 16,16,16,16, 15,15,15,15, 14,14,14,14, 13,13,13,13, 12,12,12,12, 11,11,11,11, 10,10,10,10, 9,9,9,9, 8,8,8,8, 7,7,7,7, 6,6,6,6, 5,5,5,5, 4,4,4,4, 3,3,3,3, 2,2,2,2, 1,1,1,1 }; /* LFO Phase Modulation table (verified on real YM2413) */ static const INT8 lfo_pm_table[8*8] = { /* FNUM2/FNUM = 0 00xxxxxx (0x0000) */ 0, 0, 0, 0, 0, 0, 0, 0, /* FNUM2/FNUM = 0 01xxxxxx (0x0040) */ 1, 0, 0, 0,-1, 0, 0, 0, /* FNUM2/FNUM = 0 10xxxxxx (0x0080) */ 2, 1, 0,-1,-2,-1, 0, 1, /* FNUM2/FNUM = 0 11xxxxxx (0x00C0) */ 3, 1, 0,-1,-3,-1, 0, 1, /* FNUM2/FNUM = 1 00xxxxxx (0x0100) */ 4, 2, 0,-2,-4,-2, 0, 2, /* FNUM2/FNUM = 1 01xxxxxx (0x0140) */ 5, 2, 0,-2,-5,-2, 0, 2, /* FNUM2/FNUM = 1 10xxxxxx (0x0180) */ 6, 3, 0,-3,-6,-3, 0, 3, /* FNUM2/FNUM = 1 11xxxxxx (0x01C0) */ 7, 3, 0,-3,-7,-3, 0, 3, }; /* This is not 100% perfect yet but very close */ /* - multi parameters are 100% correct (instruments and drums) - LFO PM and AM enable are 100% correct - waveform DC and DM select are 100% correct */ static unsigned char table[19][8] = { /* MULT MULT modTL DcDmFb AR/DR AR/DR SL/RR SL/RR */ /* 0 1 2 3 4 5 6 7 */ {0x49, 0x4c, 0x4c, 0x12, 0x00, 0x00, 0x00, 0x00 }, /* 0 */ {0x61, 0x61, 0x1e, 0x17, 0xf0, 0x78, 0x00, 0x17 }, /* 1 */ {0x13, 0x41, 0x1e, 0x0d, 0xd7, 0xf7, 0x13, 0x13 }, /* 2 */ {0x13, 0x01, 0x99, 0x04, 0xf2, 0xf4, 0x11, 0x23 }, /* 3 */ {0x21, 0x61, 0x1b, 0x07, 0xaf, 0x64, 0x40, 0x27 }, /* 4 */ /*{0x22, 0x21, 0x1e, 0x09, 0xf0, 0x76, 0x08, 0x28 }, */ /* 5 */ {0x22, 0x21, 0x1e, 0x06, 0xf0, 0x75, 0x08, 0x18 }, /* 5 */ /*{0x31, 0x22, 0x16, 0x09, 0x90, 0x7f, 0x00, 0x08 }, */ /* 6 */ {0x31, 0x22, 0x16, 0x05, 0x90, 0x71, 0x00, 0x13 }, /* 6 */ {0x21, 0x61, 0x1d, 0x07, 0x82, 0x80, 0x10, 0x17 }, /* 7 */ {0x23, 0x21, 0x2d, 0x16, 0xc0, 0x70, 0x07, 0x07 }, /* 8 */ {0x61, 0x61, 0x1b, 0x06, 0x64, 0x65, 0x10, 0x17 }, /* 9 */ /* {0x61, 0x61, 0x0c, 0x08, 0x85, 0xa0, 0x79, 0x07 }, */ /* A */ {0x61, 0x61, 0x0c, 0x18, 0x85, 0xf0, 0x70, 0x07 }, /* A */ {0x23, 0x01, 0x07, 0x11, 0xf0, 0xa4, 0x00, 0x22 }, /* B */ {0x97, 0xc1, 0x24, 0x07, 0xff, 0xf8, 0x22, 0x12 }, /* C */ /* {0x61, 0x10, 0x0c, 0x08, 0xf2, 0xc4, 0x40, 0xc8 }, */ /* D */ {0x61, 0x10, 0x0c, 0x05, 0xf2, 0xf4, 0x40, 0x44 }, /* D */ {0x01, 0x01, 0x55, 0x03, 0xf3, 0x92, 0xf3, 0xf3 }, /* E */ {0x61, 0x41, 0x89, 0x03, 0xf1, 0xf4, 0xf0, 0x13 }, /* F */ /* drum instruments definitions */ /* MULTI MULTI modTL xxx AR/DR AR/DR SL/RR SL/RR */ /* 0 1 2 3 4 5 6 7 */ {0x01, 0x01, 0x16, 0x00, 0xfd, 0xf8, 0x2f, 0x6d },/* BD(multi verified, modTL verified, mod env - verified(close), carr. env verifed) */ {0x01, 0x01, 0x00, 0x00, 0xd8, 0xd8, 0xf9, 0xf8 },/* HH(multi verified), SD(multi not used) */ {0x05, 0x01, 0x00, 0x00, 0xf8, 0xba, 0x49, 0x55 },/* TOM(multi,env verified), TOP CYM(multi verified, env verified) */ }; static signed int output[2]; static UINT32 LFO_AM; static INT32 LFO_PM; /* emulated chip */ static YM2413 ym2413; /* advance LFO to next sample */ INLINE void advance_lfo(void) { /* LFO */ ym2413.lfo_am_cnt += ym2413.lfo_am_inc; if (ym2413.lfo_am_cnt >= (LFO_AM_TAB_ELEMENTS<> LFO_SH ] >> 1; ym2413.lfo_pm_cnt += ym2413.lfo_pm_inc; LFO_PM = (ym2413.lfo_pm_cnt>>LFO_SH) & 7; } /* advance to next sample */ INLINE void advance(void) { YM2413_OPLL_CH *CH; YM2413_OPLL_SLOT *op; unsigned int i; /* Envelope Generator */ ym2413.eg_timer += ym2413.eg_timer_add; while (ym2413.eg_timer >= ym2413.eg_timer_overflow) { ym2413.eg_timer -= ym2413.eg_timer_overflow; ym2413.eg_cnt++; for (i=0; i<9*2; i++) { CH = &ym2413.P_CH[i>>1]; op = &CH->SLOT[i&1]; switch(op->state) { case EG_DMP: /* dump phase */ /*dump phase is performed by both operators in each channel*/ /*when CARRIER envelope gets down to zero level, ** phases in BOTH opearators are reset (at the same time ?) */ if ( !(ym2413.eg_cnt & ((1<eg_sh_dp)-1) ) ) { op->volume += eg_inc[op->eg_sel_dp + ((ym2413.eg_cnt>>op->eg_sh_dp)&7)]; if ( op->volume >= MAX_ATT_INDEX ) { op->volume = MAX_ATT_INDEX; op->state = EG_ATT; /* restart Phase Generator */ op->phase = 0; } } break; case EG_ATT: /* attack phase */ if ( !(ym2413.eg_cnt & ((1<eg_sh_ar)-1) ) ) { op->volume += (~op->volume * (eg_inc[op->eg_sel_ar + ((ym2413.eg_cnt>>op->eg_sh_ar)&7)]) ) >>2; if (op->volume <= MIN_ATT_INDEX) { op->volume = MIN_ATT_INDEX; op->state = EG_DEC; } } break; case EG_DEC: /* decay phase */ if ( !(ym2413.eg_cnt & ((1<eg_sh_dr)-1) ) ) { op->volume += eg_inc[op->eg_sel_dr + ((ym2413.eg_cnt>>op->eg_sh_dr)&7)]; if ( op->volume >= op->sl ) op->state = EG_SUS; } break; case EG_SUS: /* sustain phase */ /* this is important behaviour: one can change percusive/non-percussive modes on the fly and the chip will remain in sustain phase - verified on real YM3812 */ if(op->eg_type) /* non-percussive mode (sustained tone) */ { /* do nothing */ } else /* percussive mode */ { /* during sustain phase chip adds Release Rate (in percussive mode) */ if ( !(ym2413.eg_cnt & ((1<eg_sh_rr)-1) ) ) { op->volume += eg_inc[op->eg_sel_rr + ((ym2413.eg_cnt>>op->eg_sh_rr)&7)]; if ( op->volume >= MAX_ATT_INDEX ) op->volume = MAX_ATT_INDEX; } /* else do nothing in sustain phase */ } break; case EG_REL: /* release phase */ /* exclude modulators in melody channels from performing anything in this mode*/ /* allowed are only carriers in melody mode and rhythm slots in rhythm mode */ /*This table shows which operators and on what conditions are allowed to perform EG_REL: (a) - always perform EG_REL (n) - never perform EG_REL (r) - perform EG_REL in Rhythm mode ONLY 0: 0 (n), 1 (a) 1: 2 (n), 3 (a) 2: 4 (n), 5 (a) 3: 6 (n), 7 (a) 4: 8 (n), 9 (a) 5: 10(n), 11(a) 6: 12(r), 13(a) 7: 14(r), 15(a) 8: 16(r), 17(a) */ if ( (i&1) || ((ym2413.rhythm&0x20) && (i>=12)) )/* exclude modulators */ { if(op->eg_type) /* non-percussive mode (sustained tone) */ /*this is correct: use RR when SUS = OFF*/ /*and use RS when SUS = ON*/ { if (CH->sus) { if ( !(ym2413.eg_cnt & ((1<eg_sh_rs)-1) ) ) { op->volume += eg_inc[op->eg_sel_rs + ((ym2413.eg_cnt>>op->eg_sh_rs)&7)]; if ( op->volume >= MAX_ATT_INDEX ) { op->volume = MAX_ATT_INDEX; op->state = EG_OFF; } } } else { if ( !(ym2413.eg_cnt & ((1<eg_sh_rr)-1) ) ) { op->volume += eg_inc[op->eg_sel_rr + ((ym2413.eg_cnt>>op->eg_sh_rr)&7)]; if ( op->volume >= MAX_ATT_INDEX ) { op->volume = MAX_ATT_INDEX; op->state = EG_OFF; } } } } else /* percussive mode */ { if ( !(ym2413.eg_cnt & ((1<eg_sh_rs)-1) ) ) { op->volume += eg_inc[op->eg_sel_rs + ((ym2413.eg_cnt>>op->eg_sh_rs)&7)]; if ( op->volume >= MAX_ATT_INDEX ) { op->volume = MAX_ATT_INDEX; op->state = EG_OFF; } } } } break; default: break; } } } for (i=0; i<9*2; i++) { CH = &ym2413.P_CH[i/2]; op = &CH->SLOT[i&1]; /* Phase Generator */ if(op->vib) { UINT8 block; unsigned int fnum_lfo = 8*((CH->block_fnum&0x01c0) >> 6); unsigned int block_fnum = CH->block_fnum * 2; signed int lfo_fn_table_index_offset = lfo_pm_table[LFO_PM + fnum_lfo ]; if (lfo_fn_table_index_offset) /* LFO phase modulation active */ { block_fnum += lfo_fn_table_index_offset; block = (block_fnum&0x1c00) >> 10; op->phase += (ym2413.fn_tab[block_fnum&0x03ff] >> (7-block)) * op->mul; } else /* LFO phase modulation = zero */ { op->phase += op->freq; } } else /* LFO phase modulation disabled for this operator */ { op->phase += op->freq; } } /* The Noise Generator of the YM3812 is 23-bit shift register. * Period is equal to 2^23-2 samples. * Register works at sampling frequency of the chip, so output * can change on every sample. * * Output of the register and input to the bit 22 is: * bit0 XOR bit14 XOR bit15 XOR bit22 * * Simply use bit 22 as the noise output. */ ym2413.noise_p += ym2413.noise_f; i = ym2413.noise_p >> FREQ_SH; /* number of events (shifts of the shift register) */ ym2413.noise_p &= FREQ_MASK; while (i) { /* UINT32 j; j = ( (chip->noise_rng) ^ (chip->noise_rng>>14) ^ (chip->noise_rng>>15) ^ (chip->noise_rng>>22) ) & 1; chip->noise_rng = (j<<22) | (chip->noise_rng>>1); */ /* Instead of doing all the logic operations above, we use a trick here (and use bit 0 as the noise output). The difference is only that the noise bit changes one step ahead. This doesn't matter since we don't know what is real state of the noise_rng after the reset. */ if (ym2413.noise_rng & 1) ym2413.noise_rng ^= 0x800302; ym2413.noise_rng >>= 1; i--; } } INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab) { UINT32 p = (env<<5) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + (pm<<17))) >> FREQ_SH ) & SIN_MASK) ]; if (p >= TL_TAB_LEN) return 0; return tl_tab[p]; } INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab) { UINT32 p = (env<<5) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + pm)) >> FREQ_SH ) & SIN_MASK) ]; if (p >= TL_TAB_LEN) return 0; return tl_tab[p]; } #define volume_calc(OP) ((OP)->TLL + ((UINT32)(OP)->volume) + (LFO_AM & (OP)->AMmask)) /* calculate output */ INLINE void chan_calc( YM2413_OPLL_CH *CH ) { YM2413_OPLL_SLOT *SLOT; unsigned int env; signed int out; signed int phase_modulation; /* phase modulation input (SLOT 2) */ /* SLOT 1 */ SLOT = &CH->SLOT[SLOT1]; env = volume_calc(SLOT); out = SLOT->op1_out[0] + SLOT->op1_out[1]; SLOT->op1_out[0] = SLOT->op1_out[1]; phase_modulation = SLOT->op1_out[0]; SLOT->op1_out[1] = 0; if( env < ENV_QUIET ) { if (!SLOT->fb_shift) out = 0; SLOT->op1_out[1] = op_calc1(SLOT->phase, env, (out<fb_shift), SLOT->wavetable ); } /* SLOT 2 */ SLOT++; env = volume_calc(SLOT); if( env < ENV_QUIET ) { output[0] += op_calc(SLOT->phase, env, phase_modulation, SLOT->wavetable); } } /* operators used in the rhythm sounds generation process: Envelope Generator: channel operator register number Bass High Snare Tom Top / slot number TL ARDR SLRR Wave Drum Hat Drum Tom Cymbal 6 / 0 12 50 70 90 f0 + 6 / 1 15 53 73 93 f3 + 7 / 0 13 51 71 91 f1 + 7 / 1 16 54 74 94 f4 + 8 / 0 14 52 72 92 f2 + 8 / 1 17 55 75 95 f5 + Phase Generator: channel operator register number Bass High Snare Tom Top / slot number MULTIPLE Drum Hat Drum Tom Cymbal 6 / 0 12 30 + 6 / 1 15 33 + 7 / 0 13 31 + + + 7 / 1 16 34 ----- n o t u s e d ----- 8 / 0 14 32 + 8 / 1 17 35 + + channel operator register number Bass High Snare Tom Top number number BLK/FNUM2 FNUM Drum Hat Drum Tom Cymbal 6 12,15 B6 A6 + 7 13,16 B7 A7 + + + 8 14,17 B8 A8 + + + */ /* calculate rhythm */ INLINE void rhythm_calc( YM2413_OPLL_CH *CH, unsigned int noise ) { YM2413_OPLL_SLOT *SLOT; signed int out; unsigned int env; signed int phase_modulation; /* phase modulation input (SLOT 2) */ /* Bass Drum (verified on real YM3812): - depends on the channel 6 'connect' register: when connect = 0 it works the same as in normal (non-rhythm) mode (op1->op2->out) when connect = 1 _only_ operator 2 is present on output (op2->out), operator 1 is ignored - output sample always is multiplied by 2 */ /* SLOT 1 */ SLOT = &CH[6].SLOT[SLOT1]; env = volume_calc(SLOT); out = SLOT->op1_out[0] + SLOT->op1_out[1]; SLOT->op1_out[0] = SLOT->op1_out[1]; phase_modulation = SLOT->op1_out[0]; SLOT->op1_out[1] = 0; if( env < ENV_QUIET ) { if (!SLOT->fb_shift) out = 0; SLOT->op1_out[1] = op_calc1(SLOT->phase, env, (out<fb_shift), SLOT->wavetable ); } /* SLOT 2 */ SLOT++; env = volume_calc(SLOT); if( env < ENV_QUIET ) output[1] += op_calc(SLOT->phase, env, phase_modulation, SLOT->wavetable); /* Phase generation is based on: */ /* HH (13) channel 7->slot 1 combined with channel 8->slot 2 (same combination as TOP CYMBAL but different output phases) */ /* SD (16) channel 7->slot 1 */ /* TOM (14) channel 8->slot 1 */ /* TOP (17) channel 7->slot 1 combined with channel 8->slot 2 (same combination as HIGH HAT but different output phases) */ /* Envelope generation based on: */ /* HH channel 7->slot1 */ /* SD channel 7->slot2 */ /* TOM channel 8->slot1 */ /* TOP channel 8->slot2 */ /* The following formulas can be well optimized. I leave them in direct form for now (in case I've missed something). */ /* High Hat (verified on real YM3812) */ env = volume_calc(&CH[7].SLOT[SLOT1]); if( env < ENV_QUIET ) { /* high hat phase generation: phase = d0 or 234 (based on frequency only) phase = 34 or 2d0 (based on noise) */ /* base frequency derived from operator 1 in channel 7 */ unsigned char bit7 = ((CH[7].SLOT[SLOT1].phase>>FREQ_SH)>>7)&1; unsigned char bit3 = ((CH[7].SLOT[SLOT1].phase>>FREQ_SH)>>3)&1; unsigned char bit2 = ((CH[7].SLOT[SLOT1].phase>>FREQ_SH)>>2)&1; unsigned char res1 = (bit2 ^ bit7) | bit3; /* when res1 = 0 phase = 0x000 | 0xd0; */ /* when res1 = 1 phase = 0x200 | (0xd0>>2); */ UINT32 phase = res1 ? (0x200|(0xd0>>2)) : 0xd0; /* enable gate based on frequency of operator 2 in channel 8 */ unsigned char bit5e= ((CH[8].SLOT[SLOT2].phase>>FREQ_SH)>>5)&1; unsigned char bit3e= ((CH[8].SLOT[SLOT2].phase>>FREQ_SH)>>3)&1; unsigned char res2 = (bit3e | bit5e); /* when res2 = 0 pass the phase from calculation above (res1); */ /* when res2 = 1 phase = 0x200 | (0xd0>>2); */ if (res2) phase = (0x200|(0xd0>>2)); /* when phase & 0x200 is set and noise=1 then phase = 0x200|0xd0 */ /* when phase & 0x200 is set and noise=0 then phase = 0x200|(0xd0>>2), ie no change */ if (phase&0x200) { if (noise) phase = 0x200|0xd0; } else /* when phase & 0x200 is clear and noise=1 then phase = 0xd0>>2 */ /* when phase & 0x200 is clear and noise=0 then phase = 0xd0, ie no change */ { if (noise) phase = 0xd0>>2; } output[1] += op_calc(phase<>FREQ_SH)>>8)&1; /* when bit8 = 0 phase = 0x100; */ /* when bit8 = 1 phase = 0x200; */ UINT32 phase = bit8 ? 0x200 : 0x100; /* Noise bit XOR'es phase by 0x100 */ /* when noisebit = 0 pass the phase from calculation above */ /* when noisebit = 1 phase ^= 0x100; */ /* in other words: phase ^= (noisebit<<8); */ if (noise) phase ^= 0x100; output[1] += op_calc(phase<>FREQ_SH)>>7)&1; unsigned char bit3 = ((CH[7].SLOT[SLOT1].phase>>FREQ_SH)>>3)&1; unsigned char bit2 = ((CH[7].SLOT[SLOT1].phase>>FREQ_SH)>>2)&1; unsigned char res1 = (bit2 ^ bit7) | bit3; /* when res1 = 0 phase = 0x000 | 0x100; */ /* when res1 = 1 phase = 0x200 | 0x100; */ UINT32 phase = res1 ? 0x300 : 0x100; /* enable gate based on frequency of operator 2 in channel 8 */ unsigned char bit5e= ((CH[8].SLOT[SLOT2].phase>>FREQ_SH)>>5)&1; unsigned char bit3e= ((CH[8].SLOT[SLOT2].phase>>FREQ_SH)>>3)&1; unsigned char res2 = (bit3e | bit5e); /* when res2 = 0 pass the phase from calculation above (res1); */ /* when res2 = 1 phase = 0x200 | 0x100; */ if (res2) phase = 0x300; output[1] += op_calc(phase<>= 4; /* 12 bits here */ if (n&1) /* round to nearest */ n = (n>>1)+1; else n = n>>1; /* 11 bits here (rounded) */ tl_tab[ x*2 + 0 ] = n; tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ]; for (i=1; i<11; i++) { tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i; tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ]; } } for (i=0; i0.0) o = 8*log(1.0/m)/log(2); /* convert to 'decibels' */ else o = 8*log(-1.0/m)/log(2); /* convert to 'decibels' */ o = o / (ENV_STEP/4); n = (int)(2.0*o); if (n&1) /* round to nearest */ n = (n>>1)+1; else n = n>>1; /* waveform 0: standard sinus */ sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); /* waveform 1: __ __ */ /* / \____/ \____*/ /* output only first half of the sinus waveform (positive one) */ if (i & (1<<(SIN_BITS-1)) ) sin_tab[1*SIN_LEN+i] = TL_TAB_LEN; else sin_tab[1*SIN_LEN+i] = sin_tab[i]; } return 1; } static void OPLL_initalize(void) { int i; /* YM2413 always running at original frequency */ double freqbase = 1.0; /* make fnumber -> increment counter table */ for( i = 0 ; i < 1024; i++ ) { /* OPLL (YM2413) phase increment counter = 18bit */ ym2413.fn_tab[i] = (UINT32)( (double)i * 64 * freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */ } /* Amplitude modulation: 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples */ /* One entry from LFO_AM_TABLE lasts for 64 samples */ ym2413.lfo_am_inc = (1.0 / 64.0 ) * (1<key ) { /* do NOT restart Phase Generator (verified on real YM2413)*/ /* phase -> Dump */ SLOT->state = EG_DMP; } SLOT->key |= key_set; } INLINE void KEY_OFF(YM2413_OPLL_SLOT *SLOT, UINT32 key_clr) { if( SLOT->key ) { SLOT->key &= key_clr; if( !SLOT->key ) { /* phase -> Release */ if (SLOT->state>EG_REL) SLOT->state = EG_REL; } } } /* update phase increment counter of operator (also update the EG rates if necessary) */ INLINE void CALC_FCSLOT(YM2413_OPLL_CH *CH,YM2413_OPLL_SLOT *SLOT) { int ksr; UINT32 SLOT_rs; UINT32 SLOT_dp; /* (frequency) phase increment counter */ SLOT->freq = CH->fc * SLOT->mul; ksr = CH->kcode >> SLOT->KSR; if( SLOT->ksr != ksr ) { SLOT->ksr = ksr; /* calculate envelope generator rates */ if ((SLOT->ar + SLOT->ksr) < 16+62) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; } else { SLOT->eg_sh_ar = 0; SLOT->eg_sel_ar = 13*RATE_STEPS; } SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ]; SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ]; SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ]; SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ]; } if (CH->sus) SLOT_rs = 16 + (5<<2); else SLOT_rs = 16 + (7<<2); SLOT->eg_sh_rs = eg_rate_shift [SLOT_rs + SLOT->ksr ]; SLOT->eg_sel_rs = eg_rate_select[SLOT_rs + SLOT->ksr ]; SLOT_dp = 16 + (13<<2); SLOT->eg_sh_dp = eg_rate_shift [SLOT_dp + SLOT->ksr ]; SLOT->eg_sel_dp = eg_rate_select[SLOT_dp + SLOT->ksr ]; } /* set multi,am,vib,EG-TYP,KSR,mul */ INLINE void set_mul(int slot,int v) { YM2413_OPLL_CH *CH = &ym2413.P_CH[slot/2]; YM2413_OPLL_SLOT *SLOT = &CH->SLOT[slot&1]; SLOT->mul = mul_tab[v&0x0f]; SLOT->KSR = (v&0x10) ? 0 : 2; SLOT->eg_type = (v&0x20); SLOT->vib = (v&0x40); SLOT->AMmask = (v&0x80) ? ~0 : 0; CALC_FCSLOT(CH,SLOT); } /* set ksl, tl */ INLINE void set_ksl_tl(int chan,int v) { YM2413_OPLL_CH *CH = &ym2413.P_CH[chan]; /* modulator */ YM2413_OPLL_SLOT *SLOT = &CH->SLOT[SLOT1]; int ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */ SLOT->ksl = ksl ? 3-ksl : 31; SLOT->TL = (v&0x3f)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); } /* set ksl , waveforms, feedback */ INLINE void set_ksl_wave_fb(int chan,int v) { YM2413_OPLL_CH *CH = &ym2413.P_CH[chan]; /* modulator */ YM2413_OPLL_SLOT *SLOT = &CH->SLOT[SLOT1]; SLOT->wavetable = ((v&0x08)>>3)*SIN_LEN; SLOT->fb_shift = (v&7) ? (v&7) + 8 : 0; /*carrier*/ SLOT = &CH->SLOT[SLOT2]; SLOT->wavetable = ((v&0x10)>>4)*SIN_LEN; v >>= 6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */ SLOT->ksl = v ? 3-v : 31; SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); } /* set attack rate & decay rate */ INLINE void set_ar_dr(int slot,int v) { YM2413_OPLL_CH *CH = &ym2413.P_CH[slot/2]; YM2413_OPLL_SLOT *SLOT = &CH->SLOT[slot&1]; SLOT->ar = (v>>4) ? 16 + ((v>>4) <<2) : 0; if ((SLOT->ar + SLOT->ksr) < 16+62) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; } else { SLOT->eg_sh_ar = 0; SLOT->eg_sel_ar = 13*RATE_STEPS; } SLOT->dr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0; SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ]; SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ]; } /* set sustain level & release rate */ INLINE void set_sl_rr(int slot,int v) { YM2413_OPLL_CH *CH = &ym2413.P_CH[slot/2]; YM2413_OPLL_SLOT *SLOT = &CH->SLOT[slot&1]; SLOT->sl = sl_tab[ v>>4 ]; SLOT->rr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0; SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ]; SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ]; } static void load_instrument(UINT32 chan, UINT32 slot, UINT8* inst ) { set_mul(slot, inst[0]); set_mul(slot+1, inst[1]); set_ksl_tl(chan, inst[2]); set_ksl_wave_fb(chan, inst[3]); set_ar_dr(slot, inst[4]); set_ar_dr(slot+1, inst[5]); set_sl_rr(slot, inst[6]); set_sl_rr(slot+1, inst[7]); } static void update_instrument_zero(UINT8 r) { UINT8* inst = &ym2413.inst_tab[0][0]; /* point to user instrument */ UINT32 chan; UINT32 chan_max = 9; if (ym2413.rhythm & 0x20) chan_max=6; switch(r&7) { case 0: for (chan=0; chanSLOT[SLOT1]; /* modulator envelope is HH */ SLOT->TL = ((ym2413.instvol_r[7]>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); /* Load instrument settings for channel nine. (Tom-tom and top cymbal) */ load_instrument(8, 16, &ym2413.inst_tab[18][0]); CH = &ym2413.P_CH[8]; SLOT = &CH->SLOT[SLOT1]; /* modulator envelope is TOM */ SLOT->TL = ((ym2413.instvol_r[8]>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); } /* BD key on/off */ if(v&0x10) { KEY_ON (&ym2413.P_CH[6].SLOT[SLOT1], 2); KEY_ON (&ym2413.P_CH[6].SLOT[SLOT2], 2); } else { KEY_OFF(&ym2413.P_CH[6].SLOT[SLOT1],~2); KEY_OFF(&ym2413.P_CH[6].SLOT[SLOT2],~2); } /* HH key on/off */ if(v&0x01) KEY_ON (&ym2413.P_CH[7].SLOT[SLOT1], 2); else KEY_OFF(&ym2413.P_CH[7].SLOT[SLOT1],~2); /* SD key on/off */ if(v&0x08) KEY_ON (&ym2413.P_CH[7].SLOT[SLOT2], 2); else KEY_OFF(&ym2413.P_CH[7].SLOT[SLOT2],~2); /* TOM key on/off */ if(v&0x04) KEY_ON (&ym2413.P_CH[8].SLOT[SLOT1], 2); else KEY_OFF(&ym2413.P_CH[8].SLOT[SLOT1],~2); /* TOP-CY key on/off */ if(v&0x02) KEY_ON (&ym2413.P_CH[8].SLOT[SLOT2], 2); else KEY_OFF(&ym2413.P_CH[8].SLOT[SLOT2],~2); } else { /* rhythm ON to OFF */ if (ym2413.rhythm&0x20) { /* Load instrument settings for channel seven(chan=6 since we're zero based).*/ load_instrument(6, 12, &ym2413.inst_tab[ym2413.instvol_r[6]>>4][0]); /* Load instrument settings for channel eight.*/ load_instrument(7, 14, &ym2413.inst_tab[ym2413.instvol_r[7]>>4][0]); /* Load instrument settings for channel nine.*/ load_instrument(8, 16, &ym2413.inst_tab[ym2413.instvol_r[8]>>4][0]); } /* BD key off */ KEY_OFF(&ym2413.P_CH[6].SLOT[SLOT1],~2); KEY_OFF(&ym2413.P_CH[6].SLOT[SLOT2],~2); /* HH key off */ KEY_OFF(&ym2413.P_CH[7].SLOT[SLOT1],~2); /* SD key off */ KEY_OFF(&ym2413.P_CH[7].SLOT[SLOT2],~2); /* TOM key off */ KEY_OFF(&ym2413.P_CH[8].SLOT[SLOT1],~2); /* TOP-CY off */ KEY_OFF(&ym2413.P_CH[8].SLOT[SLOT2],~2); } ym2413.rhythm = v&0x3f; break; } } break; } case 0x10: case 0x20: { int block_fnum; int chan = r&0x0f; if (chan >= 9) chan -= 9; /* verified on real YM2413 */ CH = &ym2413.P_CH[chan]; if(r&0x10) { /* 10-18: FNUM 0-7 */ block_fnum = (CH->block_fnum&0x0f00) | v; } else { /* 20-28: suson, keyon, block, FNUM 8 */ block_fnum = ((v&0x0f)<<8) | (CH->block_fnum&0xff); if(v&0x10) { KEY_ON (&CH->SLOT[SLOT1], 1); KEY_ON (&CH->SLOT[SLOT2], 1); } else { KEY_OFF(&CH->SLOT[SLOT1],~1); KEY_OFF(&CH->SLOT[SLOT2],~1); } CH->sus = v & 0x20; } /* update */ if(CH->block_fnum != block_fnum) { UINT8 block; CH->block_fnum = block_fnum; /* BLK 2,1,0 bits -> bits 3,2,1 of kcode, FNUM MSB -> kcode LSB */ CH->kcode = (block_fnum&0x0f00)>>8; CH->ksl_base = ksl_tab[block_fnum>>5]; block_fnum = block_fnum * 2; block = (block_fnum&0x1c00) >> 10; CH->fc = ym2413.fn_tab[block_fnum&0x03ff] >> (7-block); /* refresh Total Level in both SLOTs of this channel */ CH->SLOT[SLOT1].TLL = CH->SLOT[SLOT1].TL + (CH->ksl_base>>CH->SLOT[SLOT1].ksl); CH->SLOT[SLOT2].TLL = CH->SLOT[SLOT2].TL + (CH->ksl_base>>CH->SLOT[SLOT2].ksl); /* refresh frequency counter in both SLOTs of this channel */ CALC_FCSLOT(CH,&CH->SLOT[SLOT1]); CALC_FCSLOT(CH,&CH->SLOT[SLOT2]); } break; } case 0x30: /* inst 4 MSBs, VOL 4 LSBs */ { int chan = r&0x0f; if (chan >= 9) chan -= 9; /* verified on real YM2413 */ CH = &ym2413.P_CH[chan]; SLOT = &CH->SLOT[SLOT2]; /* carrier */ SLOT->TL = ((v&0x0f)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); /*check wether we are in rhythm mode and handle instrument/volume register accordingly*/ if ((chan>=6) && (ym2413.rhythm&0x20)) { /* we're in rhythm mode*/ if (chan>=7) /* only for channel 7 and 8 (channel 6 is handled in usual way)*/ { SLOT = &CH->SLOT[SLOT1]; /* modulator envelope is HH(chan=7) or TOM(chan=8) */ SLOT->TL = ((v>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); } } else { if ((ym2413.instvol_r[chan]&0xf0) != (v&0xf0)) { ym2413.instvol_r[chan] = v; /* store for later use */ load_instrument(chan, chan * 2, &ym2413.inst_tab[v>>4][0]); } } break; } default: break; } } void YM2413Init(void) { init_tables(); /* clear */ memset(&ym2413,0,sizeof(YM2413)); /* init global tables */ OPLL_initalize(); } void YM2413ResetChip(void) { int c,s; int i; ym2413.eg_timer = 0; ym2413.eg_cnt = 0; ym2413.noise_rng = 1; /* noise shift register */ /* setup instruments table */ for (i=0; i<19; i++) { for (c=0; c<8; c++) { ym2413.inst_tab[i][c] = table[i][c]; } } /* reset with register write */ OPLLWriteReg(0x0f,0); /*test reg*/ for(i = 0x3f ; i >= 0x10 ; i-- ) OPLLWriteReg(i,0x00); /* reset operator parameters */ for( c = 0 ; c < 9 ; c++ ) { YM2413_OPLL_CH *CH = &ym2413.P_CH[c]; for(s = 0 ; s < 2 ; s++ ) { /* wave table */ CH->SLOT[s].wavetable = 0; CH->SLOT[s].state = EG_OFF; CH->SLOT[s].volume = MAX_ATT_INDEX; } } } /* YM2413 I/O interface */ void YM2413Write(unsigned int a, unsigned int v) { if( !(a&2) ) { if( !(a&1) ) { /* address port */ ym2413.address = v & 0xff; } else { /* data port */ OPLLWriteReg(ym2413.address,v); } } else { /* bit 0 enable/disable FM output (Master System / Mark-III FM adapter specific) */ ym2413.status = v & 0x01; } } unsigned int YM2413Read(void) { /* bit 0 returns latched FM enable status, bits 1-2 return zero (Master System / Mark-III FM adapter specific) */ return 0xF8 | ym2413.status; } void YM2413Update(int *buffer, int length) { int i, out; for( i=0; i < length ; i++ ) { output[0] = 0; output[1] = 0; advance_lfo(); /* FM part */ chan_calc(&ym2413.P_CH[0]); chan_calc(&ym2413.P_CH[1]); chan_calc(&ym2413.P_CH[2]); chan_calc(&ym2413.P_CH[3]); chan_calc(&ym2413.P_CH[4]); chan_calc(&ym2413.P_CH[5]); if(!(ym2413.rhythm&0x20)) { chan_calc(&ym2413.P_CH[6]); chan_calc(&ym2413.P_CH[7]); chan_calc(&ym2413.P_CH[8]); } else /* Rhythm part */ { rhythm_calc(&ym2413.P_CH[0], (ym2413.noise_rng>>0)&1 ); } /* Melody (MO) & Rythm (RO) outputs mixing & amplification (latched bit controls FM output) */ out = (output[0] + (output[1] * 2)) * 2 * ym2413.status; /* Store to stereo sound buffer */ *buffer++ = out; *buffer++ = out; advance(); } } unsigned char *YM2413GetContextPtr(void) { return (unsigned char *)&ym2413; } unsigned int YM2413GetContextSize(void) { return sizeof(YM2413); } core/m68k/m68kcpu.c000664 001750 001750 00000030421 12702465756 015076 0ustar00sergiosergio000000 000000 /* ======================================================================== */ /* MAIN 68K CORE */ /* ======================================================================== */ extern int vdp_68k_irq_ack(int int_level); #define m68ki_cpu m68k #define MUL (7) /* ======================================================================== */ /* ================================ INCLUDES ============================== */ /* ======================================================================== */ #ifndef BUILD_TABLES #include "m68ki_cycles.h" #endif #include "m68kconf.h" #include "m68kcpu.h" #include "m68kops.h" /* ======================================================================== */ /* ================================= DATA ================================= */ /* ======================================================================== */ #ifdef BUILD_TABLES static unsigned char m68ki_cycles[0x10000]; #endif static int irq_latency; m68ki_cpu_core m68k; /* ======================================================================== */ /* =============================== CALLBACKS ============================== */ /* ======================================================================== */ /* Default callbacks used if the callback hasn't been set yet, or if the * callback is set to NULL */ #if M68K_EMULATE_INT_ACK == OPT_ON /* Interrupt acknowledge */ static int default_int_ack_callback(int int_level) { CPU_INT_LEVEL = 0; return M68K_INT_ACK_AUTOVECTOR; } #endif #if M68K_EMULATE_RESET == OPT_ON /* Called when a reset instruction is executed */ static void default_reset_instr_callback(void) { } #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON /* Called when a tas instruction is executed */ static int default_tas_instr_callback(void) { return 1; // allow writeback } #endif #if M68K_EMULATE_FC == OPT_ON /* Called every time there's bus activity (read/write to/from memory */ static void default_set_fc_callback(unsigned int new_fc) { } #endif /* ======================================================================== */ /* ================================= API ================================== */ /* ======================================================================== */ /* Access the internals of the CPU */ unsigned int m68k_get_reg(m68k_register_t regnum) { switch(regnum) { case M68K_REG_D0: return m68ki_cpu.dar[0]; case M68K_REG_D1: return m68ki_cpu.dar[1]; case M68K_REG_D2: return m68ki_cpu.dar[2]; case M68K_REG_D3: return m68ki_cpu.dar[3]; case M68K_REG_D4: return m68ki_cpu.dar[4]; case M68K_REG_D5: return m68ki_cpu.dar[5]; case M68K_REG_D6: return m68ki_cpu.dar[6]; case M68K_REG_D7: return m68ki_cpu.dar[7]; case M68K_REG_A0: return m68ki_cpu.dar[8]; case M68K_REG_A1: return m68ki_cpu.dar[9]; case M68K_REG_A2: return m68ki_cpu.dar[10]; case M68K_REG_A3: return m68ki_cpu.dar[11]; case M68K_REG_A4: return m68ki_cpu.dar[12]; case M68K_REG_A5: return m68ki_cpu.dar[13]; case M68K_REG_A6: return m68ki_cpu.dar[14]; case M68K_REG_A7: return m68ki_cpu.dar[15]; case M68K_REG_PC: return MASK_OUT_ABOVE_32(m68ki_cpu.pc); case M68K_REG_SR: return m68ki_cpu.t1_flag | (m68ki_cpu.s_flag << 11) | m68ki_cpu.int_mask | ((m68ki_cpu.x_flag & XFLAG_SET) >> 4) | ((m68ki_cpu.n_flag & NFLAG_SET) >> 4) | ((!m68ki_cpu.not_z_flag) << 2) | ((m68ki_cpu.v_flag & VFLAG_SET) >> 6) | ((m68ki_cpu.c_flag & CFLAG_SET) >> 8); case M68K_REG_SP: return m68ki_cpu.dar[15]; case M68K_REG_USP: return m68ki_cpu.s_flag ? m68ki_cpu.sp[0] : m68ki_cpu.dar[15]; case M68K_REG_ISP: return m68ki_cpu.s_flag ? m68ki_cpu.dar[15] : m68ki_cpu.sp[4]; #if M68K_EMULATE_PREFETCH case M68K_REG_PREF_ADDR: return m68ki_cpu.pref_addr; case M68K_REG_PREF_DATA: return m68ki_cpu.pref_data; #endif case M68K_REG_IR: return m68ki_cpu.ir; default: return 0; } } void m68k_set_reg(m68k_register_t regnum, unsigned int value) { switch(regnum) { case M68K_REG_D0: REG_D[0] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D1: REG_D[1] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D2: REG_D[2] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D3: REG_D[3] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D4: REG_D[4] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D5: REG_D[5] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D6: REG_D[6] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D7: REG_D[7] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A0: REG_A[0] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A1: REG_A[1] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A2: REG_A[2] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A3: REG_A[3] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A4: REG_A[4] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A5: REG_A[5] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A6: REG_A[6] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A7: REG_A[7] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_PC: m68ki_jump(MASK_OUT_ABOVE_32(value)); return; case M68K_REG_SR: m68ki_set_sr(value); return; case M68K_REG_SP: REG_SP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_USP: if(FLAG_S) REG_USP = MASK_OUT_ABOVE_32(value); else REG_SP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_ISP: if(FLAG_S) REG_SP = MASK_OUT_ABOVE_32(value); else REG_ISP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_IR: REG_IR = MASK_OUT_ABOVE_16(value); return; #if M68K_EMULATE_PREFETCH case M68K_REG_PREF_ADDR: CPU_PREF_ADDR = MASK_OUT_ABOVE_32(value); return; #endif default: return; } } /* Set the callbacks */ #if M68K_EMULATE_INT_ACK == OPT_ON void m68k_set_int_ack_callback(int (*callback)(int int_level)) { CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback; } #endif #if M68K_EMULATE_RESET == OPT_ON void m68k_set_reset_instr_callback(void (*callback)(void)) { CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback; } #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON void m68k_set_tas_instr_callback(int (*callback)(void)) { CALLBACK_TAS_INSTR = callback ? callback : default_tas_instr_callback; } #endif #if M68K_EMULATE_FC == OPT_ON void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)) { CALLBACK_SET_FC = callback ? callback : default_set_fc_callback; } #endif #ifdef LOGVDP extern void error(char *format, ...); extern uint16 v_counter; #endif /* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ /* KS: Modified so that IPL* bits match with mask positions in the SR * and cleaned out remenants of the interrupt controller. */ void m68k_update_irq(unsigned int mask) { /* Update IRQ level */ CPU_INT_LEVEL |= (mask << 8); #ifdef LOGVDP error("[%d(%d)][%d(%d)] IRQ Level = %d(0x%02x) (%x)\n", v_counter, m68k.cycles/3420, m68k.cycles, m68k.cycles%3420,CPU_INT_LEVEL>>8,FLAG_INT_MASK,m68k_get_reg(M68K_REG_PC)); #endif } void m68k_set_irq(unsigned int int_level) { /* Set IRQ level */ CPU_INT_LEVEL = int_level << 8; #ifdef LOGVDP error("[%d(%d)][%d(%d)] IRQ Level = %d(0x%02x) (%x)\n", v_counter, m68k.cycles/3420, m68k.cycles, m68k.cycles%3420,CPU_INT_LEVEL>>8,FLAG_INT_MASK,m68k_get_reg(M68K_REG_PC)); #endif } /* IRQ latency (Fatal Rewind, Sesame's Street Counting Cafe)*/ void m68k_set_irq_delay(unsigned int int_level) { /* Prevent reentrance */ if (!irq_latency) { /* This is always triggered from MOVE instructions (VDP CTRL port write) */ /* We just make sure this is not a MOVE.L instruction as we could be in */ /* the middle of its execution (first memory write). */ if ((REG_IR & 0xF000) != 0x2000) { /* Finish executing current instruction */ USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* One instruction delay before interrupt */ irq_latency = 1; m68ki_trace_t1() /* auto-disable (see m68kcpu.h) */ m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */ REG_IR = m68ki_read_imm_16(); m68ki_instruction_jump_table[REG_IR](); m68ki_exception_if_trace() /* auto-disable (see m68kcpu.h) */ irq_latency = 0; } /* Set IRQ level */ CPU_INT_LEVEL = int_level << 8; } #ifdef LOGVDP error("[%d(%d)][%d(%d)] IRQ Level = %d(0x%02x) (%x)\n", v_counter, m68k.cycles/3420, m68k.cycles, m68k.cycles%3420,CPU_INT_LEVEL>>8,FLAG_INT_MASK,m68k_get_reg(M68K_REG_PC)); #endif /* Check interrupt mask to process IRQ */ m68ki_check_interrupts(); /* Level triggered (IRQ) */ } void m68k_run(unsigned int cycles) { /* Make sure CPU is not already ahead */ if (m68k.cycles >= cycles) { return; } /* Check interrupt mask to process IRQ if needed */ m68ki_check_interrupts(); /* Make sure we're not stopped */ if (CPU_STOPPED) { m68k.cycles = cycles; return; } /* Save end cycles count for when CPU is stopped */ m68k.cycle_end = cycles; /* Return point for when we have an address error (TODO: use goto) */ m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */ #ifdef LOGVDP error("[%d][%d] m68k run to %d cycles (%x), irq mask = %x (%x)\n", v_counter, m68k.cycles, cycles, m68k.pc,FLAG_INT_MASK, CPU_INT_LEVEL); #endif while (m68k.cycles < cycles) { /* Set tracing accodring to T1. */ m68ki_trace_t1() /* auto-disable (see m68kcpu.h) */ /* Set the address space for reads */ m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */ /* Decode next instruction */ REG_IR = m68ki_read_imm_16(); /* Execute instruction */ m68ki_instruction_jump_table[REG_IR](); USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* Trace m68k_exception, if necessary */ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ } } void m68k_init(void) { #ifdef BUILD_TABLES static uint emulation_initialized = 0; /* The first call to this function initializes the opcode handler jump table */ if(!emulation_initialized) { m68ki_build_opcode_table(); emulation_initialized = 1; } #endif #if M68K_EMULATE_INT_ACK == OPT_ON m68k_set_int_ack_callback(NULL); #endif #if M68K_EMULATE_RESET == OPT_ON m68k_set_reset_instr_callback(NULL); #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON m68k_set_tas_instr_callback(NULL); #endif #if M68K_EMULATE_FC == OPT_ON m68k_set_fc_callback(NULL); #endif } /* Pulse the RESET line on the CPU */ void m68k_pulse_reset(void) { /* Clear all stop levels */ CPU_STOPPED = 0; #if M68K_EMULATE_ADDRESS_ERROR CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET; #endif /* Turn off tracing */ FLAG_T1 = 0; m68ki_clear_trace() /* Interrupt mask to level 7 */ FLAG_INT_MASK = 0x0700; CPU_INT_LEVEL = 0; irq_latency = 0; /* Go to supervisor mode */ m68ki_set_s_flag(SFLAG_SET); /* Invalidate the prefetch queue */ #if M68K_EMULATE_PREFETCH /* Set to arbitrary number since our first fetch is from 0 */ CPU_PREF_ADDR = 0x1000; #endif /* M68K_EMULATE_PREFETCH */ /* Read the initial stack pointer and program counter */ m68ki_jump(0); REG_SP = m68ki_read_imm_32(); REG_PC = m68ki_read_imm_32(); m68ki_jump(REG_PC); #if M68K_EMULATE_ADDRESS_ERROR CPU_RUN_MODE = RUN_MODE_NORMAL; #endif USE_CYCLES(CYC_EXCEPTION[EXCEPTION_RESET]); } void m68k_pulse_halt(void) { /* Pulse the HALT line on the CPU */ CPU_STOPPED |= STOP_LEVEL_HALT; } void m68k_clear_halt(void) { /* Clear the HALT line on the CPU */ CPU_STOPPED &= ~STOP_LEVEL_HALT; } /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ core/tremor/vorbisfile.c000664 001750 001750 00000132770 12702465756 016502 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: stdio-based convenience library for opening/seeking/decoding last mod: $Id: vorbisfile.c,v 1.6 2003/03/30 23:40:56 xiphmont Exp $ ********************************************************************/ #include #include #include #include #include #include "ivorbiscodec.h" #include "ivorbisfile.h" #include "misc.h" /* A 'chained bitstream' is a Vorbis bitstream that contains more than one logical bitstream arranged end to end (the only form of Ogg multiplexing allowed in a Vorbis bitstream; grouping [parallel multiplexing] is not allowed in Vorbis) */ /* A Vorbis file can be played beginning to end (streamed) without worrying ahead of time about chaining (see decoder_example.c). If we have the whole file, however, and want random access (seeking/scrubbing) or desire to know the total length/time of a file, we need to account for the possibility of chaining. */ /* We can handle things a number of ways; we can determine the entire bitstream structure right off the bat, or find pieces on demand. This example determines and caches structure for the entire bitstream, but builds a virtual decoder on the fly when moving between links in the chain. */ /* There are also different ways to implement seeking. Enough information exists in an Ogg bitstream to seek to sample-granularity positions in the output. Or, one can seek by picking some portion of the stream roughly in the desired area if we only want coarse navigation through the stream. */ /************************************************************************* * Many, many internal helpers. The intention is not to be confusing; * rampant duplication and monolithic function implementation would be * harder to understand anyway. The high level functions are last. Begin * grokking near the end of the file */ /* read a little more data from the file/pipe into the ogg_sync framer */ static long _get_data(OggVorbis_File *vf){ errno=0; if(vf->datasource){ unsigned char *buffer=ogg_sync_bufferin(vf->oy,CHUNKSIZE); long bytes=(vf->callbacks.read_func)(buffer,1,CHUNKSIZE,vf->datasource); if(bytes>0)ogg_sync_wrote(vf->oy,bytes); #ifndef GEKKO else if(bytes==0 && errno ) #else // Not sure what is up with this... appears that EOVERFLOW is set whenever // we read to the end of the file... // original patch by raz0red for Mednafen-Wii else if(bytes==0 && errno && errno != EOVERFLOW ) #endif { return(-1); } return(bytes); }else return(0); } /* save a tiny smidge of verbosity to make the code more readable */ static void _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ if(vf->datasource){ (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET); vf->offset=offset; ogg_sync_reset(vf->oy); }else{ /* shouldn't happen unless someone writes a broken callback */ return; } } /* The read/seek functions track absolute position within the stream */ /* from the head of the stream, get the next page. boundary specifies if the function is allowed to fetch more data from the stream (and how much) or only use internally buffered data. boundary: -1) unbounded search 0) read no additional data; use cached only n) search for a new page beginning for n bytes return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) n) found a page at absolute offset n produces a refcounted page */ static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, ogg_int64_t boundary){ if(boundary>0)boundary+=vf->offset; while(1){ long more; if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); more=ogg_sync_pageseek(vf->oy,og); if(more<0){ /* skipped n bytes */ vf->offset-=more; }else{ if(more==0){ /* send more paramedics */ if(!boundary)return(OV_FALSE); { long ret=_get_data(vf); if(ret==0)return(OV_EOF); if(ret<0)return(OV_EREAD); } }else{ /* got a page. Return the offset at the page beginning, advance the internal offset past the page end */ ogg_int64_t ret=vf->offset; vf->offset+=more; return(ret); } } } } /* find the latest page beginning before the current stream cursor position. Much dirtier than the above as Ogg doesn't have any backward search linkage. no 'readp' as it will certainly have to read. */ /* returns offset or OV_EREAD, OV_FAULT and produces a refcounted page */ static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){ ogg_int64_t begin=vf->offset; ogg_int64_t end=begin; ogg_int64_t ret; ogg_int64_t offset=-1; while(offset==-1){ begin-=CHUNKSIZE; if(begin<0) begin=0; _seek_helper(vf,begin); while(vf->offsetoffset); if(ret==OV_EREAD)return(OV_EREAD); if(ret<0){ break; }else{ offset=ret; } } } /* we have the offset. Actually snork and hold the page now */ _seek_helper(vf,offset); ret=_get_next_page(vf,og,CHUNKSIZE); if(ret<0) /* this shouldn't be possible */ return(OV_EFAULT); return(offset); } /* finds each bitstream link one at a time using a bisection search (has to begin by knowing the offset of the lb's initial page). Recurses for each link so it can alloc the link storage after finding them all, then unroll and fill the cache at the same time */ static int _bisect_forward_serialno(OggVorbis_File *vf, ogg_int64_t begin, ogg_int64_t searched, ogg_int64_t end, ogg_uint32_t currentno, long m){ ogg_int64_t endsearched=end; ogg_int64_t next=end; ogg_page og={0,0,0,0}; ogg_int64_t ret; /* the below guards against garbage seperating the last and first pages of two links. */ while(searched=0)next=ret; }else{ searched=ret+og.header_len+og.body_len; } ogg_page_release(&og); } _seek_helper(vf,next); ret=_get_next_page(vf,&og,-1); if(ret==OV_EREAD)return(OV_EREAD); if(searched>=end || ret<0){ ogg_page_release(&og); vf->links=m+1; vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos)); vf->offsets[m+1]=searched; }else{ ret=_bisect_forward_serialno(vf,next,vf->offset, end,ogg_page_serialno(&og),m+1); ogg_page_release(&og); if(ret==OV_EREAD)return(OV_EREAD); } vf->offsets[m]=begin; vf->serialnos[m]=currentno; return(0); } /* uses the local ogg_stream storage in vf; this is important for non-streaming input sources */ /* consumes the page that's passed in (if any) */ static int _fetch_headers(OggVorbis_File *vf, vorbis_info *vi, vorbis_comment *vc, ogg_uint32_t *serialno, ogg_page *og_ptr){ ogg_page og={0,0,0,0}; ogg_packet op={0,0,0,0,0,0}; int i,ret; if(!og_ptr){ ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); if(llret==OV_EREAD)return(OV_EREAD); if(llret<0)return OV_ENOTVORBIS; og_ptr=&og; } ogg_stream_reset_serialno(vf->os,ogg_page_serialno(og_ptr)); if(serialno)*serialno=vf->os->serialno; vf->ready_state=STREAMSET; /* extract the initial header from the first page and verify that the Ogg bitstream is in fact Vorbis data */ vorbis_info_init(vi); vorbis_comment_init(vc); i=0; while(i<3){ ogg_stream_pagein(vf->os,og_ptr); while(i<3){ int result=ogg_stream_packetout(vf->os,&op); if(result==0)break; if(result==-1){ ret=OV_EBADHEADER; goto bail_header; } if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ goto bail_header; } i++; } if(i<3) if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ ret=OV_EBADHEADER; goto bail_header; } } ogg_packet_release(&op); ogg_page_release(&og); return 0; bail_header: ogg_packet_release(&op); ogg_page_release(&og); vorbis_info_clear(vi); vorbis_comment_clear(vc); vf->ready_state=OPENED; return ret; } /* last step of the OggVorbis_File initialization; get all the vorbis_info structs and PCM positions. Only called by the seekable initialization (local stream storage is hacked slightly; pay attention to how that's done) */ /* this is void and does not propogate errors up because we want to be able to open and use damaged bitstreams as well as we can. Just watch out for missing information for links in the OggVorbis_File struct */ static void _prefetch_all_headers(OggVorbis_File *vf, ogg_int64_t dataoffset){ ogg_page og={0,0,0,0}; int i; ogg_int64_t ret; vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); for(i=0;ilinks;i++){ if(i==0){ /* we already grabbed the initial header earlier. Just set the offset */ vf->dataoffsets[i]=dataoffset; _seek_helper(vf,dataoffset); }else{ /* seek to the location of the initial header */ _seek_helper(vf,vf->offsets[i]); if(_fetch_headers(vf,vf->vi+i,vf->vc+i,NULL,NULL)<0){ vf->dataoffsets[i]=-1; }else{ vf->dataoffsets[i]=vf->offset; } } /* fetch beginning PCM offset */ if(vf->dataoffsets[i]!=-1){ ogg_int64_t accumulated=0,pos; long lastblock=-1; int result; ogg_stream_reset_serialno(vf->os,vf->serialnos[i]); while(1){ ogg_packet op={0,0,0,0,0,0}; ret=_get_next_page(vf,&og,-1); if(ret<0) /* this should not be possible unless the file is truncated/mangled */ break; if(ogg_page_serialno(&og)!=vf->serialnos[i]) break; pos=ogg_page_granulepos(&og); /* count blocksizes of all frames in the page */ ogg_stream_pagein(vf->os,&og); while((result=ogg_stream_packetout(vf->os,&op))){ if(result>0){ /* ignore holes */ long thisblock=vorbis_packet_blocksize(vf->vi+i,&op); if(lastblock!=-1) accumulated+=(lastblock+thisblock)>>2; lastblock=thisblock; } } ogg_packet_release(&op); if(pos!=-1){ /* pcm offset of last packet on the first audio page */ accumulated= pos-accumulated; break; } } /* less than zero? This is a stream with samples trimmed off the beginning, a normal occurrence; set the offset to zero */ if(accumulated<0)accumulated=0; vf->pcmlengths[i*2]=accumulated; } /* get the PCM length of this link. To do this, get the last page of the stream */ { ogg_int64_t end=vf->offsets[i+1]; _seek_helper(vf,end); while(1){ ret=_get_prev_page(vf,&og); if(ret<0){ /* this should not be possible */ vorbis_info_clear(vf->vi+i); vorbis_comment_clear(vf->vc+i); break; } if(ogg_page_granulepos(&og)!=-1){ vf->pcmlengths[i*2+1]=ogg_page_granulepos(&og)-vf->pcmlengths[i*2]; break; } vf->offset=ret; } } } ogg_page_release(&og); } static void _make_decode_ready(OggVorbis_File *vf){ if(vf->ready_state!=STREAMSET)return; if(vf->seekable){ vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link); }else{ vorbis_synthesis_init(&vf->vd,vf->vi); } vorbis_block_init(&vf->vd,&vf->vb); vf->ready_state=INITSET; vf->bittrack=0; vf->samptrack=0; return; } static int _open_seekable2(OggVorbis_File *vf){ ogg_uint32_t serialno=vf->current_serialno; ogg_uint32_t tempserialno; ogg_int64_t dataoffset=vf->offset, end; ogg_page og={0,0,0,0}; /* we're partially open and have a first link header state in storage in vf */ /* we can seek, so set out learning all about this file */ (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); /* We get the offset for the last page of the physical bitstream. Most OggVorbis files will contain a single logical bitstream */ end=_get_prev_page(vf,&og); if(end<0)return(end); /* more than one logical bitstream? */ tempserialno=ogg_page_serialno(&og); ogg_page_release(&og); if(tempserialno!=serialno){ /* Chained bitstream. Bisect-search each logical bitstream section. Do so based on serial number only */ if(_bisect_forward_serialno(vf,0,0,end+1,serialno,0)<0)return(OV_EREAD); }else{ /* Only one logical bitstream */ if(_bisect_forward_serialno(vf,0,end,end+1,serialno,0))return(OV_EREAD); } /* the initial header memory is referenced by vf after; don't free it */ _prefetch_all_headers(vf,dataoffset); return(ov_raw_seek(vf,0)); } /* clear out the current logical bitstream decoder */ static void _decode_clear(OggVorbis_File *vf){ vorbis_dsp_clear(&vf->vd); vorbis_block_clear(&vf->vb); vf->ready_state=OPENED; } /* fetch and process a packet. Handles the case where we're at a bitstream boundary and dumps the decoding machine. If the decoding machine is unloaded, it loads it. It also keeps pcm_offset up to date (seek and read both use this. seek uses a special hack with readp). return: <0) error, OV_HOLE (lost packet) or OV_EOF 0) need more data (only if readp==0) 1) got a packet */ static int _fetch_and_process_packet(OggVorbis_File *vf, int readp, int spanp){ ogg_page og={0,0,0,0}; ogg_packet op={0,0,0,0,0,0}; int ret=0; /* handle one packet. Try to fetch it from current stream state */ /* extract packets from page */ while(1){ /* process a packet if we can. If the machine isn't loaded, neither is a page */ if(vf->ready_state==INITSET){ while(1) { int result=ogg_stream_packetout(vf->os,&op); ogg_int64_t granulepos; if(result<0){ ret=OV_HOLE; /* hole in the data. */ goto cleanup; } if(result>0){ /* got a packet. process it */ granulepos=op.granulepos; if(!vorbis_synthesis(&vf->vb,&op,1)){ /* lazy check for lazy header handling. The header packets aren't audio, so if/when we submit them, vorbis_synthesis will reject them */ /* suck in the synthesis data and track bitrate */ { int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); /* for proper use of libvorbis within libvorbisfile, oldsamples will always be zero. */ if(oldsamples){ ret=OV_EFAULT; goto cleanup; } vorbis_synthesis_blockin(&vf->vd,&vf->vb); vf->samptrack+=vorbis_synthesis_pcmout(&vf->vd,NULL)-oldsamples; vf->bittrack+=op.bytes*8; } /* update the pcm offset. */ if(granulepos!=-1 && !op.e_o_s){ int link=(vf->seekable?vf->current_link:0); int i,samples; /* this packet has a pcm_offset on it (the last packet completed on a page carries the offset) After processing (above), we know the pcm position of the *last* sample ready to be returned. Find the offset of the *first* As an aside, this trick is inaccurate if we begin reading anew right at the last page; the end-of-stream granulepos declares the last frame in the stream, and the last packet of the last page may be a partial frame. So, we need a previous granulepos from an in-sequence page to have a reference point. Thus the !op.e_o_s clause above */ if(vf->seekable && link>0) granulepos-=vf->pcmlengths[link*2]; if(granulepos<0)granulepos=0; /* actually, this shouldn't be possible here unless the stream is very broken */ samples=vorbis_synthesis_pcmout(&vf->vd,NULL); granulepos-=samples; for(i=0;ipcmlengths[i*2+1]; vf->pcm_offset=granulepos; } ret=1; goto cleanup; } } else break; } } if(vf->ready_state>=OPENED){ int ret; if(!readp){ ret=0; goto cleanup; } if((ret=_get_next_page(vf,&og,-1))<0){ ret=OV_EOF; /* eof. leave unitialized */ goto cleanup; } /* bitrate tracking; add the header's bytes here, the body bytes are done by packet above */ vf->bittrack+=og.header_len*8; /* has our decoding just traversed a bitstream boundary? */ if(vf->ready_state==INITSET){ if(vf->current_serialno!=ogg_page_serialno(&og)){ if(!spanp){ ret=OV_EOF; goto cleanup; } _decode_clear(vf); if(!vf->seekable){ vorbis_info_clear(vf->vi); vorbis_comment_clear(vf->vc); } } } } /* Do we need to load a new machine before submitting the page? */ /* This is different in the seekable and non-seekable cases. In the seekable case, we already have all the header information loaded and cached; we just initialize the machine with it and continue on our merry way. In the non-seekable (streaming) case, we'll only be at a boundary if we just left the previous logical bitstream and we're now nominally at the header of the next bitstream */ if(vf->ready_state!=INITSET){ int link; if(vf->ready_stateseekable){ vf->current_serialno=ogg_page_serialno(&og); /* match the serialno to bitstream section. We use this rather than offset positions to avoid problems near logical bitstream boundaries */ for(link=0;linklinks;link++) if(vf->serialnos[link]==vf->current_serialno)break; if(link==vf->links){ ret=OV_EBADLINK; /* sign of a bogus stream. error out, leave machine uninitialized */ goto cleanup; } vf->current_link=link; ogg_stream_reset_serialno(vf->os,vf->current_serialno); vf->ready_state=STREAMSET; }else{ /* we're streaming */ /* fetch the three header packets, build the info struct */ int ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,&og); if(ret) goto cleanup; vf->current_link++; link=0; } } _make_decode_ready(vf); } ogg_stream_pagein(vf->os,&og); } cleanup: ogg_packet_release(&op); ogg_page_release(&og); return ret; } /* if, eg, 64 bit stdio is configured by default, this will build with fseek64 */ static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ if(f==NULL)return(-1); return fseek(f,off,whence); } static int _ov_open1(void *f,OggVorbis_File *vf,char *initial, long ibytes, ov_callbacks callbacks){ int offsettest=(f?callbacks.seek_func(f,0,SEEK_CUR):-1); int ret; memset(vf,0,sizeof(*vf)); vf->datasource=f; vf->callbacks = callbacks; /* init the framing state */ vf->oy=ogg_sync_create(); /* perhaps some data was previously read into a buffer for testing against other stream types. Allow initialization from this previously read data (as we may be reading from a non-seekable stream) */ if(initial){ unsigned char *buffer=ogg_sync_bufferin(vf->oy,ibytes); memcpy(buffer,initial,ibytes); ogg_sync_wrote(vf->oy,ibytes); } /* can we seek? Stevens suggests the seek test was portable */ if(offsettest!=-1)vf->seekable=1; /* No seeking yet; Set up a 'single' (current) logical bitstream entry for partial open */ vf->links=1; vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi)); vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc)); vf->os=ogg_stream_create(-1); /* fill in the serialno later */ /* Try to fetch the headers, maintaining all the storage */ if((ret=_fetch_headers(vf,vf->vi,vf->vc,&vf->current_serialno,NULL))<0){ vf->datasource=NULL; ov_clear(vf); }else if(vf->ready_state < PARTOPEN) vf->ready_state=PARTOPEN; return(ret); } static int _ov_open2(OggVorbis_File *vf){ if(vf->ready_state < OPENED) vf->ready_state=OPENED; if(vf->seekable){ int ret=_open_seekable2(vf); if(ret){ vf->datasource=NULL; ov_clear(vf); } return(ret); } return 0; } /* clear out the OggVorbis_File struct */ int ov_clear(OggVorbis_File *vf){ if(vf){ vorbis_block_clear(&vf->vb); vorbis_dsp_clear(&vf->vd); ogg_stream_destroy(vf->os); if(vf->vi && vf->links){ int i; for(i=0;ilinks;i++){ vorbis_info_clear(vf->vi+i); vorbis_comment_clear(vf->vc+i); } _ogg_free(vf->vi); _ogg_free(vf->vc); } if(vf->dataoffsets)_ogg_free(vf->dataoffsets); if(vf->pcmlengths)_ogg_free(vf->pcmlengths); if(vf->serialnos)_ogg_free(vf->serialnos); if(vf->offsets)_ogg_free(vf->offsets); ogg_sync_destroy(vf->oy); if(vf->datasource)(vf->callbacks.close_func)(vf->datasource); memset(vf,0,sizeof(*vf)); } #ifdef DEBUG_LEAKS _VDBG_dump(); #endif return(0); } /* inspects the OggVorbis file and finds/documents all the logical bitstreams contained in it. Tries to be tolerant of logical bitstream sections that are truncated/woogie. return: -1) error 0) OK */ int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, ov_callbacks callbacks){ int ret=_ov_open1(f,vf,initial,ibytes,callbacks); if(ret)return ret; return _ov_open2(vf); } int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){ ov_callbacks callbacks = { (size_t (*)(void *, size_t, size_t, void *)) fread, (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, (int (*)(void *)) fclose, (long (*)(void *)) ftell }; return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); } /* Only partially open the vorbis file; test for Vorbisness, and load the headers for the first chain. Do not seek (although test for seekability). Use ov_test_open to finish opening the file, else ov_clear to close/free it. Same return codes as open. */ int ov_test_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, ov_callbacks callbacks) { return _ov_open1(f,vf,initial,ibytes,callbacks); } int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){ ov_callbacks callbacks = { (size_t (*)(void *, size_t, size_t, void *)) fread, (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, (int (*)(void *)) fclose, (long (*)(void *)) ftell }; return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); } int ov_test_open(OggVorbis_File *vf){ if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); return _ov_open2(vf); } /* How many logical bitstreams in this physical bitstream? */ long ov_streams(OggVorbis_File *vf){ return vf->links; } /* Is the FILE * associated with vf seekable? */ long ov_seekable(OggVorbis_File *vf){ return vf->seekable; } /* returns the bitrate for a given logical bitstream or the entire physical bitstream. If the file is open for random access, it will find the *actual* average bitrate. If the file is streaming, it returns the nominal bitrate (if set) else the average of the upper/lower bounds (if set) else -1 (unset). If you want the actual bitrate field settings, get them from the vorbis_info structs */ long ov_bitrate(OggVorbis_File *vf,int i){ if(vf->ready_state=vf->links)return(OV_EINVAL); if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); if(i<0){ ogg_int64_t bits=0; int i; for(i=0;ilinks;i++) bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; /* This once read: return(rint(bits/ov_time_total(vf,-1))); * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, * so this is slightly transformed to make it work. */ return(bits*1000/ov_time_total(vf,-1)); }else{ if(vf->seekable){ /* return the actual bitrate */ return((vf->offsets[i+1]-vf->dataoffsets[i])*8000/ov_time_total(vf,i)); }else{ /* return nominal if set */ if(vf->vi[i].bitrate_nominal>0){ return vf->vi[i].bitrate_nominal; }else{ if(vf->vi[i].bitrate_upper>0){ if(vf->vi[i].bitrate_lower>0){ return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; }else{ return vf->vi[i].bitrate_upper; } } return(OV_FALSE); } } } } /* returns the actual bitrate since last call. returns -1 if no additional data to offer since last call (or at beginning of stream), EINVAL if stream is only partially open */ long ov_bitrate_instant(OggVorbis_File *vf){ int link=(vf->seekable?vf->current_link:0); long ret; if(vf->ready_statesamptrack==0)return(OV_FALSE); ret=vf->bittrack/vf->samptrack*vf->vi[link].rate; vf->bittrack=0; vf->samptrack=0; return(ret); } /* Guess */ long ov_serialnumber(OggVorbis_File *vf,int i){ if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); if(i<0){ return(vf->current_serialno); }else{ return(vf->serialnos[i]); } } /* returns: total raw (compressed) length of content if i==-1 raw (compressed) length of that logical bitstream for i==0 to n OV_EINVAL if the stream is not seekable (we can't know the length) or if stream is only partially open */ ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); if(i<0){ ogg_int64_t acc=0; int i; for(i=0;ilinks;i++) acc+=ov_raw_total(vf,i); return(acc); }else{ return(vf->offsets[i+1]-vf->offsets[i]); } } /* returns: total PCM length (samples) of content if i==-1 PCM length (samples) of that logical bitstream for i==0 to n OV_EINVAL if the stream is not seekable (we can't know the length) or only partially open */ ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); if(i<0){ ogg_int64_t acc=0; int i; for(i=0;ilinks;i++) acc+=ov_pcm_total(vf,i); return(acc); }else{ return(vf->pcmlengths[i*2+1]); } } /* returns: total milliseconds of content if i==-1 milliseconds in that logical bitstream for i==0 to n OV_EINVAL if the stream is not seekable (we can't know the length) or only partially open */ ogg_int64_t ov_time_total(OggVorbis_File *vf,int i){ if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); if(i<0){ ogg_int64_t acc=0; int i; for(i=0;ilinks;i++) acc+=ov_time_total(vf,i); return(acc); }else{ return(((ogg_int64_t)vf->pcmlengths[i*2+1])*1000/vf->vi[i].rate); } } /* seek to an offset relative to the *compressed* data. This also scans packets to update the PCM cursor. It will cross a logical bitstream boundary, but only if it can't get any packets out of the tail of the bitstream we seek to (so no surprises). returns zero on success, nonzero on failure */ int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ ogg_stream_state *work_os=NULL; ogg_page og={0,0,0,0}; ogg_packet op={0,0,0,0,0,0}; if(vf->ready_stateseekable) return(OV_ENOSEEK); /* don't dump machine if we can't seek */ if(pos<0 || pos>vf->end)return(OV_EINVAL); /* don't yet clear out decoding machine (if it's initialized), in the case we're in the same link. Restart the decode lapping, and let _fetch_and_process_packet deal with a potential bitstream boundary */ vf->pcm_offset=-1; ogg_stream_reset_serialno(vf->os, vf->current_serialno); /* must set serialno */ vorbis_synthesis_restart(&vf->vd); _seek_helper(vf,pos); /* we need to make sure the pcm_offset is set, but we don't want to advance the raw cursor past good packets just to get to the first with a granulepos. That's not equivalent behavior to beginning decoding as immediately after the seek position as possible. So, a hack. We use two stream states; a local scratch state and the shared vf->os stream state. We use the local state to scan, and the shared state as a buffer for later decode. Unfortuantely, on the last page we still advance to last packet because the granulepos on the last page is not necessarily on a packet boundary, and we need to make sure the granpos is correct. */ { int lastblock=0; int accblock=0; int thisblock; int eosflag=0; work_os=ogg_stream_create(vf->current_serialno); /* get the memory ready */ while(1){ if(vf->ready_state>=STREAMSET){ /* snarf/scan a packet if we can */ int result=ogg_stream_packetout(work_os,&op); if(result>0){ if(vf->vi[vf->current_link].codec_setup){ thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); if(thisblock<0){ ogg_stream_packetout(vf->os,NULL); thisblock=0; }else{ if(eosflag) ogg_stream_packetout(vf->os,NULL); else if(lastblock)accblock+=(lastblock+thisblock)>>2; } if(op.granulepos!=-1){ int i,link=vf->current_link; ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; if(granulepos<0)granulepos=0; for(i=0;ipcmlengths[i*2+1]; vf->pcm_offset=granulepos-accblock; break; } lastblock=thisblock; continue; }else ogg_stream_packetout(vf->os,NULL); } } if(!lastblock){ if(_get_next_page(vf,&og,-1)<0){ vf->pcm_offset=ov_pcm_total(vf,-1); break; } }else{ /* huh? Bogus stream with packets but no granulepos */ vf->pcm_offset=-1; break; } /* has our decoding just traversed a bitstream boundary? */ if(vf->ready_state>=STREAMSET) if(vf->current_serialno!=ogg_page_serialno(&og)){ _decode_clear(vf); /* clear out stream state */ ogg_stream_destroy(work_os); } if(vf->ready_statecurrent_serialno=ogg_page_serialno(&og); for(link=0;linklinks;link++) if(vf->serialnos[link]==vf->current_serialno)break; if(link==vf->links) goto seek_error; /* sign of a bogus stream. error out, leave machine uninitialized */ vf->current_link=link; ogg_stream_reset_serialno(vf->os,vf->current_serialno); ogg_stream_reset_serialno(work_os,vf->current_serialno); vf->ready_state=STREAMSET; } { ogg_page dup; ogg_page_dup(&dup,&og); eosflag=ogg_page_eos(&og); ogg_stream_pagein(vf->os,&og); ogg_stream_pagein(work_os,&dup); } } } ogg_packet_release(&op); ogg_page_release(&og); ogg_stream_destroy(work_os); vf->bittrack=0; vf->samptrack=0; return(0); seek_error: ogg_packet_release(&op); ogg_page_release(&og); /* dump the machine so we're in a known state */ vf->pcm_offset=-1; ogg_stream_destroy(work_os); _decode_clear(vf); return OV_EBADLINK; } /* Page granularity seek (faster than sample granularity because we don't do the last bit of decode to find a specific sample). Seek to the last [granule marked] page preceeding the specified pos location, such that decoding past the returned point will quickly arrive at the requested position. */ int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ int link=-1; ogg_int64_t result=0; ogg_int64_t total=ov_pcm_total(vf,-1); ogg_page og={0,0,0,0}; ogg_packet op={0,0,0,0,0,0}; if(vf->ready_stateseekable)return(OV_ENOSEEK); if(pos<0 || pos>total)return(OV_EINVAL); /* which bitstream section does this pcm offset occur in? */ for(link=vf->links-1;link>=0;link--){ total-=vf->pcmlengths[link*2+1]; if(pos>=total)break; } /* search within the logical bitstream for the page with the highest pcm_pos preceeding (or equal to) pos. There is a danger here; missing pages or incorrect frame number information in the bitstream could make our task impossible. Account for that (it would be an error condition) */ /* new search algorithm by HB (Nicholas Vinen) */ { ogg_int64_t end=vf->offsets[link+1]; ogg_int64_t begin=vf->offsets[link]; ogg_int64_t begintime = vf->pcmlengths[link*2]; ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; ogg_int64_t target=pos-total+begintime; ogg_int64_t best=begin; while(beginoffset); if(result==OV_EREAD) goto seek_error; if(result<0){ if(bisect<=begin+1) end=begin; /* found it */ else{ if(bisect==0) goto seek_error; bisect-=CHUNKSIZE; if(bisect<=begin)bisect=begin+1; _seek_helper(vf,bisect); } }else{ ogg_int64_t granulepos=ogg_page_granulepos(&og); if(granulepos==-1)continue; if(granuleposoffset; /* raw offset of next page */ begintime=granulepos; if(target-begintime>44100)break; bisect=begin; /* *not* begin + 1 */ }else{ if(bisect<=begin+1) end=begin; /* found it */ else{ if(end==vf->offset){ /* we're pretty close - we'd be stuck in */ end=result; bisect-=CHUNKSIZE; /* an endless loop otherwise. */ if(bisect<=begin)bisect=begin+1; _seek_helper(vf,bisect); }else{ end=result; endtime=granulepos; break; } } } } } } /* found our page. seek to it, update pcm offset. Easier case than raw_seek, don't keep packets preceeding granulepos. */ { /* seek */ _seek_helper(vf,best); vf->pcm_offset=-1; if(_get_next_page(vf,&og,-1)<0){ ogg_page_release(&og); return(OV_EOF); /* shouldn't happen */ } if(link!=vf->current_link){ /* Different link; dump entire decode machine */ _decode_clear(vf); vf->current_link=link; vf->current_serialno=ogg_page_serialno(&og); vf->ready_state=STREAMSET; }else{ vorbis_synthesis_restart(&vf->vd); } ogg_stream_reset_serialno(vf->os,vf->current_serialno); ogg_stream_pagein(vf->os,&og); /* pull out all but last packet; the one with granulepos */ while(1){ result=ogg_stream_packetpeek(vf->os,&op); if(result==0){ /* !!! the packet finishing this page originated on a preceeding page. Keep fetching previous pages until we get one with a granulepos or without the 'continued' flag set. Then just use raw_seek for simplicity. */ _seek_helper(vf,best); while(1){ result=_get_prev_page(vf,&og); if(result<0) goto seek_error; if(ogg_page_granulepos(&og)>-1 || !ogg_page_continued(&og)){ return ov_raw_seek(vf,result); } vf->offset=result; } } if(result<0){ result = OV_EBADPACKET; goto seek_error; } if(op.granulepos!=-1){ vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; if(vf->pcm_offset<0)vf->pcm_offset=0; vf->pcm_offset+=total; break; }else result=ogg_stream_packetout(vf->os,NULL); } } } /* verify result */ if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ result=OV_EFAULT; goto seek_error; } vf->bittrack=0; vf->samptrack=0; ogg_page_release(&og); ogg_packet_release(&op); return(0); seek_error: ogg_page_release(&og); ogg_packet_release(&op); /* dump machine so we're in a known state */ vf->pcm_offset=-1; _decode_clear(vf); return (int)result; } /* seek to a sample offset relative to the decompressed pcm stream returns zero on success, nonzero on failure */ int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ ogg_packet op={0,0,0,0,0,0}; ogg_page og={0,0,0,0}; int thisblock,lastblock=0; int ret=ov_pcm_seek_page(vf,pos); if(ret<0)return(ret); _make_decode_ready(vf); /* discard leading packets we don't need for the lapping of the position we want; don't decode them */ while(1){ int ret=ogg_stream_packetpeek(vf->os,&op); if(ret>0){ thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); if(thisblock<0){ ogg_stream_packetout(vf->os,NULL); continue; /* non audio packet */ } if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; if(vf->pcm_offset+((thisblock+ vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; /* remove the packet from packet queue and track its granulepos */ ogg_stream_packetout(vf->os,NULL); vorbis_synthesis(&vf->vb,&op,0); /* set up a vb with only tracking, no pcm_decode */ vorbis_synthesis_blockin(&vf->vd,&vf->vb); /* end of logical stream case is hard, especially with exact length positioning. */ if(op.granulepos>-1){ int i; /* always believe the stream markers */ vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; if(vf->pcm_offset<0)vf->pcm_offset=0; for(i=0;icurrent_link;i++) vf->pcm_offset+=vf->pcmlengths[i*2+1]; } lastblock=thisblock; }else{ if(ret<0 && ret!=OV_HOLE)break; /* suck in a new page */ if(_get_next_page(vf,&og,-1)<0)break; if(vf->current_serialno!=ogg_page_serialno(&og))_decode_clear(vf); if(vf->ready_statecurrent_serialno=ogg_page_serialno(&og); for(link=0;linklinks;link++) if(vf->serialnos[link]==vf->current_serialno)break; if(link==vf->links){ ogg_page_release(&og); ogg_packet_release(&op); return(OV_EBADLINK); } vf->current_link=link; ogg_stream_reset_serialno(vf->os,vf->current_serialno); vf->ready_state=STREAMSET; _make_decode_ready(vf); lastblock=0; } ogg_stream_pagein(vf->os,&og); } } vf->bittrack=0; vf->samptrack=0; /* discard samples until we reach the desired position. Crossing a logical bitstream boundary with abandon is OK. */ while(vf->pcm_offsetpcm_offset; long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); if(samples>target)samples=target; vorbis_synthesis_read(&vf->vd,samples); vf->pcm_offset+=samples; if(samplespcm_offset=ov_pcm_total(vf,-1); /* eof */ } ogg_page_release(&og); ogg_packet_release(&op); return 0; } /* seek to a playback time relative to the decompressed pcm stream returns zero on success, nonzero on failure */ int ov_time_seek(OggVorbis_File *vf,ogg_int64_t milliseconds){ /* translate time to PCM position and call ov_pcm_seek */ int link=-1; ogg_int64_t pcm_total=ov_pcm_total(vf,-1); ogg_int64_t time_total=ov_time_total(vf,-1); if(vf->ready_stateseekable)return(OV_ENOSEEK); if(milliseconds<0 || milliseconds>time_total)return(OV_EINVAL); /* which bitstream section does this time offset occur in? */ for(link=vf->links-1;link>=0;link--){ pcm_total-=vf->pcmlengths[link*2+1]; time_total-=ov_time_total(vf,link); if(milliseconds>=time_total)break; } /* enough information to convert time offset to pcm offset */ { ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; return(ov_pcm_seek(vf,target)); } } /* page-granularity version of ov_time_seek returns zero on success, nonzero on failure */ int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t milliseconds){ /* translate time to PCM position and call ov_pcm_seek */ int link=-1; ogg_int64_t pcm_total=ov_pcm_total(vf,-1); ogg_int64_t time_total=ov_time_total(vf,-1); if(vf->ready_stateseekable)return(OV_ENOSEEK); if(milliseconds<0 || milliseconds>time_total)return(OV_EINVAL); /* which bitstream section does this time offset occur in? */ for(link=vf->links-1;link>=0;link--){ pcm_total-=vf->pcmlengths[link*2+1]; time_total-=ov_time_total(vf,link); if(milliseconds>=time_total)break; } /* enough information to convert time offset to pcm offset */ { ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; return(ov_pcm_seek_page(vf,target)); } } /* tell the current stream offset cursor. Note that seek followed by tell will likely not give the set offset due to caching */ ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ if(vf->ready_stateoffset); } /* return PCM offset (sample) of next PCM sample to be read */ ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ if(vf->ready_statepcm_offset); } /* return time offset (milliseconds) of next PCM sample to be read */ ogg_int64_t ov_time_tell(OggVorbis_File *vf){ int link=0; ogg_int64_t pcm_total=0; ogg_int64_t time_total=0; if(vf->ready_stateseekable){ pcm_total=ov_pcm_total(vf,-1); time_total=ov_time_total(vf,-1); /* which bitstream section does this time offset occur in? */ for(link=vf->links-1;link>=0;link--){ pcm_total-=vf->pcmlengths[link*2+1]; time_total-=ov_time_total(vf,link); if(vf->pcm_offset>=pcm_total)break; } } return(time_total+(1000*vf->pcm_offset-pcm_total)/vf->vi[link].rate); } /* link: -1) return the vorbis_info struct for the bitstream section currently being decoded 0-n) to request information for a specific bitstream section In the case of a non-seekable bitstream, any call returns the current bitstream. NULL in the case that the machine is not initialized */ vorbis_info *ov_info(OggVorbis_File *vf,int link){ if(vf->seekable){ if(link<0) if(vf->ready_state>=STREAMSET) return vf->vi+vf->current_link; else return vf->vi; else if(link>=vf->links) return NULL; else return vf->vi+link; }else{ return vf->vi; } } /* grr, strong typing, grr, no templates/inheritence, grr */ vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ if(vf->seekable){ if(link<0) if(vf->ready_state>=STREAMSET) return vf->vc+vf->current_link; else return vf->vc; else if(link>=vf->links) return NULL; else return vf->vc+link; }else{ return vf->vc; } } /* up to this point, everything could more or less hide the multiple logical bitstream nature of chaining from the toplevel application if the toplevel application didn't particularly care. However, at the point that we actually read audio back, the multiple-section nature must surface: Multiple bitstream sections do not necessarily have to have the same number of channels or sampling rate. ov_read returns the sequential logical bitstream number currently being decoded along with the PCM data in order that the toplevel application can take action on channel/sample rate changes. This number will be incremented even for streamed (non-seekable) streams (for seekable streams, it represents the actual logical bitstream index within the physical bitstream. Note that the accessor functions above are aware of this dichotomy). input values: buffer) a buffer to hold packed PCM data for return length) the byte length requested to be placed into buffer return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) 0) EOF n) number of bytes of PCM actually returned. The below works on a packet-by-packet basis, so the return length is not related to the 'length' passed in, just guaranteed to fit. *section) set to the logical bitstream number */ long ov_read(OggVorbis_File *vf,char *buffer,int bytes_req,int *bitstream){ int i,j; ogg_int32_t **pcm; long samples; if(vf->ready_stateready_state==INITSET){ samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); if(samples)break; } /* suck in another packet */ { int ret=_fetch_and_process_packet(vf,1,1); if(ret==OV_EOF) return(0); if(ret<=0) return(ret); } } if(samples>0){ /* yay! proceed to pack data into the byte buffer */ long channels=ov_info(vf,-1)->channels; if(samples>(bytes_req/(2*channels))) samples=bytes_req/(2*channels); for(i=0;i>9); dest+=channels; } } vorbis_synthesis_read(&vf->vd,samples); vf->pcm_offset+=samples; if(bitstream)*bitstream=vf->current_link; return(samples*2*channels); }else{ return(samples); } } core/input_hw/000700 001750 001750 00000000000 12703321515 014452 5ustar00sergiosergio000000 000000 core/memz80.c000664 001750 001750 00000040066 12702465756 014142 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Z80 bus handlers (Genesis & Master System modes) * * Support for SG-1000, Mark-III, Master System, Game Gear & Mega Drive ports access * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /*--------------------------------------------------------------------------*/ /* Handlers for access to unused addresses and those which make the */ /* machine lock up. */ /*--------------------------------------------------------------------------*/ INLINE void z80_unused_w(unsigned int address, unsigned char data) { #ifdef LOGERROR error("Z80 unused write %04X = %02X (%x)\n", address, data, Z80.pc.w.l); #endif } INLINE unsigned char z80_unused_r(unsigned int address) { #ifdef LOGERROR error("Z80 unused read %04X (%x)\n", address, Z80.pc.w.l); #endif return 0xFF; } INLINE void z80_lockup_w(unsigned int address, unsigned char data) { #ifdef LOGERROR error("Z80 lockup write %04X = %02X (%x)\n", address, data, Z80.pc.w.l); #endif if (!config.force_dtack) { Z80.cycles = 0xFFFFFFFF; zstate = 0; } } INLINE unsigned char z80_lockup_r(unsigned int address) { #ifdef LOGERROR error("Z80 lockup read %04X (%x)\n", address, Z80.pc.w.l); #endif if (!config.force_dtack) { Z80.cycles = 0xFFFFFFFF; zstate = 0; } return 0xFF; } /*--------------------------------------------------------------------------*/ /* Z80 Memory handlers (Genesis mode) */ /*--------------------------------------------------------------------------*/ unsigned char z80_memory_r(unsigned int address) { switch((address >> 13) & 7) { case 0: /* $0000-$3FFF: Z80 RAM (8K mirrored) */ case 1: { return zram[address & 0x1FFF]; } case 2: /* $4000-$5FFF: YM2612 */ { return fm_read(Z80.cycles, address & 3); } case 3: /* $7F00-$7FFF: VDP */ { if ((address >> 8) == 0x7F) { return (*zbank_memory_map[0xc0].read)(address); } return z80_unused_r(address); } default: /* $8000-$FFFF: 68k bank (32K) */ { address = zbank | (address & 0x7FFF); if (zbank_memory_map[address >> 16].read) { return (*zbank_memory_map[address >> 16].read)(address); } return READ_BYTE(m68k.memory_map[address >> 16].base, address & 0xFFFF); } } } void z80_memory_w(unsigned int address, unsigned char data) { switch((address >> 13) & 7) { case 0: /* $0000-$3FFF: Z80 RAM (8K mirrored) */ case 1: { zram[address & 0x1FFF] = data; return; } case 2: /* $4000-$5FFF: YM2612 */ { fm_write(Z80.cycles, address & 3, data); return; } case 3: /* Bank register and VDP */ { switch(address >> 8) { case 0x60: /* $6000-$60FF: Bank register */ { gen_zbank_w(data & 1); return; } case 0x7F: /* $7F00-$7FFF: VDP */ { (*zbank_memory_map[0xc0].write)(address, data); return; } default: { z80_unused_w(address, data); return; } } } default: /* $8000-$FFFF: 68k bank (32K) */ { address = zbank | (address & 0x7FFF); if (zbank_memory_map[address >> 16].write) { (*zbank_memory_map[address >> 16].write)(address, data); return; } WRITE_BYTE(m68k.memory_map[address >> 16].base, address & 0xFFFF, data); return; } } } /*--------------------------------------------------------------------------*/ /* Unused Port handlers */ /* */ /* Ports are unused when not in Mark III compatibility mode. */ /* */ /* Genesis games that access ports anyway: */ /* Thunder Force IV reads port $BF in it's interrupt handler. */ /* */ /*--------------------------------------------------------------------------*/ unsigned char z80_unused_port_r(unsigned int port) { #if LOGERROR error("Z80 unused read from port %04X (%x)\n", port, Z80.pc.w.l); #endif if (system_hw == SYSTEM_SMS) { unsigned int address = (Z80.pc.w.l - 1) & 0xFFFF; return z80_readmap[address >> 10][address & 0x3FF]; } return 0xFF; } void z80_unused_port_w(unsigned int port, unsigned char data) { #if LOGERROR error("Z80 unused write to port %04X = %02X (%x)\n", port, data, Z80.pc.w.l); #endif } /*--------------------------------------------------------------------------*/ /* MegaDrive / Genesis port handlers (Master System compatibility mode) */ /*--------------------------------------------------------------------------*/ void z80_md_port_w(unsigned int port, unsigned char data) { switch (port & 0xC1) { case 0x01: { io_z80_write(1, data, Z80.cycles + PBC_CYCLE_OFFSET); return; } case 0x40: case 0x41: { SN76489_Write(Z80.cycles, data); return; } case 0x80: { vdp_z80_data_w(data); return; } case 0x81: { vdp_z80_ctrl_w(data); return; } default: { port &= 0xFF; /* write FM chip if enabled */ if ((port >= 0xF0) && (config.ym2413 & 1)) { fm_write(Z80.cycles, port, data); return; } z80_unused_port_w(port, data); return; } } } unsigned char z80_md_port_r(unsigned int port) { switch (port & 0xC1) { case 0x40: { return ((vdp_hvc_r(Z80.cycles - 15) >> 8) & 0xFF); } case 0x41: { return (vdp_hvc_r(Z80.cycles - 15) & 0xFF); } case 0x80: { return vdp_z80_data_r(); } case 0x81: { return vdp_z80_ctrl_r(Z80.cycles); } default: { port &= 0xFF; if ((port == 0xC0) || (port == 0xC1) || (port == 0xDC) || (port == 0xDD)) { return io_z80_read(port & 1); } /* read FM chip if enabled */ if ((port >= 0xF0) && (config.ym2413 & 1)) { return YM2413Read(); } return z80_unused_port_r(port); } } } /*--------------------------------------------------------------------------*/ /* Game Gear port handlers */ /*--------------------------------------------------------------------------*/ void z80_gg_port_w(unsigned int port, unsigned char data) { switch(port & 0xC1) { case 0x00: case 0x01: { port &= 0xFF; if (port < 0x07) { if (system_hw == SYSTEM_GG) { io_gg_write(port, data); return; } } /* full address range is decoded by Game Gear I/O chip (fixes G-LOC Air Battle) */ else if ((port == 0x3E) || (port == 0x3F)) { io_z80_write(port & 1, data, Z80.cycles + SMS_CYCLE_OFFSET); return; } z80_unused_port_w(port, data); return; } case 0x40: case 0x41: { SN76489_Write(Z80.cycles, data); return; } case 0x80: { vdp_z80_data_w(data); return; } case 0x81: { vdp_sms_ctrl_w(data); return; } default: { z80_unused_port_w(port & 0xFF, data); return; } } } unsigned char z80_gg_port_r(unsigned int port) { switch(port & 0xC1) { case 0x00: case 0x01: { port &= 0xFF; if (port < 0x07) { if (system_hw == SYSTEM_GG) { return io_gg_read(port); } } return z80_unused_port_r(port); } case 0x40: { return ((vdp_hvc_r(Z80.cycles) >> 8) & 0xFF); } case 0x41: { return (vdp_hvc_r(Z80.cycles) & 0xFF); } case 0x80: { return vdp_z80_data_r(); } case 0x81: { return vdp_z80_ctrl_r(Z80.cycles); } default: { port &= 0xFF; /* full address range is decoded by Game Gear I/O chip */ if ((port == 0xC0) || (port == 0xC1) || (port == 0xDC) || (port == 0xDD)) { return io_z80_read(port & 1); } return z80_unused_port_r(port); } } } /*--------------------------------------------------------------------------*/ /* Master System port handlers */ /*--------------------------------------------------------------------------*/ void z80_ms_port_w(unsigned int port, unsigned char data) { switch (port & 0xC1) { case 0x00: case 0x01: { /* full address range is decoded by 315-5297 I/O chip (fixes Super Tetris / Power Boggle Boggle) */ if ((region_code != REGION_JAPAN_NTSC) || ((port & 0xFE) == 0x3E)) { io_z80_write(port & 1, data, Z80.cycles + SMS_CYCLE_OFFSET); return; } z80_unused_port_w(port & 0xFF, data); return; } case 0x40: case 0x41: { SN76489_Write(Z80.cycles, data); return; } case 0x80: { vdp_z80_data_w(data); return; } case 0x81: { vdp_sms_ctrl_w(data); return; } default: { /* write FM chip if enabled */ if (!(port & 4) && (config.ym2413 & 1)) { fm_write(Z80.cycles, port, data); /* 315-5297 I/O chip decodes bit 1 to enable/disable PSG output */ if (region_code == REGION_JAPAN_NTSC) { io_reg[6] = (data & 2) ? 0xFF : 0x00; SN76489_Config(Z80.cycles, config.psg_preamp, config.psgBoostNoise, io_reg[6]); } return; } z80_unused_port_w(port & 0xFF, data); return; } } } unsigned char z80_ms_port_r(unsigned int port) { switch (port & 0xC1) { case 0x00: case 0x01: { return z80_unused_port_r(port & 0xFF); } case 0x40: { return ((vdp_hvc_r(Z80.cycles) >> 8) & 0xFF); } case 0x41: { return (vdp_hvc_r(Z80.cycles) & 0xFF); } case 0x80: { return vdp_z80_data_r(); } case 0x81: { return vdp_z80_ctrl_r(Z80.cycles); } default: { uint8 data = 0xFF; /* read FM chip if enabled */ if (!(port & 4) && (config.ym2413 & 1)) { data = YM2413Read(); /* 315-5297 I/O chip decodes full address range */ if (region_code == REGION_JAPAN_NTSC) { return data; } } /* read I/O ports if enabled */ if (!(io_reg[0x0E] & 0x04)) { data &= io_z80_read(port & 1); } return data; } } } /*--------------------------------------------------------------------------*/ /* Mark III port handlers */ /*--------------------------------------------------------------------------*/ void z80_m3_port_w(unsigned int port, unsigned char data) { switch (port & 0xC1) { case 0x00: case 0x01: { z80_unused_port_w(port & 0xFF, data); return; } case 0x40: case 0x41: { SN76489_Write(Z80.cycles, data); return; } case 0x80: { vdp_z80_data_w(data); return; } case 0x81: { vdp_sms_ctrl_w(data); return; } default: { /* write FM chip if enabled */ if (!(port & 4) && (config.ym2413 & 1)) { fm_write(Z80.cycles, port, data); return; } z80_unused_port_w(port & 0xFF, data); return; } } } unsigned char z80_m3_port_r(unsigned int port) { switch (port & 0xC1) { case 0x00: case 0x01: { return z80_unused_port_r(port & 0xFF); } case 0x40: { return ((vdp_hvc_r(Z80.cycles) >> 8) & 0xFF); } case 0x41: { return (vdp_hvc_r(Z80.cycles) & 0xFF); } case 0x80: { return vdp_z80_data_r(); } case 0x81: { return vdp_z80_ctrl_r(Z80.cycles); } default: { /* read FM chip if enabled */ if (!(port & 4) && (config.ym2413 & 1)) { /* I/O ports are automatically disabled by hardware */ return YM2413Read(); } /* read I/O ports */ return io_z80_read(port & 1); } } } /*--------------------------------------------------------------------------*/ /* SG-1000 port handlers */ /*--------------------------------------------------------------------------*/ void z80_sg_port_w(unsigned int port, unsigned char data) { switch(port & 0xC1) { case 0x40: case 0x41: { SN76489_Write(Z80.cycles, data); /* Z80 !WAIT input is tied to SN76489AN chip READY pin (held low for 32 clocks after each write access) */ Z80.cycles += (32 * 15); return; } case 0x80: { vdp_z80_data_w(data); return; } case 0x81: { vdp_tms_ctrl_w(data); return; } default: { z80_unused_port_w(port & 0xFF, data); return; } } } unsigned char z80_sg_port_r(unsigned int port) { switch (port & 0xC1) { case 0x80: { return vdp_z80_data_r(); } case 0x81: { return vdp_z80_ctrl_r(Z80.cycles); } case 0xC0: case 0xC1: { return io_z80_read(port & 1); } default: { return z80_unused_port_r(port & 0xFF); } } } gx/gx_video.h000664 001750 001750 00000010767 12702465756 014326 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_video.c * * Genesis Plus GX video support * * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GC_VIDEO_H_ #define _GC_VIDEO_H_ /* EFB colors */ #define BLACK {0x00,0x00,0x00,0xff} #define DARK_GREY {0x22,0x22,0x22,0xff} #define LIGHT_BLUE {0xb8,0xc7,0xda,0xff} #define SKY_BLUE {0x99,0xcc,0xff,0xff} #define LIGHT_GREEN {0xa9,0xc7,0xc6,0xff} #define WHITE {0xff,0xff,0xff,0xff} /* Directly fill a RGB565 texture */ /* One tile is 32 byte = 4x4 pixels */ /* Tiles are stored continuously in texture memory */ #define CUSTOM_BLITTER(line, width, table, in) \ { \ width >>= 2; \ u16 *out = (u16 *) (bitmap.data + (((width << 5) * (line >> 2)) + ((line & 3) << 3))); \ if (config.lcd) \ { \ do \ { \ RENDER_PIXEL_LCD(in,out,table,config.lcd); \ RENDER_PIXEL_LCD(in,out,table,config.lcd); \ RENDER_PIXEL_LCD(in,out,table,config.lcd); \ RENDER_PIXEL_LCD(in,out,table,config.lcd); \ out += 12; \ } \ while (--width); \ } \ else \ { \ do \ { \ *out++ = table[*in++]; \ *out++ = table[*in++]; \ *out++ = table[*in++]; \ *out++ = table[*in++]; \ out += 12; \ } \ while (--width); \ } \ } /* image texture */ typedef struct { u8 *data; u16 width; u16 height; u8 format; } gx_texture; /* Global variables */ extern GXRModeObj *vmode; extern u32 gc_pal; extern u32 videoSync; /* GX rendering */ extern void gxDrawRectangle(s32 x, s32 y, s32 w, s32 h, u8 alpha, GXColor color); extern void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha); extern void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha); extern void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha); extern void gxDrawScreenshot(u8 alpha); extern void gxCopyScreenshot(gx_texture *texture); extern void gxSaveScreenshot(char *filename); extern void gxClearScreen(GXColor color); extern void gxSetScreen(void); /* PNG textures */ extern gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file); extern void gxTextureWritePNG(gx_texture *p_texture, FILE *png_file); extern void gxTextureClose(gx_texture **p_texture); /* GX video engine */ extern void gx_video_Init(void); extern void gx_video_Shutdown(void); extern void gx_video_Start(void); extern void gx_video_Stop(void); extern int gx_video_Update(int status); #endif gx/images/Cart_sg.png000664 001750 001750 00000103315 12702465756 015676 0ustar00sergiosergio000000 000000 PNG  IHDR1CsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/24/11I" IDATx{eU=~LOS3͌,Yoɖ-W@*7 U׷r)c1`Bdk4ҌFs~OO$\^8ߪVO>k}Z%t!8ٹ.I^m7K9Z? T~てE_O_GSGD*RS5I;woO=C?CC7_ h??O?۩g޻뺦,K"0'I1!?];}v>q)weⵯ{O;vEQ D`B$y+_h{sg(Fxlݺ^PJSWw-l׾Gjc;;g!F-@*kR TW}{wNJkM{W{7QJk^WLAQu!D{5PVuUaEV+)%{s= _eY|Bιҽͮ+$1dyV꺦j$9k ˫|K_fCJh|smmo8L]H4iohnTQTlپg;ɰ(`}5usW5kިwߢ "~85R:6} )õ„Q\͠XgqvlVm~}BL>4 ^{u˻x»`7Z+<h’5ssR[gB {s|\{|Ix;+xT8eK\q Czq@{M$Wnj&.ғ5vl''B{b :^W Oc_%,p;z).wU89$j =Yqa<3}@ILm?8 ;'s7 yQW{Bk6xqk]@ȥG}`+ ԠZAtƘ9&JIbDe84Oo1#YZch1.M+Ҩyc < >]/=`Y'٧ HFIQcoRӯvαeV< ƓcĘAO:Ҧ;kwZܡ놏GR}s㞱.uF6FOީ}i)΅TU%v8gPIU͟Nzh*I!ĐidkEl m[c@[ UUMtbhHEђJ)$i=h4jin% \~)^Z(mmF,V:eLٵܳg`3g<4cb BSXh8tsLd B#:L49t:l,=y޳g'ybu}PZ;GQHA)jc0(q^L3S\3~mXv:(25λzcݺg8ᜧjM0x*8ZKY󔺛>{Z2Ըй+x8F6ȘV\`8^c`>f76](zkXQm}Pu7Mb7ca'O\F\x!)FQuqmi[d=ŵ!I6'hi.20J|fuC=/\z8~"M VC)E ZM];barLBJ:eIx, J[-u޽|V!>M6o{^S=S\&.ba$4F#֛M|r֭,//bMUSL+DKYm[' zFԠf&f9Z;&$HIrvv1z=,p1Ȳ(&2ֹܾx)x!eh{a[=,KhFi()Cݟ1Cg[n x#&өGve3$KCeꡧF|Rͱ炊Rzk1uwfR ,younF'Qq})q?F]l[d^T S(/-2QUUYWP%D],Z*xI*Lq8;GHQlC8pÎ ֑Jdw ccVL15[w/TяC &|jCKR>):@%_YY E'GmadT-2/I`jCmL$۝$!B<ah@N1]|ٱc M`7[p QWS$ɸcv1u[lmh %BPU%l 9,/\rͪр7^şI9NqqƮT#`4f;}t{X 1^:n5ӐckFP!Ʒ a<,kHmyPz55]Ìv 7LC):c6*Kh!( sTeff&1 ڮLMx+<{)=5m:c JԱԹ MΜ RvqĖ"P*M݆ɫgMykE7\3,IXk];A٠ Sٳ?v,M0]& ThfkGWj%:>L`fЭKK;^xZ;v07?(l?nk.Sco &&Mu Zzff!ш˗W3)f1p8G贾DnrYۏ/SckD; uED]s&' m۶2 ce<0iDgbkA\4&QOxg!D8-7$z,FI$IPzm7KbGEJIQg٠hqvQ[RL+S\36 B`;EqBJ^ú,09tӆ z4}bDUW-q)`Ru/b1ŵbc?j7#twpR!Zc3->ORUZk1ccMo7,<1ML,;Q3au~u)dcM~?:$VTʕ<'mDƱ)vcREP1:x)&l6D{'k9>?9N/MiHA숳亓d=~:m(7Y2gݙ5N_BLRv㎻߻̹5𺢍12/ ~Bh, Bȉ"nR+00˲}VW) &/sV:^naVb=YML?;${v۶H$HA5ݬ^#tLSS|AFa4&D  ?fT+jmn͉9VGŸfpĹ6u˶u ffiJ$я1I%x[a6(?v *][kL ڣDp1 v;[ǟ t8h  4 T@#8S]+qFW4ŀn fzC<ɱƅ"12 .5vmT)h4 L2L1ŵ;: I5v-}u'׷A<{lac0n;VQQKi6pkFJ6)(%JN`$YvB3f8]wu 8w\ dl 襥.=㓠Z;i6xuUԔ*'5e1`cM⍩'fRF!F)%U4MdYf 4uLufx)X<T@LEҚ,L_/5!&.!ǃ#,lT)P)=7m%)'dKM m4R]fG X뚪sOC) `RI$tM(|c#_T*"rP,m"%qW IcꡧFLR FEjkvϺyV+sTrYf4cqRw*V4׈./Ai8*vAZWl mjÃLfY6jLPy.L׌mE$_mGmm@f0Vkt& iIĘ:8|wԚvΓ. e0@!]N !ĸ?R'M333ĺTڽ /v51|٪݈1F)E3=1NJJLB[PL (/.E*%QJ:c<݁A11L7Sdt)0 vWjiHJE5R XJ1>LvDѺIh*WnDqݭ6o} ɻQ:3/|Sl )0ڑsHpRe:S:0Wsmjqɻ98ZkǐI!݈ AdY 6Z&jnE Ečlւ1WG4$@<@lZ{wgf^ܾCەǃ^sa~xa%rktdiZkV.]9Qk(F 蛌ڼkY(FkcGX:7`??}Z[6j=s&B'cUxzwiOx>=.׍6+w!;H4 ٦ 'n5]B1!=[ʰV^ 0\qUVZkm[6%m";u$As'qΝ;B&AǮL x1tBWsc$\_]{GG|bp!|SiC Ohjkڐc[[I6[CHъD)*9~ىXf =hN|'5]Rq#Qզwb<Oyۉ;vC*b t#ڮx!!/[[A+:PR Ȱ]V%V#~o5Z}h,KAXA% Ht1vWئr3MH&qr%~p:/*m7DzEW ?28} g-Jy1ꮌϮxWvN|:s<Ύ\)qS} 1yT)D9p>aO0`p^`L#9r.")gH$/k$ ;J6B( !59B`D c`{lM+xaD6mB!H{"}NZ+aPΐ`02Lj)ƴ` RgFB@qc{ǤA{B/NڀF;O>'t l>j|#Wۀu +↬yۍZh;P FWx Q HgрC ;s= UI>G΅DPS5MNb:B(pH?@)\BD E- RXR/@[(#e>!RT^#|eԲV'LsGcB8S/W1zn iˑ6eXhɤĬ @c 8z69ap]Io7 O$Hc^Z:U\ZOG8$݇[[M65)( 2KIƻjL"SP%N[ ^d)苊\UjOw ©`;O* a3! x[R |e !M IfPDU+KBCQ =$6 ^e{,q/ XU@LWY'xhk,S1AE=~hZ!&P;K1ںic,)BJ ˏ=R)a&[5 ۉ]6|͕ι &)A #$5d86Ԉw[W r5 L$ $Cʔ8mX(Id/:;L晩j+I;zi3%_u[޷ fwz鰵SzhʲgkO5(mooK<صo+*2?L1"UFG-lw)YlM?o-Gwba۝ k'MQrBd;G5]_^&՚O?ӧ137$g- 3RS=V/rwQÇ?a.\jb0ZoE{0f>{G/ӔdY+ﻟ'5ʢ5*M9338kw<TrcYs4HmMA6Kq!77ӗ+=8+O!Ny|-Q.L4JCV,rq1ï,\w'Ϟ/C̱}qcȝ9{'X1J`#K93?cG#$.x'v?Գؽz^y+OTљT-]'X ,W?i {,^|exX@z o_'~ېBkNOX_[ĉ(x^9bsLJ ++H0eˡ۹obGzj7΀dNTRI%`NY: [yYzK=|O ^8(3G\zl;7}5;ǎS'صe+ K[YʠqUJ& i\") [3X];82`ρȷ\O8'}J*F5Hds?WcJ OGfOƃugyFjwC >Fݳαk.nfnvl[ Ο'њ]vmRJ묭cǸ‡>[uo[oe}}9/.я~}C='?IfffYܶ,~rOKDsommk5|Cgg'}Թ^^C&k ;o’(رs'O?4dٳ<}(mѣG>GXkY]]啯| [?܃;ë^*nV/cկ|+}=;)ޗAGzN*75ƐĠ[4nk MvG뚼4MAk͹sJ"8f 4~y衇r@*wͩSx2/6 %1xxi;勬 >Gx÷q뭷O|CFiSLЍ7R5O? Y#?invvCowM7݄ǹ)˒K.Mvqoe9lbgZqlPA9ג$HZjp[gYNFBM_ : 9G@͢-PRW5igXueXaѹd?uX%5xobǡW"5:b>Nc~([n|F,G+ly*a|O^MTds)1n}sh(jx8do1ub"N9zu$aΝTM׸1+v9?tf._LQ(;v젪*AhX/,,ӧCC}i3O Ξ,K$n`yyp?y4irmwٳgEùsFCS5 ay49qYV/ìrYD"9t /\3l۶D8t܇|Cv\`$ <,Ǐ!ՇYxȯz^fmpm~JbC -zҰMO.p k2/])l~ d /e>p;; Nm=#u;gO=ͺo>Yemgae7mǬ$%/!AY0և'C0h(C !ѨT&lBU C?'dYƱc?ш,M%s (JƘÇoyի{eff/~|#ןe۶m… {;Br3!=~SNk>;w2 pP@5?E1 %%j0B}q;?3?ûn_l[܊s7k|c wq۝>|޾\x~ٛoo@9jkVvm7|9{v7ٹV JħylF4}eU>ȳ{lہrP!=P)HL ,,n/g=#q~]q1p{obq _s^p"*c>C D54qXmc\%Y]A(Rw !_eV/eo{۰ӟ4Νc8\e7k^~g؏;v⺽{I^_5oソ¿W?C=ēO>G?a`4xo胤Ynz zE]cFwmcnʢ[n?}'ط?ofףby, [૏=ƻn~3gN}gS=s'?Sgϒ$ ?޾].\fwpҥj"1W48q9w,-KH]vqayG}U߿~/(Ȳ;v?N[naa>W­SOaaaGyWwEQpw{{|9r{~X_[c=~Gx,yӛ6d箝;[8w$k+l_܂<9.T&CĉS\*Sv컁{qϲvQVrg5 s9yNGQsۻjo}{o:֓w/^o7z~NUhWX]isOzO'Zm{?SG/k'ڬ*%UE8;ö m' # UU!я~Lj_x^z;RQPY-f]ћ);VѣG5ƨw}WP4җӧO/# 7xC_X=җ%OF_կ~UgU IDAT/_?-+W^yEO/~Q?|%d _w[o7ew__K/TVwWigwwwG_}G_&btW_5Uo?s)֣OMd]Lqgwwzwԟ:Qv}F~G5^UVOnГgoӿ۷?ғgo?˟mFIwzɝ[ݾTqG?Qm+}zNE~CKӓ'gN!J_^~wU, Z۶CUUn&N 8;ɘ1O)% NSIϪ}szg~\JeFϞ=v8OQ$So+m[=<5Q0}u}s?nOZosy+{Sm6kNg=zPo֛+=|P^u?ӧ>,IGm'>N?~AQI<7~WzJhJtYߨѿ?35(֋/Xy>syvIW 1K|I1 Wcw$.TL b0랚Ngv;={L>T:'e|z1/^}UMhݪm[{]_]x<7͍|zG Chٔb77gnW_jÇ5 ӱ|Y WWP˪zFQI?ݝzVYUHR۪qlu<obskt&YH껓:U7w_0=jxW^ZU3^;WUBpx)͙{hTNI>i^ZgFk7Yxgp'3=QUI.Y6[׵xT;mMΧ8Aj6kN g\8ԍqfnhO}f:Lt:r1o Q=C9 'ki49oFi/jcѳgϦ7Ztv^ijM >%E6i܏F 2IC0t`A͍!jG F)iPlz) Rշ]voJ}ֶ[iOg cTRTe GMaIVjFӹ vM.{͟k;t{msMiǩ%UcRzyppU|z8E|f.iGUӴ! SvL\OtP5FUuUӨSԨ;Q]To:SS:iծ4u*n48U[]QmU7A}+ [$i Cƹ|Ki IuUǽfT]%磚unwPuQ!ZxV꒺ЫjGxRO1URZC҄2RƬwMSNsvs{9`0 7w߀[ֹUA Ac?liC>|/T7 6<;dM1jܫ5m$ F5mWQPyPR*yV*tTZJڶ˻]RR?HaړحJ jRbƹtРq{"1u?_wwwEJK5n$pO? IIB!ڻN MPyDYuer[4SJ%Z.?t:zPylصLPCp08ӡ|u~/s됴^NO=FW8?JvѡiQ=\ ٩UasV1&z)  ,wGY| w.b=ߋ8Z|gL"  "2/]܀UëxQzc`#qga$wct(k^S"x.71Hy1̇_ZC9.?QYP\E<S@3An(R8"}w8p(J]鹟W|мiTMӔ,=j ;v3_G>?gu]W>cn+l(`l.?t< ;,W|K/k䊉1 GkBnm]N,C$4~h" ^n0餫Nl vc>)Zyn#3{0z}a@WP:3>+>Fy< pKPM/(ՕNS9 pʣRp_` b_ו]QMyˁ 2@arav-ܶm1 :NԝBN,݀yD*i&' QJ$C^ZJÀœ8| rcpPJ10Far0E IL=a]ٟ*YP&̌4s|Qh麮.9f?q?{X`C0R֓kx`^eeN9m[E$s4McЫav֫ r/xa/_ }V^xXckeeKa}ݣ +3C$D,3^F 1)Dg` ޤвl(x,@O|('|x90D:0dT{j7X#ɭʼ/LEd}yi b:uK^K+Ux=(,\%<Zm0h&&LpXhne"I'8>$[\!8Plvǫ>gz\1}N&=%]$6wi/ }io.? Cgf2bxJ1N'58@onnJOĤө(2L)9}"(+gL, QI XxcU8Xp?؝23P`ߕxaȉuw#OkML/~@~WQn%BAe^reBhs_TGLFذm6 /71YD<HsE%yͥr ƶl.w]ۃJu{xu\<#n9N'ܨqTe'] DQ? Ip8.) ˞s,7vn/GLhP~U ܃" p< ɓ9-dvJ)ٳg0yj/7cU5o@ᱸt*uu9D¨(I*pƻnKp5r0Q{āqry;d1F\~)Q&heyƱ0AIިaAq߽Lp-Z/I~"gńrI"g6;0' JΥPԖG %baYP_E9y"\$ץf})GKı'#c(^ p8p8h䧹SޯYS~Btm6i9H)]*V gx0&/M!IzPWp^Ocs#.8@>|u]ObQlP<<\wl@Z2ANt8Q2DB)8gWaΦeiVl;N  `!;% ^^x<&&eބtgnaJ91tAwEP\5 ö1N40%>>1$˵B# ,s,ZQ"BaՕ*EǸۓG<)w~0HT)O{n2:Ά$7ѹ3Gn9KR)b8E`nWSs8}8̏@nەBUSXCxtx3; N&_(2~ :$X.4 ,Qę̣i)8dDDZp ]11TiRL({%süN:f`l {_O۬C1(`fKQhήR免K>:5R}*/R9dX A"h[j䇅_ Ds&H; H7u |Op}@"G ;38a=<+ '-T1;2 &]~WPJ1M.C&onn _Z8KR!y@ @5?A\1<^ ŧI˩KY9s dۣ$$ݞѨA0>5(XX$r!ߒq wC:{~D';} 璦SMɓ'{ ; Bv{ߜ@@$#y3 !JG.2qwQpOƢ1%&x<^$$Do@"bY,yd~1t_wH6,xfl;ԣ%N22<1M='#=Wn<|P/0J8 ]P«e gz3Gf) Fˆ#XT&\CۈNגtQ2F A$8"qoWr QN-ׅ{4F7LCNOq<Q*S8KW72gqe{=Y[][=1Ʋe^3EonnuE{# ZʂKX&x1E ^Fe_i!Rw f I:7Z_8?具Ȑ^ {{4$ߋ*=m"7sFcEvq 1M'ώ)*(s\ta9R0XKzr:b(+Ԟ/VOuQB" ^Ӭ7kPkKg}Ta,B2%381^\=2khP^rnj;X'+mJh\^rfL|a'5yg.2q/Ǣ0N{=/! IH uV ˘ZNg㩉nN0(spqs"Z8DVXrKge1Í:yb ]0MH9Suaǟ EsC5HdY,K/P 8"tgww/ iZEsDk(JFE2ɚGBʃ `xY;g00peI~R{p-<P,mQwiD@&k0o"C ֋Hj:X&*Jccͯm XT7u מyC t#4F~-D(;B[||…78":OUB,c^̍b',cuy4Hr936 L̒_NEI) O.R8**YFR8*UNQ`Wh\"i2zw[9gX!~gOSw9瞟k/'Z 3;tb|(7"yǁ;S)0Jv8C]ץg}~V{ggk;zT1fY4T%Uuz=8Ƌ[](oIVX,We׸xDaZg2<mPj{=2gͶ^vǓ:o8q괞'./8#{rG:OP` r,.8e]CNI9?izM]J_*t%ա>20DŽw{G^Rx*Is'L^>j a {|A(.-A04 ጅs-K,ɖytkILxc&8ƂY UU^k4Ӊޡs^MN||/<ʼnyBC Bv??ƽ^>]]Bx'd*tV)P7;,;1tzRt]zyɹeȱ+vQ!q̊61?<^JUթ .i9uܤp/&w\p3y2r.!|>r.K`KS=qJ+*bK"d;Igy\Ǔɍ KLסݽ|ͅ7s^dp(C"lv;+{1^>qńM8)wӣM>Ӱ|^y~ܫRS hݨnf0|0QD(zIURܻxX.A]]]>mʲ9f^vpq̏[Lf&:2`&(CgO c|`8ΣPab@_;?/+"rFᗎheQ8>=b{Q#'90TJIZ)=W/ǃnU&͝o ɷbBC=qλݮlC㽼tܸcS8d Bᲃ=cs#s;Sr 83h+2ߗ- 秃y^m5S9 A kITg?dxXz~ s}}]椿sl`>,(p؎LK cXiǣGR9>N)RZRT8CR4.xyȺ! ,\Y9tH½=k3Oph\uPs1%U<4Ȏ熞mD}|'7Jr7.`g7P@ggSLx2OⸯWy1o@->_tiSx[>YnƂG@ZzYg c[7^o?pX ~Sӭԭ:UiވRҘ.uy"L.F9 yBIHwo#{b^ Cq%K)j#(/T8[>WUy's\`|r!o 'Tk}]՛1ѓ]8]Rq<=9Gu+U)i8vm9V'  L.<{$VLpϱ2qlkyǂu]DYqB(MmIx0TGrc,fSc@$lw(-h&ȁ|-]q>e:<ӈ~3;~O)iAx+Qm(% y?tKyCGR3,F7XM ك0({y_…}&{IYx|pEN(\\,y70PÑ2=ؖ¹񥂹pͽ{cXV:݁x7 n=gOaџ@t4)%ü2(+ VkxPά1<bƩA?ޖHrŵ(J(DʊWjV777Űc}H]n$̊(85kF Ǚ rA7H AD ga5B_TzOۺy8{^$6UUL/Yfܞ\z1WQF IؙgN,#r9ై&@b`R=Ȅhyg<(s4za,~@GHdPk#MAm)TL/7K3OnM)ӊc,4fI>]q x",7OtN4caI -q0̎s T"y7Ar=x<$%;c8GB[u]ir%a!Tv{Ƚ5H$]F 3(Fxlr\!+_F4xlD&?u*Y=oq t99._V?L8WtMp΂2QI?fSghqRs'Q`<C%Q1Cs j Ouz! s~>L{p~Hخoa 2/+9ס7 ,]/L“z/?y]/KTUU:cCCBD&]sƂQfGLjЦ9۩\_ŒHy~ck㳾L Džם1$ (I;1Y>)] bPJFwЍ8\㍿/?K{#Monn.J\qY:꽣0t 5;C"?IhFHגDOZ&Nseoe<1= $}K S[Oxo˭ߗ B"䝪J ,7$A6ƼmݪmI~Yx7d<8[p^"IyԣG; W^Ȑ1zWUbce>G^Ø<欰!Ԋq, M*@NeJ4xʽ Z6wvӉwEBRFiygBR}O&/[Dr= 5P\ߕO_9v;5Mst^ YDѡޙ#h{WP]cOZž{5sB1J)ep3b fZ{xuRAټ}>yyvcei-6b,4y9rc,^qt:B{ kF (C%]ItAF|;∐]f528#E1/X-~8C q i}GUW q9z5-) ^, !C-ep~zT$9NBȘ ŌכzyxoC, Ë^#+͜$ر?AAQ*w3oO=I9B=r֬.!UU b|9| )|9RJ+  ,G/;l3xa歚WΥ|lg(ӛKJO+Kyd9 N3Dz-1wҡ̝)"œg/,͊d/WZ7Hǜw<)>\%_}8<+|*,ʰ\% qUhüsSqK Psto7{ Te%gƸ'D!:q{c=W~{:ci9lҙ7ʆ9#1ң!pw1|["<2t\ .^.4Sf,0.*}H`|aca jsjƙc0O7kᐁ-ؽC sitPXiUU)ŹpնTU:I`QQ{XQHmeR|9FT2!p@= Jy8}c c-IN7!2|CGMQd .N9"'Z(8A&yyPr!)8b9=n#% ם !o~7^uxPkLQM=oƖTF~O. A^;~t GoKz ΋&K cpJx_<&J9 oƷȎ0Cz/s U}u;705+WU)E&6|Y1c!V zY!Z~{9Pp㪺< A--|aW$:KBBS FP`z{εm^</t>Dz:1jw@0K%7!xpC-rr!?m//Wo ͵Մ\ ,nEr [y2:?sch9v"hgpi9Cyi*4#$]xYg]zw7IQǷI+EQDI"9"2C>w'UVӴHZu WU7|l2/{,F .=>ǜcͮ'69Ht" ?Csq|-s@Ppz.$:,]@5WJyuߚ/AQ0e1S !i(8RRS7ӊ HlFaYd@awtϾIS@ oRuIT_LxA@C4 '9NE.O"l{!^( OAJ5xsqv ;$r} CTU`+0|ZTa~$]ctȱkg=x$qj_:iǹX׶qx+|OQ2jIv _܃u9&KA,1$B;2y%2,. 6<o-X6꣼>s!"!f",( ''2ˢ^_F%F^tʕ,Sf֛.E.t!i4Ç?v~w~w~_xMGT~[<(γKXSx(`pv|_zcP8wQ>uiYqBbk8B-qoŵi'WqŸ{M4o~pn{X9AKؖ .͌ܣ'sg=Ƙ!GT3 ՟O?ӧOo%%Jz*i#I??+{uulrȉI0Ų<^0u<νwDQDuTIxQ޳ZӼw=[В_3pcuC.sw'IZu=҄gw)ޫi(WSIӴ' G+=IDATL:Ɣjs{/qS}Nku|F5m+Ťq8k3GhjߘXR~IַiӶ[NaT*EUR5ĤT5J~PJ@IcL֛IABLkB̏=Pum' FCTm߳O @qFUЩiufӳ𪪰=c*(4s_JRU')䍚)ہqN7b"M6Jqci&JUn\mt<ԟ<*(ƤnԮVckȟDj=ܲ#&o7&vEljfՍCAuu^ŔO MVdu5Qi,_(, &ՄtZd/)4Y2 }/[#O' }jn p9I+Z00};:hs0Hmh^iF;ֵj.Ҝ9qB: uPSjꠘQ0Px)OU%5Mt* è8 g"dN4|.[.)ΧU)Iq|} VUi*7#CJ1\$Ƙ{$B4Щ ,):MkB-Ũ|Ώ.&kx)F%U>RIiNtyoa2C?z2q*׍U%Sf%O~ַӧTJC?GU N==)ori 8&r:x(} 9R,qԟOYϪ,ȜF5u7u\!L+%!iHU .:^bLj!f0RZ(LT*:hGݷ(?_/+@RBǡ([8b~YuQ1ES1y:үmA4q|*%厵mAqPetN)eYaUU)T$%MFC? |PJ20lUh4NmR%PY1{D/g?π~>V VRoǾѣl*5u];X|t^i6C/nfb|>)L|xJ2ρF0p:{ܸ_]kU`D s3LJs 4'u8ŻN3⽯T׍Y'f/DB6ˍ%r@XI> G4C-i1*3&W!Ce!oS<8*2^Fg(R8:^ǔۛzo"c>)^@Zl>|%t?FRJ*Aҝgʇ$I_+))tݭtT"'e~+IgI}_ϔVGeiVaZB2^䘃ftThgIϽro2^(Ge]pf~IaR/l_'I ,ӓfIENDB`gx/images/Button_up_over.png000664 001750 001750 00000010050 12702465756 017317 0ustar00sergiosergio000000 000000 PNG  IHDRh ?`sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tY|IDATx[l\yNQ-DJSdlEǮ ]ۨbܷ( /A>) qFu)PW\'JZ7:%w{nsjW9咴ioϜoGgϮ-!['q)$^o #6i3B&OQ37k{{*gl^ԪDB5SFMb>U^DžԋmYԲlJ?o$ M-ihli]9860I1 ЮOoe|= =Cğǩ/DLRp)N"_!W'$vB:'+:8%g 5wN zZOEIL<\hIeKnk H"z@]qTPE2k\suztms=$?>|]s=ϥqh}JZ 4ˌ,+v|s|Ts[{[cS&][_ z:;2q%բ9W [A }nΤCemB a5߲XzL@ OD IO'e2U`'S?ڧv1-F"6s:@<$΍$h|;\Qp55n04}V|EBQ!,]Ս[CphXޱzÍ [^b䒥+ni]kڇQjt6A /a~%xip%z8x&0GVԎ;6^DL mwQ}zn=G1b4 `Y,˂۶iCs[mHۖ,_|.ovԬ-F_%=O WHas(%>%`AvbIa]/ZݸG'|r@P(<֟#+ ,ɷp{bRԧ.N+m˱.G;?ұc.c\.+dFݑ#Fb @k}08@w/7|2n^™g|68 Wl;*^-_^@|ǾlTp_!AzP(M0q%txgJ 1`@oy=%V"NB&Gw ~PG3U'f>D= 7NAZߋΟ\tfc+{Oo{1t.ۓv](}siߙ1!Z 5VM;cgњ8Ξ| >0wkb/;KMo?bsih8S7On}twrw* 1`1i<1Je`.s8B@ξS\tn4$bCԳp{$ !@ ۼO᝷O|7 I4cgu>s 7ZF\y`cU5ߧ!c`]:6ٓoڥSxvڣ^:}hCO,9~^z5L o3pavϝn"n, 1`G}Q7 I+UQtk˲@|.~4 긓|;Q |"4P;5e g?7zbb|ۿr&T;p@k}0XЌ߽f$I 0p.v%As\: S'f>D= 7NAZߋBR?^{sǏE3vI#lbfl{"0 YݮY6 (OQ}znoC-<ĘXiO10\/}3 믿 37Fv72I;M<{=;Jו~9/R iWR*]^l{k UȨrY`YL\G" A !a:z3qH!JevZtҕx+ϠvGnm@p=7K=7;3'wzraQ}znovI>HK i>̟η_}_`xxSAnd%gяóZD ҝ7󀻷 ݱm.%(6>xWϿ7?5FFq*~# '?ϙΌ4 ^e4,8eI72Am;-tos[RZ)m!OwO**momp{8w_;Fs'Rv>qqigqy65,o`!߱}AJiI-;ҎNRHRG*ªh ._Z*n [A},%\0IVm=_G}@A6E R B!b.o|QMiض:{# .|xkwFXM'OjPi|kh]ӵ'9(LN|idddtIg4c :####p =i!.젍>OwUR.Q݉qyPwIB"$tU?ڧvܱmR/5h}~RxWIB{FyGc#VIBqg0$4cLo (-2^t#Cɢ.:J͒WnCIrHɀꉶǀ@]Rq%Ĺ$yhd؇jIWH!f>D=P:.X c@ڹ"#Sj&:@;S^䦊ʹrMr$ q}}߷<Dž8pO 8WL^Zğ5O;Ig6D}H7c`#lh'kW-SbMos#E9Q2S|Z\. Lr_hgr_n&kXACR > ;fMcgIq\A5q*-"&{HaNZ>M 8/^LP?}iƘEWu]p?}RX!%B_`ͺ`R͘ Ԫ4q=,Ngc|+`0,.}qοOS{a* Ammmq*YIENDB`gx/000700 001750 001750 00000000000 12703321515 012303 5ustar00sergiosergio000000 000000 gx/images/ctrl_option_off.png000664 001750 001750 00000001754 12702465756 017506 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09@IDATx;]Uo{g&8&<$D_@TTF, +K[lEPA|U %FI1d;αdU7=g4i2{p۱;1!~8ϛM xU(k+yOwJ)5MJ)' hrMqq4.^o #x ˸ 4I<~ A|~ 8̮oeY+yln|Ԫ]bpUkE-fc/T]-~ЗŸ>6g Sjod̵cT7ͩZ#ϣ >\:`}ULf-Zȁڥ_$}$[cOo}p/Ղ^ojGd)nu'~b8dq^uY|% Ǒp3>j,X;B!ԏve<7"dvn |p6WCj gf/v> jM[7bt7DI""QQzFP-v5筙`sXGd%DGjCy>lQiY8>Z ŀoǚuh-')Y99ۂtܪECkM'msW?45)ASط=O a[ǾfN>4XesfAuڜ5;_Qsjvx#뵛;JIENDB`gx/main.c000664 001750 001750 00000037756 12702465756 013450 0ustar00sergiosergio000000 000000 /**************************************************************************** * main.c * * Genesis Plus GX * * Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #include "gui.h" #include "menu.h" #include "history.h" #include "file_slot.h" #include "file_load.h" #include "filesel.h" #include "cheats.h" #include "md_ntsc.h" #include #ifdef HW_RVL #include #include extern bool sdio_Deinitialize(); extern void USBStorage_Deinitialize(); #endif u32 Shutdown = 0; u32 ConfigRequested = 1; #ifdef HW_RVL /**************************************************************************** * Power Button callbacks ***************************************************************************/ static void PowerOff_cb(void) { Shutdown = 1; ConfigRequested = 1; reload = 0; } static void Reload_cb(void) { Shutdown = 1; ConfigRequested = 1; } #endif /**************************************************************************** * Reset Button callback ***************************************************************************/ static void Reset_cb(void) { if (system_hw & SYSTEM_MD) { /* Soft Reset */ gen_reset(0); } else if (system_hw == SYSTEM_SMS) { /* assert RESET input (Master System model 1 only) */ io_reg[0x0D] &= ~IO_RESET_HI; } } /*************************************************************************** * Genesis Plus Virtual Machine * ***************************************************************************/ static void init_machine(void) { /* system is not initialized */ config.hot_swap &= 0x01; /* mark all BIOS as unloaded */ system_bios = 0; /* try to load Genesis BOOT ROM (2KB max) */ memset(boot_rom, 0xFF, 0x800); if (load_archive(MD_BIOS, boot_rom, 0x800, NULL) > 0) { /* check if BOOT ROM header is valid */ if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) { /* mark Genesis BIOS as loaded */ system_bios = SYSTEM_MD; } } /* allocate global work bitmap */ memset(&bitmap, 0, sizeof (bitmap)); bitmap.width = MD_NTSC_OUT_WIDTH(320 + 2 * 14); bitmap.height = 576; bitmap.pitch = bitmap.width * 2; bitmap.data = memalign(32, bitmap.pitch * bitmap.height); if (!bitmap.data) { GUI_WaitPrompt("Error","Unable to allocate memory"); exit(0); } } static void run_emulation(void) { u32 sync; /* main emulation loop */ while (1) { /* emulated system */ if (system_hw == SYSTEM_MCD) { /* 16-bit hardware + CD */ while (!ConfigRequested) { /* render frame */ system_frame_scd(0); /* audio/video sync */ sync = VIDEO_WAIT | VIDEO_UPDATE | AUDIO_WAIT | AUDIO_UPDATE; while (sync) { /* update audio */ sync &= gx_audio_Update(sync); /* update video */ sync &= gx_video_Update(sync); } } } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit hardware */ while (!ConfigRequested) { /* render frame */ system_frame_gen(0); /* audio/video sync */ sync = VIDEO_WAIT | VIDEO_UPDATE | AUDIO_WAIT | AUDIO_UPDATE; while (sync) { /* update audio */ sync &= gx_audio_Update(sync); /* update video */ sync &= gx_video_Update(sync); } } } else { /* 8-bit hardware */ while (!ConfigRequested) { /* render frame */ system_frame_sms(0); /* audio/video sync */ sync = VIDEO_WAIT | VIDEO_UPDATE | AUDIO_WAIT | AUDIO_UPDATE; while (sync) { /* update audio */ sync &= gx_audio_Update(sync); /* update video */ sync &= gx_video_Update(sync); } } } /* stop video & audio */ gx_audio_Stop(); gx_video_Stop(); /* show menu */ ConfigRequested = 0; mainmenu(); /* restart video & audio */ gx_audio_Start(); gx_video_Start(); } } /********************************************************************************************************************************************************* Get emulator input framerate (actually used by audio emulation to approximate number of samples rendered on each frame, see audio_init in system.c) *********************************************************************************************************************************************************/ double get_framerate(void) { /* Run emulator at original VDP framerate if console TV mode does not match emulated TV mode or VSYNC is disabled */ if (!config.vsync || (config.tv_mode == !vdp_pal)) { return 0.0; } /* Otherwise, run emulator at Wii/Gamecube framerate to ensure perfect video synchronization */ if (vdp_pal) { /* 288p -> 13500000 pixels/sec, 864 pixels/line, 312 lines/field -> fps = 13500000/864/312 = 50.08 hz */ /* 288i,576i -> 13500000 pixels/sec, 864 pixels/line, 312.5 lines/field (two fields = one frame = 625 lines) -> fps = 13500000/864/312.5 = 50.00 hz */ return (config.render || interlaced) ? (27000000.0/864.0/625.0) : (13500000.0/864.0/312.0); } else { /* 240p -> 13500000 pixels/sec, 858 pixels/line, 263 lines/field -> fps = 13500000/858/263 = 59.83 hz */ /* 240i,480i -> 13500000 pixels/sec, 858 pixels/line, 262.5 lines/field (two fields = one frame = 525 lines) -> fps = 13500000/858/262.5 = 59.94 hz */ /* 480p -> 27000000 pixels/sec, 858 pixels/line, 525 lines/field -> fps = 27000000/858/525 = 59.94 hz */ return (config.render || interlaced) ? (27000000.0/858.0/525.0) : (13500000.0/858.0/263.0); } } /******************************************* Restart emulation when loading a new game ********************************************/ void reloadrom(void) { /* Cartridge "Hot Swap" support (make sure system has already been inited once and use cartridges) */ if ((config.hot_swap == 3) && ((system_hw != SYSTEM_MCD) || scd.cartridge.boot)) { /* Only initialize cartridge hardware */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit cartridge */ md_cart_init(); md_cart_reset(1); } else { /* 8-bit cartridge */ sms_cart_init(); sms_cart_reset(); } } /* Disc Swap support (automatically enabled if CD tray is open) */ else if ((system_hw != SYSTEM_MCD) || (cdd.status != CD_OPEN)) { /* Initialize audio emulation */ interlaced = 0; audio_init(48000, get_framerate()); /* System Power-On */ system_init(); system_reset(); /* Allow hot swap */ config.hot_swap |= 2; } /* Auto-Load Backup RAM */ slot_autoload(0,config.s_device); /* Auto-Load State */ slot_autoload(config.s_default,config.s_device); /* Load Cheat file */ CheatLoad(); } /************************************************** Shutdown everything properly ***************************************************/ void shutdown(void) { /* save current config */ config_save(); /* auto-save State file */ slot_autosave(config.s_default,config.s_device); /* shutdown emulation core */ audio_shutdown(); /* shutdown audio & video engines */ gx_audio_Shutdown(); gx_video_Shutdown(); if (bitmap.data) free(bitmap.data); #ifdef HW_RVL /* unmount all devices */ ISO9660_Unmount("dvd:"); fatUnmount("sd"); fatUnmount("usb"); /* shutdown all devices */ DI_Close(); sdio_Deinitialize(); USBStorage_Deinitialize(); MOUSE_Deinit(); #endif } /*************************************************************************** * M A I N * ***************************************************************************/ int main (int argc, char *argv[]) { #ifdef HW_RVL /* enable 64-byte fetch mode for L2 cache */ L2Enhance(); /* disable DVD cache */ DI_UseCache(0); /* autodetect loader arguments */ if ((argc >= 3) && (argv[1] != NULL)) { /* check if autoloading from USB is requested */ if (!strncasecmp(argv[1], "usb:/", 5)) { /* reload to IOS58 for USB2 support */ if (IOS_GetVersion() != 58) { /* warning: DVD support will be disabled after IOS reloading ! */ IOS_ReloadIOS(58); } } } #endif /* initialize video engine */ gx_video_Init(); /* initialize input engine */ gx_input_Init(); /* initialize FAT devices */ int retry = 0; int fatMounted = 0; /* try to mount FAT devices during 3 seconds */ while (!fatMounted && (retry < 12)) { fatMounted = fatInitDefault(); usleep(250000); retry++; } if (fatMounted) { /* base directory */ char pathname[MAXPATHLEN]; sprintf (pathname, DEFAULT_PATH); DIR *dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default SRAM & Savestate files directories */ sprintf (pathname, "%s/saves",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/saves/md",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/saves/ms",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/saves/gg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/saves/sg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/saves/cd",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default Snapshot files directories */ sprintf (pathname, "%s/snaps",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/snaps/md",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/snaps/ms",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/snaps/gg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/snaps/sg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/snaps/cd",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default Cheat files directories */ sprintf (pathname, "%s/cheats",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/cheats/md",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/cheats/ms",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/cheats/gg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/cheats/sg",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); sprintf (pathname, "%s/cheats/cd",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default BIOS ROM files directories */ sprintf (pathname, "%s/bios",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); /* default LOCK-ON ROM files directories */ sprintf (pathname, "%s/lock-on",DEFAULT_PATH); dir = opendir(pathname); if (dir) closedir(dir); else mkdir(pathname,S_IRWXU); } /* initialize audio engine */ gx_audio_Init(); /* initialize emulation */ history_default(); config_default(); init_machine(); /* file autoloading */ int autoload = config.autoload; /* autodetect loader arguments */ if ((argc >= 3) && (argv[1] != NULL) && (argv[2] != NULL)) { /* automatically load any file passed as argument */ autoload = 1; /* add the file to the top of the history. */ history_add_file(argv[1], argv[2], 0); } /* automatically load first file from history list if requested */ if (autoload) { SILENT = 1; if (OpenDirectory(TYPE_RECENT, -1)) { if (LoadFile(0)) { reloadrom(); gx_video_Start(); gx_audio_Start(); ConfigRequested = 0; } } SILENT = 0; } /* show disclaimer before entering menu */ if (ConfigRequested) { legal(); } /* initialize stub loader detection */ reload = 0; #ifdef HW_RVL /* autodetect loader arguments */ if ((argc >= 4) && (argv[3] != NULL)) { /* assume proper loader stub exists */ reload = (void(*)())0x80001800; /* return to loader when POWER buttons are pressed */ SYS_SetPowerCallback(Reload_cb); } else { /* autodetect HomeBrew Channel stub */ u32 *sig = (u32*)0x80001800; if ((sig[1] == 0x53545542) && (sig[2] == 0x48415858)) { reload = (void(*)())0x80001800; } /* by default, shutdown system when POWER buttons are pressed */ SYS_SetPowerCallback(PowerOff_cb); } #else /* autodetect SDLoad stub */ u32 *sig = (u32*)0x80001800; if (sig[0] == 0x7c6000a6) { reload = (void(*)())0x80001800; } #endif /* RESET button callback */ SYS_SetResetCallback(Reset_cb); /* main emulation loop */ run_emulation(); /* we should never return anyway */ return 0; } core/loadrom.h000664 001750 001750 00000006572 12702465756 014470 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * ROM Loading Support * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _LOADROM_H_ #define _LOADROM_H_ #ifndef MAXROMSIZE #define MAXROMSIZE 10485760 #endif typedef struct { char consoletype[18]; /* Genesis or Mega Drive */ char copyright[18]; /* Copyright message */ char domestic[50]; /* Domestic name of ROM */ char international[50]; /* International name of ROM */ char ROMType[4]; /* Boot ROM (BR), Educational (AL) or Game (GM) program */ char product[14]; /* Product serial number */ unsigned short checksum; /* ROM Checksum (header) */ unsigned short realchecksum; /* ROM Checksum (calculated) */ unsigned int romstart; /* ROM start address */ unsigned int romend; /* ROM end address */ char country[18]; /* Country flag */ uint16 peripherals; /* Supported peripherals */ } ROMINFO; /* Global variables */ extern ROMINFO rominfo; extern uint8 romtype; /* Function prototypes */ extern int load_bios(int system); extern int load_rom(char *filename); extern void get_region(char *romheader); extern char *get_company(void); extern char *get_peripheral(int index); extern void getrominfo(char *romheader); #endif /* _LOADROM_H_ */ libretro/msvc/msvc-2010-360/msvc-2010-360.vcxproj000664 001750 001750 00000066504 12702465756 021636 0ustar00sergiosergio000000 000000  CodeAnalysis Xbox 360 Debug Xbox 360 Profile Xbox 360 Profile_FastCap Xbox 360 Release Xbox 360 Release_LTCG Xbox 360 CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC CompileAsC {00CE82EC-E948-4BB6-B726-23BF1571B05A} Xbox360Proj genesis-next-msvc-2010-360 StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary true MultiByte $(OutDir)msvc-2010-360$(TargetExt) $(OutDir)msvc-2010-360$(TargetExt) $(OutDir)msvc-2010-360$(TargetExt) $(OutDir)msvc-2010-360$(TargetExt) $(OutDir)msvc-2010-360$(TargetExt) $(OutDir)msvc-2010-360$(TargetExt) NotUsing Level3 ProgramDatabase Disabled false true false $(OutDir)$(ProjectName).pch MultiThreadedDebug _DEBUG;_XBOX;_XBOX360;_LIB;INLINE=static _inline;__attribute__=;__inline__=_inline;__extension__=;USE_16BPP_RENDERING;__LIBRETRO__;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN Callcap $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true NotUsing Level4 ProgramDatabase Disabled false true AnalyzeOnly false $(OutDir)$(ProjectName).pch MultiThreadedDebug _DEBUG;_XBOX;_XBOX360;_LIB;%(PreprocessorDefinitions);INLINE=static _inline;__attribute__=;__inline__=_inline;__extension__=;USE_16BPP_RENDERING;__LIBRETRO__;FRONTEND_SUPPORTS_RGB565;USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN Callcap $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true Level3 NotUsing Full true false true ProgramDatabase Size false $(OutDir)$(ProjectName).pch MultiThreaded NDEBUG;_XBOX;_XBOX360;PROFILE;_LIB;__LIBRETRO__;USE_16BPP_RENDERING;INLINE=static _inline;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN Callcap $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true false xapilib.lib;%(IgnoreSpecificDefaultLibraries) true Level3 NotUsing Full true false true ProgramDatabase Fastcap Size false $(OutDir)$(ProjectName).pch MultiThreaded NDEBUG;_XBOX;_XBOX360;PROFILE;FASTCAP;_LIB;__LIBRETRO__;USE_16BPP_RENDERING;INLINE=static _inline;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true false true Level3 NotUsing Full true true ProgramDatabase Size false false $(OutDir)$(ProjectName).pch MultiThreaded NDEBUG;_XBOX;_XBOX360;_LIB;INLINE=static _inline;__inline__=_inline;__extension__=;USE_16BPP_RENDERING;__LIBRETRO__;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true true true Level3 NotUsing Full true true ProgramDatabase Size false false $(OutDir)$(ProjectName).pch MultiThreaded NDEBUG;_XBOX;_XBOX360;LTCG;_LIB;INLINE=static _inline;__inline__=_inline;__extension__=;USE_16BPP_RENDERING;__LIBRETRO__;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=BIG_ENDIAN $(SolutionDir)\..\..\core;$(SolutionDir)\..\..\core\cd_hw;$(SolutionDir)\..\..\core\cart_hw;$(SolutionDir)\..\..\core\sound;$(SolutionDir)\..\..\core\z80;$(SolutionDir)\..\..\core\m68k;$(SolutionDir)\..\..\core\input_hw;$(SolutionDir)\..\..\core\cart_hw\svp;$(SolutionDir)\..\..\core\ntsc;$(SolutionDir)\..\;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) CompileAsC true true true gx/images/Load_md.png000664 001750 001750 00000015157 12702465756 015661 0ustar00sergiosergio000000 000000 PNG  IHDRT\8sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/28/11IDATxypu?Eٍkz8`z $Nv:$m\{&4SM70q3`;.Nb0AeBZ_8!5̼y{v="@(߂8@{@1 l+%,s^ ρWR!|,E@fD t m;EI"F^,Јp!as)(0t"`5h s). 5"ʘ犀@!ɪE4t:@ ځӈK#%p1cZ0-/p|A ׈hxTs_50(7U|ͳ.>rA5Acs*@?bFD+@HCHg G9{Nq)+eq˲9"*$ rGRAUWJ@ R9Ώa !>LĈ4 *E:ډx8Br >|t)@DS}ܔo} U_lEl6K aBL&t:z衢E5k(+++xDzmmm qټ:0/mT%0T,$2b蛩"#~jʙ[Lr6y^(łEEEgp ,\M6_#ɸf*^b{a߾}477fSO=j|W}"!|bl~;-b;TD8Vf5D7cip;p]fn0>E/_?LUUHT*E*q\qx<}}}]wym۶~z;lm"~̒TǀkY{\F/p,dtGm67+f27EEEɓ'***]]]CX"z+++9y$G̙3$I*++Yx1J`wAAdA(//>lذ9q!t#v@Eƺˁy9@Weh u Y:ͳ]-*=a*PSSS4}t̙ܹs0aO?4Nիlڴ`0FibT*N"N3i$nfv<{ތET]7")s-GG h:U [g)!|V(f@4 L4d2Fw]t-8555$ Ξ=ӧihh JVZZ`{e|رc477O6 _+,,$Dѣ?СC/€q&"B_' jG h'+pbC˨u_piii`ҤIHMM se޽<6loܸ9z(۶m SPPә8q"۷ox MMMhU_:ňq-Y9qr?\Z+-7oSNeƌDQ8}4SLvm;wg,[JAiRoo//RfϞ=k6tRvŜ9sq:::xg{X`STT---%NN ̘1\eŊl޼~~Gy;{"_`pEz5b. p>8UH81`׏!r }+_aŤR)^u~ӟ~,XҥKIRttt0{lV\I"ޣD"ASSS*Hק(Pb2 o&'Ndǝ’4yӦ455piVXu\ƹȴ_z4 8 |?L'?>֭[y8~8'Ofܹ̜9Μ9p9VZ޽{ټy3K,3uTMFYYF ɓ'3택ZD~)|ZE8a0"vd $sJm5iDo[ )f_859x [ne̙O4; M6-}V-ZDKK +V~bJKKٸqcplٲ9savə3g(++j:::x嗩^kkkb׮],ե@4MQ0F+i?j@;P?SiAKoo|| _"pGsN>O~zرc\Vd2$~a>Yl6˩S8r/uuu}Nr۳}}}H$v Q{/ uU#Ȫ%RzȲaıOꐠ98x`>]ꫯf``nJJJXd =uuu^o~vm\_| ǡY|9---M6%z-Ztϟ?ښ<2mIG"mvUMB|T9S@D$:VguS<Xf*O!rh; ޾}RoV*\|9'NH$B2u]zzz߳gOlڵW_Moo/---S[[,..v'N' Ymv(X::뱧vK'dQsi@O dҘiF`7xcիJ"}vguQk_Z~~$*c6]Q bm)@ hoJa\ @ }NT()*lT֋_#3 >@/ !Cg&Yeׯ[$M#`d& Z.d& B;biӰ4@O!AR)3pv*o@_,9TÕԙF6E%puh=^ ,$oH өvDe$1X2LS ! 6:Fc4ڔ47L~\ H[mak;3zl0!aq" cA0/ls! w^2 ʧt4uiE]<N_L%u lW^wl=yQD~4@ :N1@6)| l)Mz|x|mh"HgQp1oI|.7BTh}J7L7D;/i=a苖~J=<܂p5N .LוtFW3 lF}Ҳԅ7{`z?gU\~܉O!SӸ?Hz?NVĪw{#'EXh4џq:48cL『1:48cL『1:48cL『1:48cL『1:48cL『1:48cL『1:,]42$Vi?8;Xߦ2H~vxG_;Hgm ɹX5$l8 9sn"?6e=o,DR1 5h^SYŁ}_E'U+8p`U~U0> nu"bi Ik<m%4#Ȗ7 6K~l 3uO> 2H ["d ̀*^h9l87Lz_ _?eUFꇋE܆Ydfߐw5ȆW=In;Mql>'y<0 +#8>"Ӯ_{"urU /2co%h t璭CBXg{ 積AdM\(o%2h"92 GIW ݁2cFԆ0_0}m+E$qݰVgA[7oDkJ!,_d8(Pr?ߜggd>嫃 wQE‚(2X6#* l=[#{T'MO3CLz4U D2 Pb sm2 iD }GD@M㾇3~OA$`F5Ȟ%. UD6QIw!S{? ;OB,u#7/F Ht47#_A$U\wg9"j h0e|tz)C_㙎V)^G$b!>m~7e{)RU: cN1!EIENDB`core/input_hw/gamepad.h000664 001750 001750 00000006305 12702465756 016260 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * 2-Buttons, 3-Buttons & 6-Buttons controller support * with support for J-Cart, 4-Way Play & Master Tap adapters * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GAMEPAD_H_ #define _GAMEPAD_H_ /* Function prototypes */ extern void gamepad_reset(int port); extern void gamepad_refresh(int port); extern void gamepad_end_frame(int port, unsigned int cycles); extern unsigned char gamepad_1_read(void); extern unsigned char gamepad_2_read(void); extern void gamepad_1_write(unsigned char data, unsigned char mask); extern void gamepad_2_write(unsigned char data, unsigned char mask); extern unsigned char wayplay_1_read(void); extern unsigned char wayplay_2_read(void); extern void wayplay_1_write(unsigned char data, unsigned char mask); extern void wayplay_2_write(unsigned char data, unsigned char mask); extern unsigned int jcart_read(unsigned int address); extern void jcart_write(unsigned int address, unsigned int data); extern unsigned char mastertap_1_read(void); extern unsigned char mastertap_2_read(void); extern void mastertap_1_write(unsigned char data, unsigned char mask); extern void mastertap_2_write(unsigned char data, unsigned char mask); #endif gx/gx_video.c000664 001750 001750 00000170107 12702465756 014314 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_video.c * * Genesis Plus GX video & rendering support * * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #include "md_ntsc.h" #include "sms_ntsc.h" #include "gx_input.h" #include #include /* libpng wrapper */ typedef struct { u8 *buffer; u32 offset; } png_image; extern const u8 Crosshair_p1_png[]; extern const u8 Crosshair_p2_png[]; extern const u8 CD_access_off_png[]; extern const u8 CD_access_on_png[]; extern const u8 CD_ready_off_png[]; extern const u8 CD_ready_on_png[]; /*** VI Mode ***/ GXRModeObj *vmode; /*** 50/60hz flag ***/ u32 gc_pal; /*** NTSC Filters ***/ sms_ntsc_t *sms_ntsc; md_ntsc_t *md_ntsc; /*** GX FIFO ***/ static u8 gp_fifo[GX_FIFO_MINSIZE] ATTRIBUTE_ALIGN(32); /*** GX Textures ***/ static u32 vwidth, vheight; static gx_texture *crosshair[2]; static gx_texture *cd_leds[2][2]; /*** Framebuffers ***/ static u32 *xfb; static u32 drawDone; /*** Frame Sync ***/ u32 videoSync; static u32 videoWait; static u32 frameCount; static u64 starttime; /*** OSD ***/ static u32 osd; static char msg[16]; /***************************************************************************************/ /* Emulation video modes */ /***************************************************************************************/ static GXRModeObj *rmode; /* 288 lines progressive (PAL 50Hz) */ static GXRModeObj TV50hz_288p = { VI_TVMODE_PAL_DS, // viDisplayMode 640, // fbWidth VI_MAX_HEIGHT_PAL/2, // efbHeight VI_MAX_HEIGHT_PAL/2, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_PAL, // viWidth VI_MAX_HEIGHT_PAL, // viHeight VI_XFBMODE_SF, // xFBmode GX_FALSE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each {6,6},{6,6},{6,6}, // pix 1 {6,6},{6,6},{6,6}, // pix 2 {6,6},{6,6},{6,6} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 0, // line n-1 0, // line n-1 21, // line n 22, // line n 21, // line n 0, // line n+1 0 // line n+1 } }; /* 288 lines interlaced (PAL 50Hz) */ static GXRModeObj TV50hz_288i = { VI_TVMODE_PAL_INT, // viDisplayMode 640, // fbWidth VI_MAX_HEIGHT_PAL/2, // efbHeight VI_MAX_HEIGHT_PAL/2, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_PAL, // viWidth VI_MAX_HEIGHT_PAL, // viHeight VI_XFBMODE_SF, // xFBmode GX_TRUE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each {6,6},{6,6},{6,6}, // pix 1 {6,6},{6,6},{6,6}, // pix 2 {6,6},{6,6},{6,6} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 0, // line n-1 0, // line n-1 21, // line n 22, // line n 21, // line n 0, // line n+1 0 // line n+1 } }; /* 576 lines interlaced (PAL 50Hz, scaled) */ static GXRModeObj TV50hz_576i = { VI_TVMODE_PAL_INT, // viDisplayMode 640, // fbWidth 480, // efbHeight VI_MAX_HEIGHT_PAL, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_PAL, // viWidth VI_MAX_HEIGHT_PAL, // viHeight VI_XFBMODE_DF, // xFBmode GX_FALSE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each {6,6},{6,6},{6,6}, // pix 1 {6,6},{6,6},{6,6}, // pix 2 {6,6},{6,6},{6,6} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 8, // line n-1 8, // line n-1 10, // line n 12, // line n 10, // line n 8, // line n+1 8 // line n+1 } }; /* 240 lines progressive (NTSC or PAL 60Hz) */ static GXRModeObj TV60hz_240p = { VI_TVMODE_EURGB60_DS, // viDisplayMode 640, // fbWidth VI_MAX_HEIGHT_NTSC/2, // efbHeight VI_MAX_HEIGHT_NTSC/2, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_NTSC, // viWidth VI_MAX_HEIGHT_NTSC, // viHeight VI_XFBMODE_SF, // xFBmode GX_FALSE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each {6,6},{6,6},{6,6}, // pix 1 {6,6},{6,6},{6,6}, // pix 2 {6,6},{6,6},{6,6} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 0, // line n-1 0, // line n-1 21, // line n 22, // line n 21, // line n 0, // line n+1 0 // line n+1 } }; /* 240 lines interlaced (NTSC or PAL 60Hz) */ static GXRModeObj TV60hz_240i = { VI_TVMODE_EURGB60_INT, // viDisplayMode 640, // fbWidth VI_MAX_HEIGHT_NTSC/2, // efbHeight VI_MAX_HEIGHT_NTSC/2, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_NTSC, // viWidth VI_MAX_HEIGHT_NTSC, // viHeight VI_XFBMODE_SF, // xFBmode GX_TRUE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {3,2},{9,6},{3,10}, // pix 0, 3 sample points, 1/12 units, 4 bits each {3,2},{9,6},{3,10}, // pix 1 {9,2},{3,6},{9,10}, // pix 2 {9,2},{3,6},{9,10} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 0, // line n-1 0, // line n-1 21, // line n 22, // line n 21, // line n 0, // line n+1 0 // line n+1 } }; /* 480 lines interlaced (NTSC or PAL 60Hz) */ static GXRModeObj TV60hz_480i = { VI_TVMODE_EURGB60_INT,// viDisplayMode 640, // fbWidth VI_MAX_HEIGHT_NTSC, // efbHeight VI_MAX_HEIGHT_NTSC, // xfbHeight 0, // viXOrigin 0, // viYOrigin VI_MAX_WIDTH_NTSC, // viWidth VI_MAX_HEIGHT_NTSC, // viHeight VI_XFBMODE_DF, // xFBmode GX_FALSE, // field_rendering GX_FALSE, // aa // sample points arranged in increasing Y order { {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each {6,6},{6,6},{6,6}, // pix 1 {6,6},{6,6},{6,6}, // pix 2 {6,6},{6,6},{6,6} // pix 3 }, // vertical filter[7], 1/64 units, 6 bits each { 8, // line n-1 8, // line n-1 10, // line n 12, // line n 10, // line n 8, // line n+1 8 // line n+1 } }; /* TV modes pointer table */ static GXRModeObj *tvmodes[6] = { /* 60hz modes */ &TV60hz_240p, &TV60hz_240i, &TV60hz_480i, /* 50Hz modes */ &TV50hz_288p, &TV50hz_288i, &TV50hz_576i }; /***************************************************************************************/ /* GX rendering engine */ /***************************************************************************************/ typedef struct tagcamera { guVector pos; guVector up; guVector view; } camera; static s16 square[8] ATTRIBUTE_ALIGN (32); static camera cam = { {0.0F, 0.0F, -100.0F}, {0.0F, -1.0F, 0.0F}, {0.0F, 0.0F, 0.0F} }; /*** GX Display List ***/ static u8 d_list[32] ATTRIBUTE_ALIGN(32) = { GX_QUADS | GX_VTXFMT0, /* textured quad rendering (Vertex Format 0) */ 0x00, 0x04, /* one quad = 4x vertex */ 0x03, 0x00, 0x00, 0x00, 0x00, /* top left corner */ 0x02, 0x00, 0x01, 0x00, 0x00, /* top right corner */ 0x01, 0x00, 0x01, 0x00, 0x01, /* bottom right corner */ 0x00, 0x00, 0x00, 0x00, 0x01, /* bottom left corner */ 0x00, 0x00, 0x00, 0x00, 0x00, /* padding */ 0x00, 0x00, 0x00, 0x00 }; /* VSYNC callback */ static void vi_callback(u32 cnt) { /* get audio DMA remaining length */ vu16* const _dspReg = (u16*)0xCC005000; u16 remain = _dspReg[29]; /* adjust desired output samplerate if audio playback is not perfectly in sync with video */ if (remain > 0) { int samplerate; /* check current audio DMA position (from testing, delta keeps limited to +/- one 32-bit block i.e 8 samples) */ if (remain < 5) { /* previous frame DMA is not yet finished (real output rate is slightly slower than expected value) */ samplerate = 47950; } else { /* current frame DMA is already started (real output rate is slightly faster than expected value) */ samplerate = 48050; } /* update resampler ratios if output samplerate has changed */ if (samplerate != snd.sample_rate) { /* this will adjust the number of samples returned on next frame(s) */ audio_set_rate(samplerate, snd.frame_rate); } } /* clear VSYNC flag */ videoWait = 0; } /* XFB update */ static void xfb_update(u32 cnt) { /* check if EFB rendering is finished */ if (drawDone) { /* clear GX draw end flag */ drawDone = 0; /* copy EFB to XFB */ GX_CopyDisp(xfb, GX_FALSE); GX_Flush(); } } /* GX draw callback */ static void gx_callback(void) { /* set GX draw end flag */ drawDone = 1; } /* Initialize GX */ static void gxStart(void) { /*** Clear out FIFO area ***/ memset(&gp_fifo, 0, sizeof(gp_fifo)); /*** GX default ***/ GX_Init(&gp_fifo, sizeof(gp_fifo)); GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); GX_SetCullMode(GX_CULL_NONE); GX_SetClipMode(GX_CLIP_DISABLE); GX_SetDispCopyGamma(GX_GM_1_0); GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); GX_SetColorUpdate(GX_TRUE); GX_SetAlphaUpdate(GX_FALSE); /* Modelview */ Mtx view; memset (&view, 0, sizeof (Mtx)); guLookAt(view, &cam.pos, &cam.up, &cam.view); GX_LoadPosMtxImm(view, GX_PNMTX0); GX_Flush(); /* GX rendering callback */ GX_SetDrawDoneCallback(gx_callback); } /* Reset GX rendering */ static void gxResetRendering(u8 type) { GX_ClearVtxDesc(); if (type) { /* uses direct positionning, alpha blending & color channel (menu rendering) */ GX_SetBlendMode(GX_BM_BLEND,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); GX_SetVtxDesc (GX_VA_CLR0, GX_DIRECT); /* Color.out = Color.rasterized*Color.texture Alpha.out = Alpha.rasterized*Alpha.texture */ GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_SetNumTexGens(1); GX_SetNumChans(1); } else { /* uses array positionning, no alpha blending, no color channel (video emulation) */ GX_SetBlendMode(GX_BM_NONE,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 0); GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); GX_SetArray(GX_VA_POS, square, 2 * sizeof (s16)); /* Color.out = Color.texture Alpha.out = Alpha.texture */ GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); GX_SetNumTexGens(1); GX_SetNumChans(0); } GX_Flush(); } /* Reset GX rendering mode */ static void gxResetMode(GXRModeObj *tvmode, int vfilter_enabled) { Mtx44 p; f32 yScale = GX_GetYScaleFactor(tvmode->efbHeight, tvmode->xfbHeight); u16 xfbHeight = GX_SetDispCopyYScale(yScale); u16 xfbWidth = VIDEO_PadFramebufferWidth(tvmode->fbWidth); GX_SetCopyClear((GXColor)BLACK,0x00ffffff); GX_SetViewport(0.0F, 0.0F, tvmode->fbWidth, tvmode->efbHeight, 0.0F, 1.0F); GX_SetScissor(0, 0, tvmode->fbWidth, tvmode->efbHeight); GX_SetDispCopySrc(0, 0, tvmode->fbWidth, tvmode->efbHeight); GX_SetDispCopyDst(xfbWidth, xfbHeight); GX_SetCopyFilter(tvmode->aa, tvmode->sample_pattern, (tvmode->xfbMode == VI_XFBMODE_SF) ? GX_FALSE : vfilter_enabled, tvmode->vfilter); GX_SetFieldMode(tvmode->field_rendering, ((tvmode->viHeight == 2 * tvmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); guOrtho(p, tvmode->efbHeight/2, -(tvmode->efbHeight/2), -(tvmode->fbWidth/2), tvmode->fbWidth/2, 100, 1000); GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC); GX_Flush(); } /* Update Aspect Ratio */ static void gxSetAspectRatio(int *xscale, int *yscale) { /* Vertical Scaling is disabled by default */ *yscale = (bitmap.viewport.h + (2 * bitmap.viewport.y)) / 2; /* Original aspect ratio */ if (config.aspect) { /* Adjust vertical scaling when input & output video heights are different */ if (vdp_pal && (!gc_pal || config.render)) { *yscale = *yscale * VI_MAX_HEIGHT_NTSC / VI_MAX_HEIGHT_PAL; } else if (!vdp_pal && gc_pal && !config.render) { *yscale = *yscale * VI_MAX_HEIGHT_PAL / VI_MAX_HEIGHT_NTSC; } /* Horizontal Scaling */ /* Wii/Gamecube pixel clock = 13.5 Mhz */ /* "H32" pixel clock = Master Clock / 10 = 5.3693175 Mhz (NTSC) or 5.3203424 Mhz (PAL) */ /* "H40" pixel clock = Master Clock / 8 = 6.711646875 Mhz (NTSC) or 6.650428 Mhz (PAL) */ if (config.overscan & 2) { /* Horizontal borders are emulated */ if (reg[12] & 1) { /* 348 "H40" pixels = 348 * Wii/GC pixel clock / "H40" pixel clock = approx. 700 (NTSC) or 707 (PAL) Wii/GC pixels */ *xscale = (system_clock == MCLOCK_NTSC) ? 350 : 354; } else { /* 284 "H32" pixels = 284 * Wii/GC pixel clock / "H32" pixel clock = approx. 714 (NTSC) or 721 (PAL) Wii/GC pixels */ *xscale = (system_clock == MCLOCK_NTSC) ? 357 : 361; } } else { /* Horizontal borders are simulated */ if ((system_hw == SYSTEM_GG) && !config.gg_extra) { /* 160 "H32" pixels = 160 * Wii/GC pixel clock / "H32" pixel clock = approx. 403 Wii/GC pixels (NTSC only) */ *xscale = 202; } else { /* 320 "H40" pixels = 256 "H32" pixels = 256 * Wii/GC pixel clock / "H32" pixel clock = approx. 644 (NTSC) or 650 (PAL) Wii/GC pixels */ *xscale = (system_clock == MCLOCK_NTSC) ? 322 : 325; } } /* Aspect correction for widescreen TV */ if (config.aspect & 2) { /* Keep 4:3 aspect ratio on 16:9 output */ *xscale = (*xscale * 3) / 4; } } /* Manual aspect ratio */ else { /* By default, disable horizontal scaling */ *xscale = bitmap.viewport.w + (2 * bitmap.viewport.x); /* Keep original aspect ratio in H32 modes */ if (!(reg[12] & 1)) { *xscale = (*xscale * 320) / 256; } /* Game Gear specific: if borders are disabled, upscale to fullscreen */ if ((system_hw == SYSTEM_GG) && !config.gg_extra) { if (!(config.overscan & 1)) { /* Active area height = approx. 224 non-interlaced lines (60hz) */ *yscale = 112; } if (!(config.overscan & 2)) { /* Active area width = approx. 640 pixels */ *xscale = 320; } } /* By default, keep NTSC aspect ratio */ if (gc_pal && !config.render) { /* Upscale PAL output */ *yscale = *yscale * VI_MAX_HEIGHT_PAL / VI_MAX_HEIGHT_NTSC; } /* Add user scaling */ *xscale += config.xscale; *yscale += config.yscale; } } /* Reset GX/VI hardware scaler */ static void gxResetScaler(u32 width) { int xscale = 0; int yscale = 0; int offset = 0; /* retrieve screen aspect ratio */ gxSetAspectRatio(&xscale, &yscale); /* default EFB width */ rmode->fbWidth = 640; /* no filtering, disable GX horizontal scaling */ if (!config.bilinear && !config.ntsc) { if ((width <= 320) && (width <= xscale)) rmode->fbWidth = width * 2; else if (width <= 640) rmode->fbWidth = width; } /* configure VI width */ if ((xscale * 2) > rmode->fbWidth) { /* max width = 720 pixels */ if (xscale > 360) { /* save offset for later */ offset = ((xscale - 360) * rmode->fbWidth) / rmode->viWidth; /* maximal width */ xscale = 360; } /* enable VI upscaling */ rmode->viWidth = xscale * 2; rmode->viXOrigin = (720 - (xscale * 2)) / 2; /* default GX horizontal scaling */ xscale = (rmode->fbWidth / 2); /* handle additional upscaling */ if (offset) { /* no filtering, reduce EFB width to increase VI upscaling */ if (!config.bilinear && !config.ntsc) rmode->fbWidth -= (offset * 2); /* increase GX horizontal scaling */ else xscale += offset; } } else { /* VI horizontal scaling is disabled */ rmode->viWidth = rmode->fbWidth; rmode->viXOrigin = (720 - rmode->fbWidth) / 2; } /* Adjust screen position */ int xshift = (config.xshift * rmode->fbWidth) / rmode->viWidth; int yshift = (config.yshift * rmode->efbHeight) / rmode->viHeight; /* Double Resolution modes (480i/576i/480p) */ if (config.render) { yscale = yscale * 2; } /* Set GX scaler (Vertex Position matrix) */ square[0] = square[6] = xshift - xscale; square[2] = square[4] = xshift + xscale; square[1] = square[3] = yshift + yscale; square[5] = square[7] = yshift - yscale; DCStoreRange(square, 32); GX_InvVtxCache(); } static void gxDrawCrosshair(gx_texture *texture, int x, int y) { /* adjust texture dimensions to XFB->VI scaling */ int w = (texture->width * rmode->fbWidth) / (rmode->viWidth); int h = (texture->height * rmode->efbHeight) / (rmode->viHeight); /* Aspect correction for widescreen TV */ if (config.aspect & 2) w = (w * 3) / 4; /* EFB scale & shift */ int xwidth = square[2] - square[6]; int ywidth = square[3] - square[7]; /* adjust texture coordinates to EFB */ x = (((x + bitmap.viewport.x) * xwidth) / (bitmap.viewport.w+2*bitmap.viewport.x)) + square[6] - w/2; y = (((y + bitmap.viewport.y) * ywidth) / (bitmap.viewport.h+2*bitmap.viewport.y)) + square[7] - h/2; /* load texture object */ GXTexObj texObj; GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(x+w,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(x+w,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(x,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 0.0); GX_End(); } static void gxDrawCdLeds(gx_texture *texture_l, gx_texture *texture_r) { /* adjust texture dimensions to XFB->VI scaling */ int w = (texture_l->width * rmode->fbWidth) / (rmode->viWidth); int h = (texture_l->height * rmode->efbHeight) / (rmode->viHeight); /* Aspect correction for widescreen TV */ if (config.aspect & 2) w = (w * 3) / 4; /* EFB scale & shift */ int xwidth = square[2] - square[6]; int ywidth = square[3] - square[7]; /* adjust texture coordinates to EFB */ int xl = ((bitmap.viewport.x * xwidth) / vwidth) + square[6] + 8; int xr = (((bitmap.viewport.x + bitmap.viewport.w) * xwidth) / vwidth) + square[6] - 8 - w; int y = (((bitmap.viewport.y + bitmap.viewport.h - 4) * ywidth) / vheight) + square[7] - h; /* load left screen texture */ GXTexObj texObj; GX_InitTexObj(&texObj, texture_l->data, texture_l->width, texture_l->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(xl,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(xl+w,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(xl+w,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(xl,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 0.0); GX_End(); /* load right screen texture */ GX_InitTexObj(&texObj, texture_r->data, texture_r->width, texture_r->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(xr,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(xr+w,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(xr+w,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(xr,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 0.0); GX_End(); } static void gxDrawOnScreenText(char *msg) { GXRModeObj *temp = vmode; int y = (40 * rmode->efbHeight) / 480; int x = (bitmap.viewport.x > 0) ? (24 + bitmap.viewport.x) : 24; x = (x * rmode->fbWidth) / rmode->viWidth; vmode = rmode; FONT_write(msg, 20, x, y, rmode->fbWidth, (GXColor)WHITE); vmode = temp; } void gxDrawRectangle(s32 x, s32 y, s32 w, s32 h, u8 alpha, GXColor color) { /* GX only use Color channel for rendering */ GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); GX_Flush(); /* vertex coordinate */ x -= (vmode->fbWidth/2); y -= (vmode->efbHeight/2); /* draw colored quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(color.r,color.g,color.b,alpha); GX_Position2s16(x+w,y+h); GX_Color4u8(color.r,color.g,color.b,alpha); GX_Position2s16(x+w,y); GX_Color4u8(color.r,color.g,color.b,alpha); GX_Position2s16(x,y); GX_Color4u8(color.r,color.g,color.b,alpha); GX_End(); GX_DrawDone(); /* restore GX rendering */ GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); GX_Flush(); } void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha) { if (!texture) return; if (texture->data) { /* load texture object */ GXTexObj texObj; GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); /* does this really change anything ? */ GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* vertex coordinate */ x -= (vmode->fbWidth/2); y -= (vmode->efbHeight/2); /* draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(x+w,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(x+w,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(x,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 0.0); GX_End(); GX_DrawDone(); } } void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha) { if (!texture) return; if (texture->data) { /* load texture object */ GXTexObj texObj; GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* vertex coordinate */ x -= (vmode->fbWidth/2); y -= (vmode->efbHeight/2); /* Modelview rotation */ Mtx m,mv; guVector axis = (guVector) {0,0,1}; guLookAt(mv, &cam.pos, &cam.up, &cam.view); guMtxRotAxisDeg (m, &axis, angle); guMtxTransApply(m,m, x+w/2,y+h/2,0); guMtxConcat(mv,m,mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); GX_Flush(); /* draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(-w/2,-h/2); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 0.0); GX_Position2s16(w/2,-h/2); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(w/2,h/2); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(-w/2,h/2); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 1.0); GX_End(); GX_DrawDone(); /* restore default Modelview */ guLookAt(mv, &cam.pos, &cam.up, &cam.view); GX_LoadPosMtxImm(mv, GX_PNMTX0); GX_Flush(); } } void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha) { if (!texture) return; if (texture->data) { /* load texture object */ GXTexObj texObj; GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE); GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* vertex coordinate */ x -= (vmode->fbWidth/2); y -= (vmode->efbHeight/2); /* texture coordinates */ f32 s = (f32)w / (f32)texture->width; f32 t = (f32)h / (f32)texture->height; /* draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, t); GX_Position2s16(x+w,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(s, t); GX_Position2s16(x+w,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(s, 0.0); GX_Position2s16(x,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 0.0); GX_End(); GX_DrawDone(); } } void gxDrawScreenshot(u8 alpha) { if (!rmode) return; /* get current game screen texture */ GXTexObj texobj; GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texobj, GX_TEXMAP0); GX_InvalidateTexAll(); /* get current aspect ratio */ int xscale,yscale; gxSetAspectRatio(&xscale, &yscale); /* adjust horizontal scaling */ xscale = (xscale * vmode->fbWidth) / vmode->viWidth; /* adjust screen position */ int xshift = (config.xshift * vmode->fbWidth) / vmode->viWidth; int yshift = (config.yshift * vmode->efbHeight) / vmode->viHeight; /* set vertices position & size */ s32 x = xshift - xscale; s32 y = yshift - (yscale * 2); s32 w = xscale * 2; s32 h = yscale * 4; /* black out surrounding area if necessary (Game Gear without borders) */ if ((w < 640) || (h < 480)) { gxDrawRectangle(0, 0, 640, 480, 255, (GXColor)BLACK); } /* draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(x+w,y+h); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(x+w,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(x,y); GX_Color4u8(0xff,0xff,0xff,alpha); GX_TexCoord2f32(0.0, 0.0); GX_End(); GX_DrawDone(); } void gxCopyScreenshot(gx_texture *texture) { /* retrieve gamescreen texture */ GXTexObj texobj; GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_LoadTexObj(&texobj, GX_TEXMAP0); GX_InvalidateTexAll(); /* scale texture to EFB width */ s32 w = ((bitmap.viewport.w + 2*bitmap.viewport.x) * 640) / bitmap.viewport.w; s32 h = (bitmap.viewport.h + 2*bitmap.viewport.y) * 2; s32 x = -w/2; s32 y = -(240+ 2*bitmap.viewport.y); /* black out surrounding area if necessary (Game Gear without borders) */ if ((w < 640) || (h < 480)) { gxDrawRectangle(0, 0, 640, 480, 255, (GXColor)BLACK); } /* draw textured quad */ GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position2s16(x,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 1.0); GX_Position2s16(x+w,y+h); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 1.0); GX_Position2s16(x+w,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(1.0, 0.0); GX_Position2s16(x,y); GX_Color4u8(0xff,0xff,0xff,0xff); GX_TexCoord2f32(0.0, 0.0); GX_End(); /* copy EFB to texture */ GX_SetTexCopySrc(0, 0, texture->width * 2, texture->height * 2); GX_SetTexCopyDst(texture->width, texture->height, texture->format, GX_TRUE); GX_DrawDone(); GX_CopyTex(texture->data, GX_TRUE); GX_Flush(); /* wait for copy operation to finish */ /* GX_PixModeSync is only useful if GX_ command follows */ /* we use dummy GX commands to stall CPU execution */ GX_PixModeSync(); GX_LoadTexObj(&texobj, GX_TEXMAP0); GX_InvalidateTexAll(); GX_Flush(); DCStoreRange(texture->data, texture->width * texture->height * 4); } /* Take Screenshot */ void gxSaveScreenshot(char *filename) { /* capture screenshot into a texture */ gx_texture texture; texture.format = GX_TF_RGBA8; texture.width = 320; texture.height = bitmap.viewport.h; texture.data = memalign(32, texture.width*texture.height*4); if (texture.data) { gxCopyScreenshot(&texture); /* open PNG file */ FILE *f = fopen(filename,"wb"); if (f) { /* encode screenshot into PNG file */ gxTextureWritePNG(&texture,f); fclose(f); } free(texture.data); } } void gxSetScreen(void) { VIDEO_WaitVSync(); GX_CopyDisp(xfb, GX_FALSE); GX_Flush(); gx_input_UpdateMenu(); } void gxClearScreen(GXColor color) { gxDrawRectangle(0, 0, vmode->fbWidth, vmode->efbHeight, 255, color); } /***************************************************************************************/ /* GX Texture <-> LibPNG routines */ /***************************************************************************************/ /* libpng read callback function */ static void png_read_from_mem (png_structp png_ptr, png_bytep data, png_size_t length) { png_image *image = (png_image *)png_get_io_ptr(png_ptr); /* copy data from image buffer */ memcpy (data, image->buffer + image->offset, length); /* advance in the file */ image->offset += length; } /* convert PNG image (from file or data buffer) into RGBA8 texture */ gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file) { int i; /* create a png read struct */ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); if (!png_ptr) return NULL; /* create a png info struct */ png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr,NULL,NULL); return NULL; } if (png_data) { /* init PNG image structure */ png_image image; image.buffer = (u8 *) png_data; image.offset = 0; /* set callback for the read function */ png_set_read_fn(png_ptr,(png_voidp *)(&image),png_read_from_mem); } else if (png_file) { /* check for valid magic number */ png_byte magic[8]; if (fread (magic, 1, 8, png_file) != 8) { png_destroy_read_struct(&png_ptr,&info_ptr,NULL); return NULL; } if (png_sig_cmp (magic, 0, 8)) { png_destroy_read_struct(&png_ptr,&info_ptr,NULL); return NULL; } /* set IO callback for read function */ png_init_io (png_ptr, png_file); png_set_sig_bytes (png_ptr, 8); } else { png_destroy_read_struct(&png_ptr,&info_ptr,NULL); return NULL; } /* read png info */ png_read_info(png_ptr,info_ptr); /* retrieve image information */ u32 width = png_get_image_width(png_ptr,info_ptr); u32 height = png_get_image_height(png_ptr,info_ptr); u32 bit_depth = png_get_bit_depth(png_ptr,info_ptr); u32 color_type = png_get_color_type(png_ptr,info_ptr); /* ensure PNG file is in the supported format */ if (png_file) { /* support for RGBA8 textures ONLY !*/ if ((color_type != PNG_COLOR_TYPE_RGB_ALPHA) || (bit_depth != 8)) { png_destroy_read_struct(&png_ptr, &info_ptr,NULL); return NULL; } /* 4x4 tiles are required */ if ((width%4) || (height%4)) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); return NULL; } } /* allocate memory to store raw image data */ u32 stride = width << 2; u8 *img_data = memalign (32, stride * height); if (!img_data) { png_destroy_read_struct(&png_ptr,&info_ptr,NULL); return NULL; } /* allocate row pointer data */ png_bytep *row_pointers = (png_bytep *)memalign (32, sizeof (png_bytep) * height); if (!row_pointers) { free (img_data); png_destroy_read_struct(&png_ptr,&info_ptr,NULL); return NULL; } /* store raw image data */ for (i = 0; i < height; i++) { row_pointers[i] = img_data + (i * stride); } /* decode image */ png_read_image(png_ptr, row_pointers); /* finish decompression and release memory */ png_read_end(png_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(row_pointers); /* initialize texture */ gx_texture *texture = (gx_texture *)memalign(32, sizeof(gx_texture)); if (!texture) { free (img_data); return NULL; } /* initialize texture data */ texture->data = memalign(32, stride * height); if (!texture->data) { free (img_data); free(texture); return NULL; } memset(texture->data, 0, stride * height); texture->width = width; texture->height = height; texture->format = GX_TF_RGBA8; /* encode to GX_TF_RGBA8 format (4x4 pixels paired titles) */ u16 *dst_ar = (u16 *)(texture->data); u16 *dst_gb = (u16 *)(texture->data + 32); u32 *src1 = (u32 *)(img_data); u32 *src2 = (u32 *)(img_data + stride); u32 *src3 = (u32 *)(img_data + 2*stride); u32 *src4 = (u32 *)(img_data + 3*stride); u32 pixel,h,w; for (h=0; h> 24) & 0x00ff); *dst_gb++= (pixel >> 8) & 0xffff; } /* line N + 1 (4 pixels) */ for (i=0; i<4; i++) { pixel = *src2++; *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); *dst_gb++= (pixel >> 8) & 0xffff; } /* line N + 2 (4 pixels) */ for (i=0; i<4; i++) { pixel = *src3++; *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); *dst_gb++= (pixel >> 8) & 0xffff; } /* line N + 3 (4 pixels) */ for (i=0; i<4; i++) { pixel = *src4++; *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); *dst_gb++= (pixel >> 8) & 0xffff; } /* next paired tiles */ dst_ar += 16; dst_gb += 16; } /* next 4 lines */ src1 = src4; src2 = src1 + width; src3 = src2 + width; src4 = src3 + width; } /* release memory */ free(img_data); /* force texture data update in memory */ DCStoreRange(texture->data, height * stride); return texture; } /* Write RGBA8 Texture to PNG file */ void gxTextureWritePNG(gx_texture *texture, FILE *png_file) { /* allocate PNG data buffer */ u8 *img_data = (u8 *)memalign(32, texture->width * texture->height * 4); if(!img_data) return; /* decode GX_TF_RGBA8 format (4x4 pixels paired titles) */ u16 *ar = (u16 *)(texture->data); u16 *gb = (u16 *)(texture->data + 32); u32 *dst1 = (u32 *)(img_data); u32 *dst2 = dst1 + texture->width; u32 *dst3 = dst2 + texture->width; u32 *dst4 = dst3 + texture->width; u32 i,h,w,pixel; for (h=0; hheight; h+=4) { for (w=0; wwidth; w+=4) { /* line N (4 pixels) */ for (i=0; i<4; i++) { pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); *dst1++ = pixel; ar++; gb++; } /* line N + 1 (4 pixels) */ for (i=0; i<4; i++) { pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); *dst2++ = pixel; ar++; gb++; } /* line N + 2 (4 pixels) */ for (i=0; i<4; i++) { pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); *dst3++ = pixel; ar++; gb++; } /* line N + 3 (4 pixels) */ for (i=0; i<4; i++) { pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); *dst4++ = pixel; ar++; gb++; } /* next paired tiles */ ar += 16; gb += 16; } /* next 4 lines */ dst1 = dst4; dst2 = dst1 + texture->width; dst3 = dst2 + texture->width; dst4 = dst3 + texture->width; } /* create a png write struct */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) { free(img_data); return; } /* create a png info struct */ png_infop info_ptr = png_create_info_struct (png_ptr); if (!info_ptr) { free(img_data); png_destroy_write_struct(&png_ptr, NULL); return; } /* set IO callback for the write function */ png_init_io(png_ptr, png_file); /* set PNG file properties */ png_set_IHDR(png_ptr, info_ptr, texture->width, texture->height, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); /* allocate row pointer data */ png_bytep *row_pointers = (png_bytep *)memalign (32, sizeof (png_bytep) * texture->height); if (!row_pointers) { free (img_data); png_destroy_write_struct(&png_ptr, &info_ptr); return; } /* store raw image data */ for (i = 0; i < texture->height; i++) { row_pointers[i] = img_data + (i * texture->width * 4); } /* configure libpng for image data */ png_set_rows(png_ptr,info_ptr,row_pointers); /* write data to PNG file */ png_write_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,NULL); /* finish compression and release memory */ png_write_end(png_ptr, NULL); free(row_pointers); free(img_data); png_destroy_write_struct(&png_ptr, &info_ptr); } void gxTextureClose(gx_texture **p_texture) { gx_texture *texture = *p_texture; if (texture) { if (texture->data) free(texture->data); free(texture); *p_texture = NULL; } } /***************************************************************************************/ /* VIDEO engine */ /***************************************************************************************/ /* Emulation mode -> Menu mode */ void gx_video_Stop(void) { /* disable VSYNC callbacks */ VIDEO_SetPostRetraceCallback(NULL); VIDEO_SetPreRetraceCallback(NULL); /* wait for next even field */ /* this prevents screen artefacts when switching between interlaced & non-interlaced modes */ do VIDEO_WaitVSync(); while (!VIDEO_GetNextField()); /* adjust TV width */ vmode->viWidth = config.screen_w; vmode->viXOrigin = (VI_MAX_WIDTH_NTSC - vmode->viWidth)/2; /* unallocate NTSC filters */ if (sms_ntsc) free(sms_ntsc); if (md_ntsc) free(md_ntsc); sms_ntsc = NULL; md_ntsc = NULL; /* lightgun textures */ gxTextureClose(&crosshair[0]); gxTextureClose(&crosshair[1]); /* CD leds textures */ gxTextureClose(&cd_leds[0][0]); gxTextureClose(&cd_leds[0][1]); gxTextureClose(&cd_leds[1][0]); gxTextureClose(&cd_leds[1][1]); /* GX menu rendering */ gxResetRendering(1); gxResetMode(vmode, GX_TRUE); /* render game snapshot */ gxClearScreen((GXColor)BLACK); gxDrawScreenshot(0xff); #ifdef HW_RVL /* default VI settings */ VIDEO_SetTrapFilter(1); VIDEO_SetGamma(VI_GM_1_0); #endif /* reset default TV mode */ VIDEO_Configure(vmode); VIDEO_Flush(); /* display next frame */ gxSetScreen(); } /* Menu mode -> Emulation mode */ void gx_video_Start(void) { /* TV mode */ if ((config.tv_mode == 1) || ((config.tv_mode == 2) && vdp_pal)) { /* 50 Hz */ gc_pal = 1; } else { /* 60 Hz */ gc_pal = 0; } /* Enable progressive or interlaced video mode */ if (config.render == 2) { /* 480p */ tvmodes[2]->viTVMode = (tvmodes[2]->viTVMode & ~3) | VI_PROGRESSIVE; tvmodes[2]->xfbMode = VI_XFBMODE_SF; /* 576p */ tvmodes[5]->viTVMode = VI_TVMODE_PAL_PROG; tvmodes[5]->xfbMode = VI_XFBMODE_SF; } else if (config.render == 1) { /* 480i */ tvmodes[2]->viTVMode = (tvmodes[2]->viTVMode & ~3) | VI_INTERLACE; tvmodes[2]->xfbMode = VI_XFBMODE_DF; /* 576i */ tvmodes[5]->viTVMode = VI_TVMODE_PAL_INT; tvmodes[5]->xfbMode = VI_XFBMODE_DF; } /* update horizontal border width */ if ((system_hw == SYSTEM_GG) && !config.gg_extra) { bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; } else { bitmap.viewport.x = (config.overscan & 2) * 7; } /* force viewport update */ bitmap.viewport.changed = 3; /* NTSC filter */ if (config.ntsc) { /* allocate filters */ if (!sms_ntsc) { sms_ntsc = (sms_ntsc_t *)memalign(32,sizeof(sms_ntsc_t)); } if (!md_ntsc) { md_ntsc = (md_ntsc_t *)memalign(32,sizeof(md_ntsc_t)); } /* setup filters default configuration */ switch (config.ntsc) { case 1: { sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite); break; } case 2: { sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo); break; } case 3: { sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); } case 4: { md_ntsc_setup_t ntsc_custom = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ntsc_custom.sharpness = config.ntsc_sharpness; ntsc_custom.resolution = config.ntsc_resolution; ntsc_custom.artifacts = config.ntsc_artifacts; ntsc_custom.fringing = config.ntsc_fringing; ntsc_custom.bleed = config.ntsc_bleed; sms_ntsc_init(sms_ntsc, (sms_ntsc_setup_t *)&ntsc_custom); md_ntsc_init(md_ntsc, &ntsc_custom); break; } } } /* on-screen display enable flag */ osd = config.fps; /* clear any on-screen text */ memset(msg, 0, sizeof(msg)); /* lightgun textures */ int i, player = 0; for (i=0; i= 0) { if ((i == 0) || ((i == 4) && (input.system[1] != SYSTEM_LIGHTPHASER))) { /* Lightgun #1 */ if (config.gun_cursor[0]) { crosshair[0] = gxTextureOpenPNG(Crosshair_p1_png,0); osd = 1; } } else { /* Lightgun #2 */ if (config.gun_cursor[1]) { crosshair[1] = gxTextureOpenPNG(Crosshair_p2_png,0); osd = 1; } } } } /* Check for any emulated device */ if (input.dev[i] != NO_DEVICE) { /* increment player index */ player++; } } /* CD leds textures */ if (system_hw == SYSTEM_MCD) { if (config.cd_leds) { cd_leds[0][0] = gxTextureOpenPNG(CD_access_off_png,0); cd_leds[0][1] = gxTextureOpenPNG(CD_access_on_png,0); cd_leds[1][0] = gxTextureOpenPNG(CD_ready_off_png,0); cd_leds[1][1] = gxTextureOpenPNG(CD_ready_on_png,0); osd = 1; } } /* GX emulation rendering */ gxClearScreen((GXColor)BLACK); gxResetRendering(0); /* resynchronize emulation with VSYNC */ do VIDEO_WaitVSync(); while (!VIDEO_GetNextField()); #ifdef HW_RVL VIDEO_SetTrapFilter(config.trap); VIDEO_SetGamma((int)(config.gamma * 10.0)); #endif /* XFB update is done during VBLANK */ VIDEO_SetPreRetraceCallback(xfb_update); /* Emulation is synchronized with video hardware if VSYNC is set to AUTO & TV mode matches emulated video mode */ if (config.vsync && (gc_pal == vdp_pal)) { VIDEO_SetPostRetraceCallback(vi_callback); videoSync = VIDEO_WAIT; } else { videoSync = 0; } /* restart frame sync */ videoWait = 0; frameCount = 0; starttime = gettime(); } /* GX render update */ int gx_video_Update(int status) { /* make sure current video frame has not already been updated */ if (status & VIDEO_UPDATE) { /* set video wait flag if VSYNC is enabled */ videoWait = videoSync; /* check if display has changed during frame */ if (bitmap.viewport.changed & 1) { /* update texture size */ vwidth = bitmap.viewport.w + (2 * bitmap.viewport.x); vheight = bitmap.viewport.h + (2 * bitmap.viewport.y); /* interlaced mode */ if (config.render && interlaced) { vheight = vheight << 1; } /* ntsc filter */ if (config.ntsc) { vwidth = (reg[12] & 1) ? MD_NTSC_OUT_WIDTH(vwidth) : SMS_NTSC_OUT_WIDTH(vwidth); /* texel width must remain multiple of 4 */ vwidth = (vwidth >> 2) << 2; } /* initialize texture object */ GXTexObj texobj; GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); /* configure texture filtering */ if (!config.bilinear) { GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); } /* load texture object */ GX_LoadTexObj(&texobj, GX_TEXMAP0); /* update rendering mode */ if (config.render) { rmode = tvmodes[gc_pal*3 + 2]; } else { rmode = tvmodes[gc_pal*3 + interlaced]; } /* update aspect ratio */ gxResetScaler(vwidth); /* update GX rendering mode */ gxResetMode(rmode, config.vfilter); /* update VI mode */ VIDEO_Configure(rmode); VIDEO_Flush(); } /* texture is now directly mapped by the line renderer */ /* force texture cache update */ DCStoreRange(bitmap.data, vwidth*vheight*2); GX_InvalidateTexAll(); /* disable EFB copy until rendering is done */ drawDone = 0; /* render textured quad */ GX_CallDispList(d_list, 32); /* on-screen display */ if (osd) { /* reset GX rendering */ gxResetRendering(1); /* lightgun # 1 screen mark */ if (crosshair[0]) { if (input.system[0] == SYSTEM_LIGHTPHASER) { gxDrawCrosshair(crosshair[0], input.analog[0][0],input.analog[0][1]); } else { gxDrawCrosshair(crosshair[0], input.analog[4][0],input.analog[4][1]); } } /* lightgun #2 screen mark */ if (crosshair[1]) { if (input.system[1] == SYSTEM_LIGHTPHASER) { gxDrawCrosshair(crosshair[1], input.analog[4][0],input.analog[4][1]); } else { gxDrawCrosshair(crosshair[1], input.analog[5][0],input.analog[5][1]); } } /* CD LEDS */ if (cd_leds[1][1]) { /* CD LEDS status */ u8 mode = scd.regs[0x06 >> 1].byte.h; gxDrawCdLeds(cd_leds[1][(mode >> 1) & 1], cd_leds[0][mode & 1]); } /* FPS counter */ if (config.fps) { u32 delta = diff_usec(starttime, gettime()); frameCount++; if (delta > 1000000) { sprintf(msg,"%3.2f FPS", (float)frameCount * 1000000.0 / (float)delta); frameCount = 0; starttime = gettime(); } /* disable EFB alpha blending for text background */ GX_SetBlendMode(GX_BM_NONE,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); GX_Flush(); /* display on-screen message */ gxDrawOnScreenText(msg); } /* restore texture object */ GXTexObj texobj; GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); if (!config.bilinear) { GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); } GX_LoadTexObj(&texobj, GX_TEXMAP0); GX_InvalidateTexAll(); /* restore GX rendering */ gxResetRendering(0); } /* Do not wait for EFB rendering, GX draw interrupt will be triggered when it is finished */ GX_SetDrawDone(); /* check interlaced mode change */ if (bitmap.viewport.changed & 4) { /* "original" mode */ if (!config.render && config.vsync && (gc_pal == vdp_pal)) { /* framerate has changed, reinitialize audio timings */ audio_set_rate(snd.sample_rate, get_framerate()); } /* clear flag */ bitmap.viewport.changed &= ~4; } /* Check if video mode has changed */ if (bitmap.viewport.changed & 1) { /* clear viewport update flags */ bitmap.viewport.changed &= ~1; /* field synchronization */ do VIDEO_WaitVSync(); while (VIDEO_GetNextField() != odd_frame); /* resynchronize audio playback with video */ AUDIO_StopDMA(); AUDIO_StartDMA(); } } /* wait until current video frame starts before emulating next frame */ return ((status & ~(VIDEO_WAIT|VIDEO_UPDATE)) | videoWait); } /* Initialize VIDEO subsystem */ void gx_video_Init(void) { /* * Before doing anything else under libogc, * Call VIDEO_Init */ VIDEO_Init(); /* Get the current VIDEO mode then : - set menu video mode (480p/576p/480i/576i) - set emulator rendering 60hz TV modes (MPAL/NTSC/EURGB60) */ vmode = VIDEO_GetPreferredMode(NULL); /* Adjust display settings */ switch (vmode->viTVMode >> 2) { case VI_PAL: /* 576 lines scaled (PAL 50Hz) */ TV60hz_240p.viTVMode = VI_TVMODE_EURGB60_DS; TV60hz_240i.viTVMode = VI_TVMODE_EURGB60_INT; TV60hz_480i.viTVMode = VI_TVMODE_EURGB60_INT; break; default: /* 480 lines (NTSC, MPAL or PAL 60Hz) */ TV60hz_240p.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_NON_INTERLACE); TV60hz_240i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); TV60hz_480i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); break; } /* Configure VI */ VIDEO_Configure(vmode); /* Allocate framebuffer */ xfb = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); /* Define a console */ console_init(xfb, 20, 64, 640, 574, 574 * 2); /* Clear framebuffer to black */ VIDEO_ClearFrameBuffer(vmode, xfb, COLOR_BLACK); /* Set the framebuffer to be displayed at next VBlank */ VIDEO_SetNextFramebuffer(xfb); /* Enable Video Interface */ VIDEO_SetBlack(FALSE); /* Update VIDEO settings for next VBlank */ VIDEO_Flush(); /* Wait for VBlank */ VIDEO_WaitVSync(); VIDEO_WaitVSync(); /* Initialize GX */ gxStart(); gxResetRendering(1); gxResetMode(vmode, GX_TRUE); /* Initialize FONT */ FONT_Init(); } void gx_video_Shutdown(void) { FONT_Shutdown(); VIDEO_ClearFrameBuffer(vmode, xfb, COLOR_BLACK); VIDEO_Flush(); VIDEO_WaitVSync(); } /* Custom NTSC blitters */ typedef unsigned short sms_ntsc_out_t; typedef unsigned short md_ntsc_out_t; void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline) { int const chunk_count = in_width / sms_ntsc_in_chunk; /* handle extra 0, 1, or 2 pixels by placing them at beginning of row */ int const in_extra = in_width - chunk_count * sms_ntsc_in_chunk; unsigned const extra2 = (unsigned) -(in_extra >> 1 & 1); /* (unsigned) -1 = ~0 */ unsigned const extra1 = (unsigned) -(in_extra & 1) | extra2; /* use palette entry 0 for unused pixels */ SMS_NTSC_IN_T border = table[0]; SMS_NTSC_BEGIN_ROW( ntsc, border, (SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2, (SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 ); /* directly fill the RGB565 texture */ /* one tile is 32 byte = 4x4 pixels */ /* tiles are stored continuously in texture memory */ in_width = SMS_NTSC_OUT_WIDTH(in_width) / 4; int offset = ((in_width * 32) * (vline / 4)) + ((vline & 3) * 8); sms_ntsc_out_t* __restrict__ line_out = (sms_ntsc_out_t*)(bitmap.data + offset); offset = 0; int n; input += in_extra; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 0, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 1, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 2, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 3, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); SMS_NTSC_RGB_OUT( 4, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 5, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 6, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; } /* finish final pixels */ SMS_NTSC_COLOR_IN( 0, ntsc, border ); SMS_NTSC_RGB_OUT( 0, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 1, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_COLOR_IN( 1, ntsc, border ); SMS_NTSC_RGB_OUT( 2, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 3, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_COLOR_IN( 2, ntsc, border ); SMS_NTSC_RGB_OUT( 4, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 5, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; SMS_NTSC_RGB_OUT( 6, line_out[offset++] ); if ((offset % 4) == 0) offset += 12; } void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline) { int const chunk_count = in_width / md_ntsc_in_chunk - 1; /* use palette entry 0 for unused pixels */ MD_NTSC_IN_T border = table[0]; MD_NTSC_BEGIN_ROW( ntsc, border, MD_NTSC_ADJ_IN( table[*input++] ), MD_NTSC_ADJ_IN( table[*input++] ), MD_NTSC_ADJ_IN( table[*input++] ) ); /* directly fill the RGB565 texture */ /* one tile is 32 byte = 4x4 pixels */ /* tiles are stored continuously in texture memory */ in_width = MD_NTSC_OUT_WIDTH(in_width) >> 2; int offset = ((in_width << 5) * (vline >> 2)) + ((vline & 3) * 8); md_ntsc_out_t* __restrict__ line_out = (md_ntsc_out_t*)(bitmap.data + offset); int n; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 0, *line_out++ ); MD_NTSC_RGB_OUT( 1, *line_out++ ); MD_NTSC_COLOR_IN( 1, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 2, *line_out++ ); MD_NTSC_RGB_OUT( 3, *line_out++ ); line_out += 12; MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 4, *line_out++ ); MD_NTSC_RGB_OUT( 5, *line_out++ ); MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 6, *line_out++ ); MD_NTSC_RGB_OUT( 7, *line_out++ ); line_out += 12; } /* finish final pixels */ MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 0, *line_out++ ); MD_NTSC_RGB_OUT( 1, *line_out++ ); MD_NTSC_COLOR_IN( 1, ntsc, border ); MD_NTSC_RGB_OUT( 2, *line_out++ ); MD_NTSC_RGB_OUT( 3, *line_out++ ); line_out += 12; MD_NTSC_COLOR_IN( 2, ntsc, border ); MD_NTSC_RGB_OUT( 4, *line_out++ ); MD_NTSC_RGB_OUT( 5, *line_out++ ); MD_NTSC_COLOR_IN( 3, ntsc, border ); MD_NTSC_RGB_OUT( 6, *line_out++ ); MD_NTSC_RGB_OUT( 7, *line_out++ ); } core/loadrom.c000664 001750 001750 00000077616 12702465756 014472 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * ROM Loading Support * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include #include "shared.h" /*** ROM Information ***/ #define ROMCONSOLE 256 #define ROMCOPYRIGHT 272 #define ROMDOMESTIC 288 #define ROMWORLD 336 #define ROMTYPE 384 #define ROMPRODUCT 386 #define ROMCHECKSUM 398 #define ROMIOSUPPORT 400 #define ROMROMSTART 416 #define ROMROMEND 420 #define ROMRAMINFO 424 #define ROMRAMSTART 436 #define ROMRAMEND 440 #define ROMMODEMINFO 444 #define ROMMEMO 456 #define ROMCOUNTRY 496 #define P3BUTTONS 1 #define P6BUTTONS 2 #define PKEYBOARD 4 #define PPRINTER 8 #define PBALL 16 #define PFLOPPY 32 #define PACTIVATOR 64 #define PTEAMPLAYER 128 #define PMSYSTEMPAD 256 #define PSERIAL 512 #define PTABLET 1024 #define PPADDLE 2048 #define PCDROM 4096 #define PMOUSE 8192 #define MAXCOMPANY 64 #define MAXPERIPHERALS 15 typedef struct { char companyid[6]; char company[26]; } COMPANYINFO; typedef struct { char pID[2]; char pName[14]; } PERIPHERALINFO; ROMINFO rominfo; uint8 romtype; static uint8 rom_region; /*************************************************************************** * Genesis ROM Manufacturers * * Based on the document provided at * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt **************************************************************************/ static const COMPANYINFO companyinfo[MAXCOMPANY] = { {"ACLD", "Ballistic"}, {"RSI", "Razorsoft"}, {"SEGA", "SEGA"}, {"TREC", "Treco"}, {"VRGN", "Virgin Games"}, {"WSTN", "Westone"}, {"10", "Takara"}, {"11", "Taito or Accolade"}, {"12", "Capcom"}, {"13", "Data East"}, {"14", "Namco or Tengen"}, {"15", "Sunsoft"}, {"16", "Bandai"}, {"17", "Dempa"}, {"18", "Technosoft"}, {"19", "Technosoft"}, {"20", "Asmik"}, {"22", "Micronet"}, {"23", "Vic Tokai"}, {"24", "American Sammy"}, {"29", "Kyugo"}, {"32", "Wolfteam"}, {"33", "Kaneko"}, {"35", "Toaplan"}, {"36", "Tecmo"}, {"40", "Toaplan"}, {"42", "UFL Company Limited"}, {"43", "Human"}, {"45", "Game Arts"}, {"47", "Sage's Creation"}, {"48", "Tengen"}, {"49", "Renovation or Telenet"}, {"50", "Electronic Arts"}, {"56", "Razorsoft"}, {"58", "Mentrix"}, {"60", "Victor Musical Ind."}, {"69", "Arena"}, {"70", "Virgin"}, {"73", "Soft Vision"}, {"74", "Palsoft"}, {"76", "Koei"}, {"79", "U.S. Gold"}, {"81", "Acclaim/Flying Edge"}, {"83", "Gametek"}, {"86", "Absolute"}, {"87", "Mindscape"}, {"93", "Sony"}, {"95", "Konami"}, {"97", "Tradewest"}, {"100", "T*HQ Software"}, {"101", "Tecmagik"}, {"112", "Designer Software"}, {"113", "Psygnosis"}, {"119", "Accolade"}, {"120", "Code Masters"}, {"125", "Interplay"}, {"130", "Activision"}, {"132", "Shiny & Playmates"}, {"144", "Atlus"}, {"151", "Infogrames"}, {"161", "Fox Interactive"}, {"177", "Ubisoft"}, {"239", "Disney Interactive"}, {"---", "Unknown"} }; /*************************************************************************** * Genesis Peripheral Information * * Based on the document provided at * http://www.zophar.net/tech/files/Genesis_ROM_Format.txt ***************************************************************************/ static const PERIPHERALINFO peripheralinfo[MAXPERIPHERALS] = { {"J", "3B Joypad"}, {"6", "6B Joypad"}, {"K", "Keyboard"}, {"P", "Printer"}, {"B", "Control Ball"}, {"F", "Floppy Drive"}, {"L", "Activator"}, {"4", "Team Player"}, {"0", "MS Joypad"}, {"R", "RS232C Serial"}, {"T", "Tablet"}, {"V", "Paddle"}, {"C", "CD-ROM"}, {"M", "Mega Mouse"}, {"G", "Menacer"}, }; /*************************************************************************** * * Compute ROM real checksum. ***************************************************************************/ static uint16 getchecksum(uint8 *rom, int length) { int i; uint16 checksum = 0; for (i = 0; i < length; i += 2) { checksum += ((rom[i] << 8) + rom[i + 1]); } return checksum; } /*************************************************************************** * deinterleave_block * * Convert interleaved (.smd) ROM files. ***************************************************************************/ static void deinterleave_block(uint8 * src) { int i; uint8 block[0x4000]; memcpy (block, src, 0x4000); for (i = 0; i < 0x2000; i += 1) { src[i * 2 + 0] = block[0x2000 + (i)]; src[i * 2 + 1] = block[0x0000 + (i)]; } } /*************************************************************************** * * Pass a pointer to the ROM base address. ***************************************************************************/ void getrominfo(char *romheader) { /* Clear ROM info structure */ memset (&rominfo, 0, sizeof (ROMINFO)); /* Genesis ROM header support */ if (system_hw & SYSTEM_MD) { int i,j; memcpy (&rominfo.consoletype, romheader + ROMCONSOLE, 16); memcpy (&rominfo.copyright, romheader + ROMCOPYRIGHT, 16); /* Domestic (japanese) name */ rominfo.domestic[0] = romheader[ROMDOMESTIC]; j = 1; for (i=1; i<48; i++) { if ((rominfo.domestic[j-1] != 32) || (romheader[ROMDOMESTIC + i] != 32)) { rominfo.domestic[j] = romheader[ROMDOMESTIC + i]; j++; } } rominfo.domestic[j] = 0; /* International name */ rominfo.international[0] = romheader[ROMWORLD]; j=1; for (i=1; i<48; i++) { if ((rominfo.international[j-1] != 32) || (romheader[ROMWORLD + i] != 32)) { rominfo.international[j] = romheader[ROMWORLD + i]; j++; } } rominfo.international[j] = 0; /* ROM informations */ memcpy (&rominfo.ROMType, romheader + ROMTYPE, 2); memcpy (&rominfo.product, romheader + ROMPRODUCT, 12); memcpy (&rominfo.checksum, romheader + ROMCHECKSUM, 2); memcpy (&rominfo.romstart, romheader + ROMROMSTART, 4); memcpy (&rominfo.romend, romheader + ROMROMEND, 4); memcpy (&rominfo.country, romheader + ROMCOUNTRY, 16); /* Checksums */ #ifdef LSB_FIRST rominfo.checksum = (rominfo.checksum >> 8) | ((rominfo.checksum & 0xff) << 8); #endif rominfo.realchecksum = getchecksum(((uint8 *) cart.rom) + 0x200, cart.romsize - 0x200); /* Supported peripherals */ rominfo.peripherals = 0; for (i = 0; i < 14; i++) for (j=0; j < 14; j++) if (romheader[ROMIOSUPPORT+i] == peripheralinfo[j].pID[0]) rominfo.peripherals |= (1 << j); } else { uint16 offset = 0; /* detect Master System ROM header */ if (!memcmp (&romheader[0x1ff0], "TMR SEGA", 8)) { offset = 0x1ff0; } else if (!memcmp (&romheader[0x3ff0], "TMR SEGA", 8)) { offset = 0x3ff0; } else if (!memcmp (&romheader[0x7ff0], "TMR SEGA", 8)) { offset = 0x7ff0; } /* if found, get infos from header */ if (offset) { /* checksum */ rominfo.checksum = romheader[offset + 0x0a] | (romheader[offset + 0x0b] << 8); /* product code & version */ sprintf(&rominfo.product[0], "%02d", romheader[offset + 0x0e] >> 4); sprintf(&rominfo.product[2], "%02x", romheader[offset + 0x0d]); sprintf(&rominfo.product[4], "%02x", romheader[offset + 0x0c]); sprintf(&rominfo.product[6], "-%d", romheader[offset + 0x0e] & 0x0F); /* region code */ switch (romheader[offset + 0x0f] >> 4) { case 3: strcpy(rominfo.country,"SMS Japan"); break; case 4: strcpy(rominfo.country,"SMS Export"); break; case 5: strcpy(rominfo.country,"GG Japan"); break; case 6: strcpy(rominfo.country,"GG Export"); break; case 7: strcpy(rominfo.country,"GG International"); break; default: sprintf(rominfo.country,"Unknown (%d)", romheader[offset + 0x0f] >> 4); break; } /* ROM size */ rominfo.romstart = 0; switch (romheader[offset + 0x0f] & 0x0F) { case 0x00: rominfo.romend = 0x3FFFF; break; case 0x01: rominfo.romend = 0x7FFFF; break; case 0x02: rominfo.romend = 0xFFFFF; break; case 0x0a: rominfo.romend = 0x1FFF; break; case 0x0b: rominfo.romend = 0x3FFF; break; case 0x0c: rominfo.romend = 0x7FFF; break; case 0x0d: rominfo.romend = 0xBFFF; break; case 0x0e: rominfo.romend = 0xFFFF; break; case 0x0f: rominfo.romend = 0x1FFFF; break; } } } } /*************************************************************************** * load_bios * * Load current system BIOS file. * * Return loaded size (-1 if already loaded) * ***************************************************************************/ int load_bios(int system) { int size = 0; switch (system) { case SYSTEM_MCD: { /* check if CD BOOTROM is already loaded */ if (!(system_bios & 0x10) || ((system_bios & 0x0c) != (region_code >> 4))) { /* load CD BOOTROM (fixed 128KB size) */ switch (region_code) { case REGION_USA: size = load_archive(CD_BIOS_US, scd.bootrom, sizeof(scd.bootrom), 0); break; case REGION_EUROPE: size = load_archive(CD_BIOS_EU, scd.bootrom, sizeof(scd.bootrom), 0); break; default: size = load_archive(CD_BIOS_JP, scd.bootrom, sizeof(scd.bootrom), 0); break; } /* CD BOOTROM loaded ? */ if (size > 0) { #ifdef LSB_FIRST /* Byteswap ROM to optimize 16-bit access */ int i; for (i = 0; i < size; i += 2) { uint8 temp = scd.bootrom[i]; scd.bootrom[i] = scd.bootrom[i+1]; scd.bootrom[i+1] = temp; } #endif /* mark CD BIOS as being loaded */ system_bios = system_bios | 0x10; /* loaded BIOS region */ system_bios = (system_bios & 0xf0) | (region_code >> 4); } return size; } return -1; } case SYSTEM_GG: case SYSTEM_GGMS: { /* check if Game Gear BOOTROM is already loaded */ if (!(system_bios & SYSTEM_GG)) { /* mark both Master System & Game Gear BOOTROM as unloaded */ system_bios &= ~(SYSTEM_SMS | SYSTEM_GG); /* BOOTROM is stored above cartridge ROM area (max. 4MB) */ if (cart.romsize <= 0x400000) { /* load Game Gear BOOTROM file */ size = load_archive(GG_BIOS, cart.rom + 0x400000, 0x400000, 0); if (size > 0) { /* mark Game Gear BOOTROM as loaded */ system_bios |= SYSTEM_GG; } } return size; } return -1; } case SYSTEM_SMS: case SYSTEM_SMS2: { /* check if Master System BOOTROM is already loaded */ if (!(system_bios & SYSTEM_SMS) || ((system_bios & 0x0c) != (region_code >> 4))) { /* mark both Master System & Game Gear BOOTROM as unloaded */ system_bios &= ~(SYSTEM_SMS | SYSTEM_GG); /* BOOTROM is stored above cartridge ROM area (max. 4MB) */ if (cart.romsize <= 0x400000) { /* load Master System BOOTROM file */ switch (region_code) { case REGION_USA: size = load_archive(MS_BIOS_US, cart.rom + 0x400000, 0x400000, 0); break; case REGION_EUROPE: size = load_archive(MS_BIOS_EU, cart.rom + 0x400000, 0x400000, 0); break; default: size = load_archive(MS_BIOS_JP, cart.rom + 0x400000, 0x400000, 0); break; } if (size > 0) { /* mark Master System BOOTROM as loaded */ system_bios |= SYSTEM_SMS; /* loaded BOOTROM region */ system_bios = (system_bios & 0xf0) | (region_code >> 4); } } return size; } return -1; } default: { /* mark all BOOTROM as unloaded */ system_bios &= ~(0x10 | SYSTEM_SMS | SYSTEM_GG); return 0; } } } /*************************************************************************** * load_rom * * Load a new ROM file. * * Return 0 on error, 1 on success * ***************************************************************************/ int load_rom(char *filename) { int i, size; #ifdef USE_DYNAMIC_ALLOC if (!ext) { /* allocate memory for Cartridge / CD hardware if required */ ext = (external_t *)malloc(sizeof(external_t)); if (!ext) return (0); } #endif /* clear any existing patches */ ggenie_shutdown(); areplay_shutdown(); /* check previous loaded ROM size */ if (cart.romsize > 0x800000) { /* assume no CD is currently loaded */ cdd.loaded = 0; } /* auto-detect CD image file */ size = cdd_load(filename, (char *)(cart.rom)); if (size < 0) { /* error opening file */ return (0); } /* CD image file ? */ if (size) { /* enable CD hardware */ system_hw = SYSTEM_MCD; /* boot from CD hardware */ scd.cartridge.boot = 0x00; } else { /* load file into ROM buffer */ char extension[4]; size = load_archive(filename, cart.rom, cdd.loaded ? 0x800000 : MAXROMSIZE, extension); /* mark BOOTROM as unloaded if they have been overwritten by cartridge ROM */ if (size > 0x800000) { /* CD BIOS ROM are loaded at the start of CD area */ system_bios &= ~0x10; } else if (size > 0x400000) { /* Master System or Game Gear BIOS ROM are loaded within $400000-$4FFFFF area */ system_bios &= ~(SYSTEM_SMS | SYSTEM_GG); } else if (size <= 0) { /* mark all BOOTROM as unloaded since they could have been overwritten */ system_bios &= ~(0x10 | SYSTEM_SMS | SYSTEM_GG); /* error loading file */ return 0; } /* convert lower case file extension to upper case */ *(uint32 *)(extension) &= 0xdfdfdfdf; /* auto-detect system hardware from ROM file extension */ if (!memcmp("SMS", &extension[0], 3)) { /* Master System II hardware */ system_hw = SYSTEM_SMS2; } else if (!memcmp("GG", &extension[1], 2)) { /* Game Gear hardware (GG mode) */ system_hw = SYSTEM_GG; } else if (!memcmp("SG", &extension[1], 2)) { /* SG-1000 hardware */ system_hw = SYSTEM_SG; } else { /* default is Mega Drive / Genesis hardware (16-bit mode) */ system_hw = SYSTEM_MD; /* decode .MDX format */ if (!memcmp("MDX", &extension[0], 3)) { for (i = 4; i < size - 1; i++) { cart.rom[i-4] = cart.rom[i] ^ 0x40; } size = size - 5; } /* auto-detect byte-swapped dumps */ if (!memcmp((char *)(cart.rom + 0x100),"ESAGM GE ARDVI E", 16) || !memcmp((char *)(cart.rom + 0x100),"ESAGG NESESI", 12)) { for(i = 0; i < size; i += 2) { uint8 temp = cart.rom[i]; cart.rom[i] = cart.rom[i+1]; cart.rom[i+1] = temp; } } } /* auto-detect 512 byte extra header */ if (memcmp((char *)(cart.rom + 0x100), "SEGA", 4) && ((size / 512) & 1) && !(size % 512)) { /* remove header */ size -= 512; memcpy (cart.rom, cart.rom + 512, size); /* assume interleaved Mega Drive / Genesis ROM format (.smd) */ if (system_hw == SYSTEM_MD) { for (i = 0; i < (size / 0x4000); i++) { deinterleave_block (cart.rom + (i * 0x4000)); } } } } /* initialize ROM size */ cart.romsize = size; /* get infos from ROM header */ getrominfo((char *)(cart.rom)); /* set console region */ get_region((char *)(cart.rom)); #ifdef LSB_FIRST /* 16-bit ROM specific */ if (system_hw == SYSTEM_MD) { /* Byteswap ROM to optimize 16-bit access */ for (i = 0; i < cart.romsize; i += 2) { uint8 temp = cart.rom[i]; cart.rom[i] = cart.rom[i+1]; cart.rom[i+1] = temp; } } #endif /* PICO ROM */ if (strstr(rominfo.consoletype, "SEGA PICO") != NULL) { /* PICO hardware */ system_hw = SYSTEM_PICO; } /* Save auto-detected system hardware */ romtype = system_hw; /* CD image file */ if (system_hw == SYSTEM_MCD) { /* try to load CD BOOTROM for selected region */ if (!load_bios(SYSTEM_MCD)) { /* unmount CD image */ cdd_unload(); /* error booting from CD */ return (0); } } /* CD BOOTROM */ else if (strstr(rominfo.ROMType, "BR") != NULL) { /* enable CD hardware */ system_hw = SYSTEM_MCD; /* boot from CD hardware */ scd.cartridge.boot = 0x00; /* copy ROM to BOOTROM area */ memcpy(scd.bootrom, cart.rom, sizeof(scd.bootrom)); /* mark CD BIOS as being loaded */ system_bios = system_bios | 0x10; /* loaded CD BIOS region */ system_bios = (system_bios & 0xf0) | (region_code >> 4); } /* ROM cartridge (max. 8MB) with CD loaded */ else if ((cart.romsize <= 0x800000) && cdd.loaded) { /* try to load CD BOOTROM */ if (load_bios(SYSTEM_MCD)) { /* enable CD hardware */ system_hw = SYSTEM_MCD; /* boot from cartridge */ scd.cartridge.boot = 0x40; } else { /* unmount CD image */ cdd_unload(); } } /* ROM cartridge with CD support */ else if ((strstr(rominfo.domestic,"FLUX") != NULL) || (strstr(rominfo.domestic,"WONDER LIBRARY") != NULL) || (strstr(rominfo.product,"T-5740") != NULL)) { /* check if console hardware is set to AUTO */ if (!config.system) { /* try to load CD BOOTROM */ if (load_bios(SYSTEM_MCD)) { char fname[256]; int len = strlen(filename); /* automatically try to load associated .iso file */ while ((len && (filename[len] != '.')) || (len > 251)) len--; strncpy(fname, filename, len); strcpy(&fname[len], ".iso"); cdd_load(fname, (char *)cdc.ram); /* enable CD hardware */ system_hw = SYSTEM_MCD; /* boot from cartridge */ scd.cartridge.boot = 0x40; } } } /* Force system hardware if requested */ if (config.system == SYSTEM_MD) { if (!(system_hw & SYSTEM_MD)) { /* Mega Drive in MS compatibility mode */ system_hw = SYSTEM_PBC; } } else if (config.system == SYSTEM_GG) { if (system_hw != SYSTEM_GG) { /* Game Gear in MS compatibility mode */ system_hw = SYSTEM_GGMS; } } else if (config.system) { system_hw = config.system; } /* restore previous input settings */ if (old_system[0] != -1) { input.system[0] = old_system[0]; } if (old_system[1] != -1) { input.system[1] = old_system[1]; } /* default gun settings */ input.x_offset = (input.system[1] == SYSTEM_MENACER) ? 64 : 0; input.y_offset = 0; /* autodetect gun support */ if (strstr(rominfo.international,"MENACER") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 82; input.y_offset = 0; } else if (strstr(rominfo.international,"T2 ; THE ARCADE GAME") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 133; input.y_offset = -8; } else if (strstr(rominfo.international,"BODY COUNT") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 68; input.y_offset = -24; } else if (strstr(rominfo.international,"CORPSE KILLER") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 64; input.y_offset = -8; } else if (strstr(rominfo.international,"CRIME PATROL") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 61; input.y_offset = 0; } else if (strstr(rominfo.international,"MAD DOG II THE LOST GOLD") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 70; input.y_offset = 18; } else if (strstr(rominfo.international,"MAD DOG MCCREE") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 49; input.y_offset = 0; } else if (strstr(rominfo.international,"WHO SHOT JOHNNY ROCK?") != NULL) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force MENACER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 60; input.y_offset = 30; } else if ((strstr(rominfo.international,"LETHAL ENFORCERS") != NULL) || (strstr(rominfo.international,"SNATCHER") != NULL)) { /* save current setting */ if (old_system[0] == -1) { old_system[0] = input.system[0]; } if (old_system[1] == -1) { old_system[1] = input.system[1]; } /* force JUSTIFIER configuration */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_JUSTIFIER; input.x_offset = (strstr(rominfo.international,"GUN FIGHTERS") != NULL) ? 24 : 0; input.y_offset = 0; } return(1); } /**************************************************************************** * get_region * * Set console region from ROM header passed as parameter or * from previous auto-detection (if NULL) * ****************************************************************************/ void get_region(char *romheader) { /* region auto-detection ? */ if (romheader) { /* Mega CD image */ if (system_hw == SYSTEM_MCD) { /* security code */ switch ((unsigned char)romheader[0x20b]) { case 0x64: region_code = REGION_EUROPE; break; case 0xa1: region_code = REGION_JAPAN_NTSC; break; default: region_code = REGION_USA; break; } } /* 16-bit cartridge */ else if (system_hw & SYSTEM_MD) { /* country codes used to differentiate region */ /* 0001 = japan ntsc (1) */ /* 0010 = japan pal (2) -> does not exist ? */ /* 0100 = usa (4) */ /* 1000 = europe (8) */ int country = 0; /* from Gens */ if (!memcmp(rominfo.country, "eur", 3)) country |= 8; else if (!memcmp(rominfo.country, "EUR", 3)) country |= 8; else if (!memcmp(rominfo.country, "Europe", 3)) country |= 8; else if (!memcmp(rominfo.country, "jap", 3)) country |= 1; else if (!memcmp(rominfo.country, "JAP", 3)) country |= 1; else if (!memcmp(rominfo.country, "usa", 3)) country |= 4; else if (!memcmp(rominfo.country, "USA", 3)) country |= 4; else { int i; char c; /* look for each characters */ for(i = 0; i < 4; i++) { c = toupper((int)rominfo.country[i]); if (c == 'U') country |= 4; else if (c == 'J') country |= 1; else if (c == 'E') country |= 8; else if (c == 'K') country |= 1; else if (c < 16) country |= c; else if ((c >= '0') && (c <= '9')) country |= c - '0'; else if ((c >= 'A') && (c <= 'F')) country |= c - 'A' + 10; } } /* set default console region (USA > JAPAN > EUROPE) */ if (country & 4) region_code = REGION_USA; else if (country & 1) region_code = REGION_JAPAN_NTSC; else if (country & 8) region_code = REGION_EUROPE; else if (country & 2) region_code = REGION_JAPAN_PAL; else region_code = REGION_USA; /* some games need specific region settings but have wrong header*/ if (((strstr(rominfo.product,"T-45033") != NULL) && (rominfo.checksum == 0x0F81)) || /* Alisia Dragon (Europe) */ (strstr(rominfo.product,"T-69046-50") != NULL) || /* Back to the Future III (Europe) */ (strstr(rominfo.product,"T-120106-00") != NULL) || /* Brian Lara Cricket (Europe) */ (strstr(rominfo.product,"T-97126 -50") != NULL) || /* Williams Arcade's Greatest Hits (Europe) */ (strstr(rominfo.product,"T-70096 -00") != NULL)) /* Muhammad Ali Heavyweight Boxing (Europe) */ { /* need PAL settings */ region_code = REGION_EUROPE; } else if ((rominfo.realchecksum == 0x532e) && (strstr(rominfo.product,"1011-00") != NULL)) { /* On Dal Jang Goon (Korea) needs JAPAN region code */ region_code = REGION_JAPAN_NTSC; } } /* 8-bit cartridge */ else { region_code = sms_cart_region_detect(); } /* save auto-detected region */ rom_region = region_code; } else { /* restore auto-detected region */ region_code = rom_region; } /* force console region if requested */ if (config.region_detect == 1) region_code = REGION_USA; else if (config.region_detect == 2) region_code = REGION_EUROPE; else if (config.region_detect == 3) region_code = REGION_JAPAN_NTSC; else if (config.region_detect == 4) region_code = REGION_JAPAN_PAL; /* autodetect PAL/NTSC timings */ vdp_pal = (region_code >> 6) & 0x01; /* autodetect PAL/NTSC master clock */ system_clock = vdp_pal ? MCLOCK_PAL : MCLOCK_NTSC; /* force PAL/NTSC timings if requested */ if (config.vdp_mode == 1) vdp_pal = 0; else if (config.vdp_mode == 2) vdp_pal = 1; /* force PAL/NTSC master clock if requested */ if (config.master_clock == 1) system_clock = MCLOCK_NTSC; else if (config.master_clock == 2) system_clock = MCLOCK_PAL; } /**************************************************************************** * get_company (Softdev - 2006) * * Try to determine which company made this rom * * Ok, for some reason there's no standard for this. * It seems that there can be pretty much anything you like following the * copyright (C) symbol! ****************************************************************************/ char *get_company(void) { char *s; int i; char company[10]; for (i = 3; i < 8; i++) { company[i - 3] = rominfo.copyright[i]; } company[5] = 0; /** OK, first look for a hyphen * Capcom use T-12 for example */ s = strstr (company, "-"); if (s != NULL) { s++; strcpy (company, s); } /** Strip any trailing spaces **/ for (i = strlen (company) - 1; i >= 0; i--) if (company[i] == 32) company[i] = 0; if (strlen (company) == 0) return (char *)companyinfo[MAXCOMPANY - 1].company; for (i = 0; i < MAXCOMPANY - 1; i++) { if (!(strncmp (company, companyinfo[i].companyid, strlen (company)))) return (char *)companyinfo[i].company; } return (char *)companyinfo[MAXCOMPANY - 1].company; } /**************************************************************************** * get_peripheral (Softdev - 2006) * * Return peripheral name based on header code * ****************************************************************************/ char *get_peripheral(int index) { if (index < MAXPERIPHERALS) return (char *)peripheralinfo[index].pName; return (char *)companyinfo[MAXCOMPANY - 1].company; } core/m68k/s68ki_cycles.h000664 001750 001750 00001630070 12702465756 016123 0ustar00sergiosergio000000 000000 static const unsigned char m68ki_cycles[0x10000] = { 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 0*4, 0*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 34*4, 32*4, 36*4, 32*4, 34*4, 28*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 28*4, 32*4, 28*4, 30*4, 24*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 28*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 32*4, 30*4, 34*4, 30*4, 32*4, 26*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 24*4, 26*4, 20*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 22*4, 24*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 20*4, 24*4, 20*4, 22*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 16*4, 20*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 22*4, 26*4, 0*4, 0*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 4*4, 4*4, 20*4, 0*4, 16*4, 4*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 18*4, 20*4, 18*4, 22*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 10*4, 12*4, 10*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 8*4, 12*4, 8*4, 12*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 14*4, 18*4, 14*4, 16*4, 10*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 14*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 8*4, 12*4, 8*4, 10*4, 4*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 10*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 12*4, 16*4, 12*4, 14*4, 8*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 16*4, 18*4, 12*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 30*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 22*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 24*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 26*4, 24*4, 28*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 20*4, 18*4, 22*4, 18*4, 20*4, 16*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 12*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 14*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 16*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 18*4, 16*4, 20*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 6*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 8*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 0*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, 4*4, }; core/tremor/window.h000664 001750 001750 00000002215 12702465756 015640 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: window functions ********************************************************************/ #ifndef _V_WINDOW_ #define _V_WINDOW_ extern const void *_vorbis_window(int type,int left); extern void _vorbis_apply_window(ogg_int32_t *d,const void *window[2], long *blocksizes, int lW,int W,int nW); #endif gcw0/fileio.h000664 001750 001750 00000004433 12702465756 014204 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive. * Returns loaded ROM size (zero if an error occured) * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * modified by Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILEIO_H_ #define _FILEIO_H_ /* Function prototypes */ extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); #endif /* _FILEIO_H_ */ libretro/jni/000700 001750 001750 00000000000 12703321515 014267 5ustar00sergiosergio000000 000000 core/input_hw/gamepad.c000664 001750 001750 00000024447 12702465756 016262 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * 2-Buttons, 3-Buttons & 6-Buttons controller support * with support for J-Cart, 4-Way Play & Master Tap adapters * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gamepad.h" static struct { uint8 State; uint8 Counter; uint8 Timeout; uint32 Latency; } gamepad[MAX_DEVICES]; static struct { uint8 Latch; uint8 Counter; } flipflop[2]; static uint8 latch; void gamepad_reset(int port) { /* default state (Gouketsuji Ichizoku / Power Instinct, Samurai Spirits / Samurai Shodown) */ gamepad[port].State = 0x40; gamepad[port].Counter = 0; gamepad[port].Timeout = 0; gamepad[port].Latency = 0; /* reset 4-WayPlay latch (controller #0 used by default) */ latch = 0x00; /* reset Master Tap flip-flop */ flipflop[port>>2].Latch = 0; flipflop[port>>2].Counter = 0; } void gamepad_refresh(int port) { /* 6-buttons pad */ if (gamepad[port].Timeout++ > 25) { gamepad[port].Counter = 0; gamepad[port].Timeout = 0; } } void gamepad_end_frame(int port, unsigned int cycles) { if (gamepad[port].Latency > cycles) { /* adjust TH direction switching latency for next frame */ gamepad[port].Latency -= cycles; } else { /* reset TH direction switching latency */ gamepad[port].Latency = 0; } } INLINE unsigned char gamepad_read(int port) { /* D7 is not connected, D6 returns TH input state */ unsigned int data = gamepad[port].State | 0x3F; /* pad state */ unsigned int pad = input.pad[port]; /* get current TH input pulse counter */ unsigned int step = gamepad[port].Counter | (data >> 6); /* get current timestamp */ unsigned int cycles = ((system_hw & SYSTEM_PBC) == SYSTEM_MD) ? m68k.cycles : Z80.cycles; /* TH direction switching latency */ if (cycles < gamepad[port].Latency) { /* TH internal state switching has not occured yet (Decap Attack) */ step &= ~1; } /* C/B or START/A buttons status is returned on D5-D4 (active low) */ /* D-PAD or extra buttons status is returned on D3-D0 (active low) */ switch (step) { case 1: /*** First High ***/ case 3: /*** Second High ***/ case 5: /*** Third High ***/ { /* TH = 1 : ?1CBRLDU */ data &= ~(pad & 0x3F); break; } case 0: /*** 3-button only ***/ case 2: /*** First Low ***/ case 4: /*** Second Low ***/ { /* TH = 0 : ?0SA00DU */ data &= ~((pad & 0x03) | ((pad >> 2) & 0x30) | 0x0C); break; } /* A 6-button gamepad allows the extra buttons to be read based on how */ /* many times TH is switched from 1 to 0. Observe the following sequence */ /* TH = 1 : ?1CBRLDU 3-button pad return value TH = 0 : ?0SA00DU 3-button pad return value TH = 1 : ?1CBRLDU 3-button pad return value TH = 0 : ?0SA00DU 3-button pad return value TH = 1 : ?1CBRLDU 3-button pad return value TH = 0 : ?0SA0000 D3-D0 are forced to '0' TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0 TH = 0 : ?0SA1111 D3-D0 are forced to '1' */ case 6: /*** Third Low ***/ { /* TH = 0 : ?0SA0000 D3-D0 forced to '0' */ data &= ~(((pad >> 2) & 0x30) | 0x0F); break; } case 7: /*** Fourth High ***/ { /* TH = 1 : ?1CBMXYZ Extra buttons returned in D3-D0 */ data &= ~((pad & 0x30) | ((pad >> 8) & 0x0F)); break; } default: /*** D3-D0 forced to '1' ***/ { if (data & 0x40) { /* TH = 1 : ?0CB1111 */ data &= ~(pad & 0x30); } else { /* TH = 0 : ?0SA1111 */ data &= ~((pad >> 2) & 0x30); } } } return data; } INLINE void gamepad_write(int port, unsigned char data, unsigned char mask) { /* Check TH pin direction */ if (mask & 0x40) { /* get TH output state */ data &= 0x40; /* reset TH direction switching latency */ gamepad[port].Latency = 0; /* 6-Buttons controller specific */ if (input.dev[port] == DEVICE_PAD6B) { /* TH 1->0 transition */ if (!data && gamepad[port].State) { gamepad[port].Counter += 2; gamepad[port].Timeout = 0; } } } else { /* retrieve current timestamp */ unsigned int cycles = ((system_hw & SYSTEM_PBC) == SYSTEM_MD) ? m68k.cycles : Z80.cycles; /* TH is pulled high when not configured as output by I/O controller */ data = 0x40; /* TH 0->1 internal switching does not occur immediately (verified on MK-1650 model) */ if (!gamepad[port].State) { gamepad[port].Latency = cycles + 172; } } /* update TH input state */ gamepad[port].State = data; } /*--------------------------------------------------------------------------*/ /* Default ports handlers */ /*--------------------------------------------------------------------------*/ unsigned char gamepad_1_read(void) { return gamepad_read(0); } unsigned char gamepad_2_read(void) { return gamepad_read(4); } void gamepad_1_write(unsigned char data, unsigned char mask) { gamepad_write(0, data, mask); } void gamepad_2_write(unsigned char data, unsigned char mask) { gamepad_write(4, data, mask); } /*--------------------------------------------------------------------------*/ /* 4-WayPlay ports handler */ /*--------------------------------------------------------------------------*/ unsigned char wayplay_1_read(void) { /* check if latched TH input on port B is HIGH */ if (latch & 0x04) { /* 4-WayPlay detection : xxxxx00 */ return 0x7C; } /* latched TR & TL input state on port B select controller # (0-3) on port A */ return gamepad_read(latch); } unsigned char wayplay_2_read(void) { return 0x7F; } void wayplay_1_write(unsigned char data, unsigned char mask) { /* latched TR & TL input state on port B select controller # (0-3) on port A */ gamepad_write(latch & 0x03, data, mask); } void wayplay_2_write(unsigned char data, unsigned char mask) { /* pins not configured as output by I/O controller are pulled HIGH */ data |= ~mask; /* check if both UP & DOWN inputs are LOW */ if (!(data & 0x03)) { /* latch TH, TR & TL input state */ latch = (data >> 4) & 0x07; } } /*--------------------------------------------------------------------------*/ /* J-Cart memory handlers */ /*--------------------------------------------------------------------------*/ unsigned int jcart_read(unsigned int address) { /* D6 returns TH state, D14 is fixed low (fixes Micro Machines 2) */ return (gamepad_read(5) | ((gamepad_read(6) & 0x3F) << 8)); } void jcart_write(unsigned int address, unsigned int data) { data = (data & 0x01) << 6; gamepad_write(5, data, 0x40); gamepad_write(6, data, 0x40); } /*--------------------------------------------------------------------------*/ /* Master Tap ports handler (unofficial, designed by Furrtek) */ /* cf. http://www.smspower.org/uploads/Homebrew/BOoM-SMS-sms4p_2.png */ /*--------------------------------------------------------------------------*/ unsigned char mastertap_1_read(void) { return gamepad_read(flipflop[0].Counter); } unsigned char mastertap_2_read(void) { return gamepad_read(flipflop[1].Counter + 4); } void mastertap_1_write(unsigned char data, unsigned char mask) { /* update bits set as output only */ data = (flipflop[0].Latch & ~mask) | (data & mask); /* check TH 1->0 transitions */ if ((flipflop[0].Latch & 0x40) && !(data & 0x40)) { flipflop[0].Counter = (flipflop[0].Counter + 1) & 0x03; } /* update internal state */ flipflop[0].Latch = data; } void mastertap_2_write(unsigned char data, unsigned char mask) { /* update bits set as output only */ data = (flipflop[1].Latch & ~mask) | (data & mask); /* check TH 1->0 transition */ if ((flipflop[1].Latch & 0x40) && !(data & 0x40)) { flipflop[1].Counter = (flipflop[1].Counter + 1) & 0x03; } /* update internal state */ flipflop[1].Latch = data; } core/z80/osd_cpu.h000664 001750 001750 00000003577 12702465756 015112 0ustar00sergiosergio000000 000000 /******************************************************************************* * * * Define size independent data types and operations. * * * * The following types must be supported by all platforms: * * * * UINT8 - Unsigned 8-bit Integer INT8 - Signed 8-bit integer * * UINT16 - Unsigned 16-bit Integer INT16 - Signed 16-bit integer * * UINT32 - Unsigned 32-bit Integer INT32 - Signed 32-bit integer * * * *******************************************************************************/ #ifndef OSD_CPU_H #define OSD_CPU_H #undef TRUE #undef FALSE #define TRUE 1 #define FALSE 0 typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; typedef signed char INT8; typedef signed short INT16; typedef signed int INT32; /****************************************************************************** * Union of UINT8, UINT16 and UINT32 in native endianess of the target * This is used to access bytes and words in a machine independent manner. * The upper bytes h2 and h3 normally contain zero (16 bit CPU cores) * thus PAIR.d can be used to pass arguments to the memory system * which expects 'int' really. ******************************************************************************/ typedef union { #ifdef LSB_FIRST struct { UINT8 l,h,h2,h3; } b; struct { UINT16 l,h; } w; #else struct { UINT8 h3,h2,h,l; } b; struct { UINT16 h,l; } w; #endif UINT32 d; } PAIR; #endif /* defined OSD_CPU_H */ core/tremor/window.c000664 001750 001750 00000004140 12702465756 015632 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: window functions ********************************************************************/ #include #include #include "misc.h" #include "window.h" #include "window_lookup.h" const void *_vorbis_window(int type, int left){ switch(type){ case 0: switch(left){ case 32: return vwin64; case 64: return vwin128; case 128: return vwin256; case 256: return vwin512; case 512: return vwin1024; case 1024: return vwin2048; case 2048: return vwin4096; case 4096: return vwin8192; default: return(0); } break; default: return(0); } } void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2], long *blocksizes, int lW,int W,int nW){ LOOKUP_T *window[2]; long n=blocksizes[W]; long ln=blocksizes[lW]; long rn=blocksizes[nW]; long leftbegin=n/4-ln/4; long leftend=leftbegin+ln/2; long rightbegin=n/2+n/4-rn/4; long rightend=rightbegin+rn/2; int i,p; window[0]=window_p[0]; window[1]=window_p[1]; for(i=0;i static int check_zip(char *filename); int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size = 0; if(check_zip(filename)) { unz_file_info info; int ret = 0; char fname[256]; /* Attempt to open the archive */ unzFile *fd = unzOpen(filename); if (!fd) return 0; /* Go to first file in archive */ ret = unzGoToFirstFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Get file informations and update filename */ ret = unzGetCurrentFileInfo(fd, &info, fname, 256, NULL, 0, NULL, 0); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Compressed filename extension */ if (extension) { strncpy(extension, &fname[strlen(fname) - 3], 3); extension[3] = 0; } /* Open the file for reading */ ret = unzOpenCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Retrieve uncompressed file size */ size = info.uncompressed_size; if(size > maxsize) { size = maxsize; } /* Read (decompress) the file */ ret = unzReadCurrentFile(fd, buffer, size); if(ret != size) { unzCloseCurrentFile(fd); unzClose(fd); return 0; } /* Close the current file */ ret = unzCloseCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Close the archive */ ret = unzClose(fd); if(ret != UNZ_OK) return 0; } else { /* Open file */ gzFile *gd = gzopen(filename, "rb"); if (!gd) return 0; /* Read file data */ size = gzread(gd, buffer, maxsize); /* filename extension */ if (extension) { strncpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } /* Close file */ gzclose(gd); } /* Return loaded ROM size */ return size; } /* Verifies if a file is a ZIP archive or not. Returns: 1= ZIP archive, 0= not a ZIP archive */ static int check_zip(char *filename) { uint8 buf[2]; FILE *fd = fopen(filename, "rb"); if(!fd) return (0); fread(buf, 2, 1, fd); fclose(fd); if(memcmp(buf, "PK", 2) == 0) return (1); return (0); } core/tremor/ogg.h000664 001750 001750 00000015063 12702465756 015112 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: subsumed libogg includes ********************************************************************/ #ifndef _OGG_H #define _OGG_H #ifdef __cplusplus extern "C" { #endif #include "os_types.h" typedef struct ogg_buffer_state{ struct ogg_buffer *unused_buffers; struct ogg_reference *unused_references; int outstanding; int shutdown; } ogg_buffer_state; typedef struct ogg_buffer { unsigned char *data; long size; int refcount; union { ogg_buffer_state *owner; struct ogg_buffer *next; } ptr; } ogg_buffer; typedef struct ogg_reference { ogg_buffer *buffer; long begin; long length; struct ogg_reference *next; } ogg_reference; typedef struct oggpack_buffer { int headbit; unsigned char *headptr; long headend; /* memory management */ ogg_reference *head; ogg_reference *tail; /* render the byte/bit counter API constant time */ long count; /* doesn't count the tail */ } oggpack_buffer; typedef struct oggbyte_buffer { ogg_reference *baseref; ogg_reference *ref; unsigned char *ptr; long pos; long end; } oggbyte_buffer; typedef struct ogg_sync_state { /* decode memory management pool */ ogg_buffer_state *bufferpool; /* stream buffers */ ogg_reference *fifo_head; ogg_reference *fifo_tail; long fifo_fill; /* stream sync management */ int unsynced; int headerbytes; int bodybytes; } ogg_sync_state; typedef struct ogg_stream_state { ogg_reference *header_head; ogg_reference *header_tail; ogg_reference *body_head; ogg_reference *body_tail; int e_o_s; /* set when we have buffered the last packet in the logical bitstream */ int b_o_s; /* set after we've written the initial page of a logical bitstream */ long serialno; long pageno; ogg_int64_t packetno; /* sequence number for decode; the framing knows where there's a hole in the data, but we need coupling so that the codec (which is in a seperate abstraction layer) also knows about the gap */ ogg_int64_t granulepos; int lacing_fill; ogg_uint32_t body_fill; /* decode-side state data */ int holeflag; int spanflag; int clearflag; int laceptr; ogg_uint32_t body_fill_next; } ogg_stream_state; typedef struct { ogg_reference *packet; long bytes; long b_o_s; long e_o_s; ogg_int64_t granulepos; ogg_int64_t packetno; /* sequence number for decode; the framing knows where there's a hole in the data, but we need coupling so that the codec (which is in a seperate abstraction layer) also knows about the gap */ } ogg_packet; typedef struct { ogg_reference *header; int header_len; ogg_reference *body; long body_len; } ogg_page; /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ extern void oggpack_readinit(oggpack_buffer *b,ogg_reference *r); extern long oggpack_look(oggpack_buffer *b,int bits); extern void oggpack_adv(oggpack_buffer *b,int bits); extern long oggpack_read(oggpack_buffer *b,int bits); extern long oggpack_bytes(oggpack_buffer *b); extern long oggpack_bits(oggpack_buffer *b); extern int oggpack_eop(oggpack_buffer *b); /* Ogg BITSTREAM PRIMITIVES: decoding **************************/ extern ogg_sync_state *ogg_sync_create(void); extern int ogg_sync_destroy(ogg_sync_state *oy); extern int ogg_sync_reset(ogg_sync_state *oy); extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size); extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); /* Ogg BITSTREAM PRIMITIVES: general ***************************/ extern ogg_stream_state *ogg_stream_create(int serialno); extern int ogg_stream_destroy(ogg_stream_state *os); extern int ogg_stream_reset(ogg_stream_state *os); extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); extern int ogg_stream_eos(ogg_stream_state *os); extern int ogg_page_checksum_set(ogg_page *og); extern int ogg_page_version(ogg_page *og); extern int ogg_page_continued(ogg_page *og); extern int ogg_page_bos(ogg_page *og); extern int ogg_page_eos(ogg_page *og); extern ogg_int64_t ogg_page_granulepos(ogg_page *og); extern ogg_uint32_t ogg_page_serialno(ogg_page *og); extern ogg_uint32_t ogg_page_pageno(ogg_page *og); extern int ogg_page_packets(ogg_page *og); extern int ogg_page_getbuffer(ogg_page *og, unsigned char **buffer); extern int ogg_packet_release(ogg_packet *op); extern int ogg_page_release(ogg_page *og); extern void ogg_page_dup(ogg_page *d, ogg_page *s); /* Ogg BITSTREAM PRIMITIVES: return codes ***************************/ #define OGG_SUCCESS 0 #define OGG_HOLE -10 #define OGG_SPAN -11 #define OGG_EVERSION -12 #define OGG_ESERIAL -13 #define OGG_EINVAL -14 #define OGG_EEOS -15 #ifdef __cplusplus } #endif #endif /* _OGG_H */ gx/images/Button_special.png000664 001750 001750 00000011227 12702465756 017267 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚyp՝G3Cݒk|DGPvZc$869b/UXTf l smݰNƴױ H2uZG1vh$۱wkk_+~] /,{F p1- $0 voJ4y9#\ ʲ 50oTX@QQTU-6W EťUTSWWK8px #IeYnm5pD ݋AU2cb$BCgu `qx\ʭ+% 5cπm$_e xrk})ܕK)m T4}6v9ZJmnZ8B I.v܋e |%-F\ &1GPTL&CRJ(*?1yrח֪Kj>#I#,ہg{ ' o nd͝h$b5>jɄ (B:&JH$b2*X|X| PJ:Xx~4=%I]6@Y/w^} bF5Qu9z2WXVɄd@UUN4Bb18T s$Mرnzf}KS]+AIz.PZ{}go]3K8PqV+fQd29@ZM9ɤ~ljb`r-";V2@oKj_$i/e 9xDp+&o;zւExMaXt(m d2J:&LDKYAةwn/ߣ +g ',poZ{^KBŲ/{#h{O2n7fsZUU2 \kxm `ZmL[$&ϻ+W/ M?˲h@{]}~}wE#"&q<~l6 nk_M*ge2l6YNTl,;(r5/>]] ]vCJ;N9yen?6w9 O,l CkpFsw83iM&(',o% ?+v dY;_0F\rw8-?KFq:,\@ 󙘘(hԮ>Z1͌u@h ҆p /p_A)}u}BUz_Bt"L&sD[V\Y ٟ>,͍Wm(#=o J0%Zz6i:RMRXV/_777L&9F7Z5LD&8;1711Mk{o5ło{Hp/F4p}ŢOV@%ٛV0x^X I稟(;88Kֻ9StQ=0%'Pً6L&Ê+MlժUfDΒ8Ӫ(D4s(Y\NoԖJpNt `EEjWSU/9r͛7 e˖o>$DBQ9RWWn&,CϑS۴W"z狼o5xS\%lrDSv,D19.<$ p8X,nnp88N}^lݺ{,G CCCWsNt$2)UQ\.}}}<Ȳ|рh'OdfAȪi:Ƕy3z"؊+cL&{ڰ\.TUeΝTF%3?o"6ئIsmBEKK Xl 4JP(,6}+k:ըs+VB,36ꪫz:~_r]w166ƶmعs'HDWd2$Iue{n@6ziPMFGVB=\(_0֭ ]]]{l۶ MYY}vA  +j)J*F*:K +# :z2hլPdihhJfY66 UU1~yG8x>VSSSX;[E23G:U9$ip^rFNK(!OK6lw[nx N9s/322Bee%GO-d%[w}5\*IR(Ao]qPo\xO_2k.:;;tkU-`w*4k$I4@IB˫WT>zL2 oѝħX-3>>oͮ]f]nͶ픖r)0C¹.9!LE?}իW B})3۬+.&L˿`2b#yf&d2Q\\&㯞^opJ6_}6N7D"Ux<eRiubrv3qQq-&]T+,`M[9sI+$l6۴d AHk)B3)>WDc#f$IQ`oܑ6*Gm8dJޅh`lWQ4p`7H[$I:{^)7g7߿I9s`{ ~ U$H\2ٝtϿ,~xGl~`Sx 8Xe/[tuěȦn.WTj~Up c=6ݿE$)I %Iw4k_9#o 6W)_|_5Ri=zEUk?Y\G1Y{`~`,Bc$W;w^gO5/YhlЏLdZڡ$u!LPM00g6ݿEm ּ -IR%NA:_w>/ Wߝs&-4FDl?کBAؘAWłTU!: vc6߿I$ NAɖ{ 9FtT2Vpņ[z+ЊsO9'h-߸cL!yI?ѻ?-L 4YJE4 >31SS/W||U Ϩ~O ת6I޺)ct>ab@O*_腖L*FdcNGt$V^67S$EOK?[F׏wp(xÓ=[\U]Y@2:J*2JbrD70ܺz1X=Ft%IKx4끍3cuݽP#bsP.A?~s)`Z,2)XԒ✪FCw uZ.;3F;7ѨkIENDB`gcw0/main.h000664 001750 001750 00000000237 12702465756 013657 0ustar00sergiosergio000000 000000 #ifndef _MAIN_H_ #define _MAIN_H_ #define MAX_INPUTS 8 extern int debug_on; extern int log_error; extern int sdl_input_update(void); #endif /* _MAIN_H_ */ gx/images/Banner_top.png000664 001750 001750 00000014031 12702465756 016377 0ustar00sergiosergio000000 000000 PNG  IHDRlsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time02/17/09P)_mIDATxkl[}sH)J|eDZC%6խq%A.lÖl:ht֢]d@7}CW]]mܐA{psYRױ"Y<{s#/yh)XK2WTj˖- PJP(`dd$ǰG{d쑱G{dM'v""""j8DDDDkLbsssI>=2#c=2#cOmHDDD$;*c#c=2#c=2$:*$#c=2#c=2q`{d쑱G{d쑱Gƞ`=2#c=2=Q쑱G{d쑱G{b8FG{d쑱G{d!#c=2#c=q l!d=2#c=2&{d쑱G{d쑱'FG{d쑱G{dq6x`?9=a{K0+m롼 >=a{(Gc7a{=d6]FP:`{=aO4(ืa{=/wu(K [)E`A6EXR 밇=a{ .|IR Z;o=a{=u&Z4Z (kl 0 e{=YC= @0Fo~`쑱G{d쑱G{~36~m쑱G{d쑱G{I!R !#c=2#c=qnoH +#c=2#c=2$z J| {d쑱G{d쑱GƞD&#c=2#c=2Ĺɞ 'B.`=2#c=2S{##c=2#c=2Ĺ*ᫀ\5#c=2#c=q^O\=2#c=2#cO5W%x Z)$_=2#c=2#cO/Y=2#c=2#cO5^{d쑱G{d쑱'.o(#c=2#c=q|'(#c=2#c=1 N2(#c=2#c=qd#c=2#c=b=2#c=2s#c=2#c=2$Mp"쑱G{d쑱G{bN|b=2#c=2Nj@a=2#c=2S/{d쑱G{d쑱'DG{d쑱G{dE Q쑱G{d쑱G{bx"쑱G{d쑱G{##c=2#c=2%<& 4=2#c=2#cO +J@Jq_{=a{꧲ᓨR\Zkc*p=a{>\`Z@+I La{=kM81´*_=a{ÞIPJuJ~ee{=aO6Xtb#%f[aE&u=a{ԑ;00R ֘lf{=aO}Z/x,Zk8|cʗFwS2=a{NO@kʕ*6XFB~rPRXtؠRUP2p" >SYFj/#X5Remceon%? ?>VR_$nc*l?ui~UUrlh {=@݈2?f ȒZgVz\=-7X(Uq˾U@d# ]x1ք˦29h7XX%vu*8YCiUYNųeu~OPY^Nc\yUXڮKo亮ԝm[Ckt9NcSwn+-/2 6k[f0Ƈ5t: Wocځ_*51^ޏic̲wfK>/Jiln[j}ߏ-x6ϭ}u]b`~n%ٙ9.0%>aWa=fq=+ya QJ-zDc ְZX޸Kc~˹]~hKujzm WkKKR۾^{Lt{LK۸^ƫѲѯ1Ƅ/1gÅ+A4#` zϿU*Nϗ|w)J1h Lա{ͨDt5czͲRoR*8)T*r|> ^}3 ,T<͂=2j(t:s2XW?yDDt5A_~}u2۶m۔d2J)544~u .`_=2EV]֣<h > થp9}]wmۿ;vtm߾'JxoxáPZfxb=qhAyˣ`>G,<7yҩT*{m۳gt:O:_| o0܆E7x{dSX 7/¿ƈ!- }w=rឞ b?ͣcz.j'("7`t0 y.!"kICvLGZ޽{g?>8N~*~}7#cOr9сЩQDo{=,>U) -N{n{* ?q J-#cO\Hr ~_?{rH/$[<==2 n-ssscwN>}~g}xS0($NQ쑱'n}!Q,qT*zXx 彁&^z饩ы~N=ru(l̹+{b!`""fG l鷎O^}='#MtH="q$"J0 F kxG{O6m/~eLX(gu l'(J  fQXx?|… }ӥiuwv1<2~Z#cO@""E" :tׯ_ ^xUwj>lO`3t*WͰ'=2q$"5)2:Xxא<A6<<~pv, nR VM1T =칬DDVU iY '?OYWW׍333xq-َʓuDH)#\HDDkV F W yGy䑿qw87^{ŹP^ Zkp y@"Wkzꩿ޺u'BX,wT>fmYOq4|,س{8EԸB8 g>yw>uZgs F i|lSdR(>aO-T] fW򇽽 ºI?~og]d [ڪBcӱJ˟oh{DDD5T<(>q{o>u?wO,2 k(adt𜲤{8 A0ؑf7=Cq;lٲ#}]:;\n6M. Y3p$""ZF{P~ޛ>Oܻwo߶mvj1::gg0<24t}.i"=fHDDK؆[l78pࣽ{:; I𼶨fpj]`yiDDD&r^nEỵ< o޼ysP6|۷o~]GGG!ɤ&ga-004s02)XkaLf0m`|u֖-XU~+ppqA>5vbdlAk[Z1p쳰@)rD W؊po/ T*բJ?䓿r Bc-T[VtUPJ>|㣵% fv)ŒA+  Qяc*W{Rp9g=HB-ZW _>k-k+.jr6n3uy^ R@do`xn` {ýmX(?kmm͎ۗy?NӾ󼹹9/sssJ)5ZZZTc333sZ)VZkRZ-Eu`Ph>5.VVMt[c1FKR}%],TkUcccIw]ۣV-X_2ҩTuݶ|>}.۸k׮loֺht:5>>>7:::1XkMT3ׅTJ/Nh׎pHDDJA0<,|h8: aKRyWIy^WX_@ #include #include "ogg.h" static unsigned long mask[]= {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, 0x3fffffff,0x7fffffff,0xffffffff }; /* mark read process as having run off the end */ static void _adv_halt(oggpack_buffer *b){ b->headptr=b->head->buffer->data+b->head->begin+b->head->length; b->headend=-1; b->headbit=0; } /* spans forward, skipping as many bytes as headend is negative; if headend is zero, simply finds next byte. If we're up to the end of the buffer, leaves headend at zero. If we've read past the end, halt the decode process. */ static void _span(oggpack_buffer *b){ while(b->headend<1){ if(b->head->next){ b->count+=b->head->length; b->head=b->head->next; b->headptr=b->head->buffer->data+b->head->begin-b->headend; b->headend+=b->head->length; }else{ /* we've either met the end of decode, or gone past it. halt only if we're past */ if(b->headend<0 || b->headbit) /* read has fallen off the end */ _adv_halt(b); break; } } } void oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ memset(b,0,sizeof(*b)); b->tail=b->head=r; b->count=0; b->headptr=b->head->buffer->data+b->head->begin; b->headend=b->head->length; _span(b); } #define _lookspan() while(!end){\ head=head->next;\ if(!head) return -1;\ ptr=head->buffer->data + head->begin;\ end=head->length;\ } /* Read in bits without advancing the bitptr; bits <= 32 */ long oggpack_look(oggpack_buffer *b,int bits){ unsigned long m=mask[bits]; unsigned long ret=-1; bits+=b->headbit; if(bits >= b->headend<<3){ int end=b->headend; unsigned char *ptr=b->headptr; ogg_reference *head=b->head; if(end<0)return -1; if(bits){ _lookspan(); ret=*ptr++>>b->headbit; if(bits>8){ --end; _lookspan(); ret|=*ptr++<<(8-b->headbit); if(bits>16){ --end; _lookspan(); ret|=*ptr++<<(16-b->headbit); if(bits>24){ --end; _lookspan(); ret|=*ptr++<<(24-b->headbit); if(bits>32 && b->headbit){ --end; _lookspan(); ret|=*ptr<<(32-b->headbit); } } } } } }else{ /* make this a switch jump-table */ ret=b->headptr[0]>>b->headbit; if(bits>8){ ret|=b->headptr[1]<<(8-b->headbit); if(bits>16){ ret|=b->headptr[2]<<(16-b->headbit); if(bits>24){ ret|=b->headptr[3]<<(24-b->headbit); if(bits>32 && b->headbit) ret|=b->headptr[4]<<(32-b->headbit); } } } } ret&=m; return ret; } /* limited to 32 at a time */ void oggpack_adv(oggpack_buffer *b,int bits){ bits+=b->headbit; b->headbit=bits&7; b->headptr+=bits/8; if((b->headend-=bits/8)<1)_span(b); } /* spans forward and finds next byte. Never halts */ static void _span_one(oggpack_buffer *b){ while(b->headend<1){ if(b->head->next){ b->count+=b->head->length; b->head=b->head->next; b->headptr=b->head->buffer->data+b->head->begin; b->headend=b->head->length; }else break; } } static int _halt_one(oggpack_buffer *b){ if(b->headend<1){ _adv_halt(b); return -1; } return 0; } int oggpack_eop(oggpack_buffer *b){ if(b->headend<0)return -1; return 0; } /* bits <= 32 */ long oggpack_read(oggpack_buffer *b,int bits){ unsigned long m=mask[bits]; ogg_uint32_t ret=-1; bits+=b->headbit; if(bits >= b->headend<<3){ if(b->headend<0)return -1; if(bits){ if (_halt_one(b)) return -1; ret=*b->headptr>>b->headbit; if(bits>=8){ ++b->headptr; --b->headend; _span_one(b); if(bits>8){ if (_halt_one(b)) return -1; ret|=*b->headptr<<(8-b->headbit); if(bits>=16){ ++b->headptr; --b->headend; _span_one(b); if(bits>16){ if (_halt_one(b)) return -1; ret|=*b->headptr<<(16-b->headbit); if(bits>=24){ ++b->headptr; --b->headend; _span_one(b); if(bits>24){ if (_halt_one(b)) return -1; ret|=*b->headptr<<(24-b->headbit); if(bits>=32){ ++b->headptr; --b->headend; _span_one(b); if(bits>32){ if (_halt_one(b)) return -1; if(b->headbit)ret|=*b->headptr<<(32-b->headbit); } } } } } } } } } }else{ ret=b->headptr[0]>>b->headbit; if(bits>8){ ret|=b->headptr[1]<<(8-b->headbit); if(bits>16){ ret|=b->headptr[2]<<(16-b->headbit); if(bits>24){ ret|=b->headptr[3]<<(24-b->headbit); if(bits>32 && b->headbit){ ret|=b->headptr[4]<<(32-b->headbit); } } } } b->headptr+=bits/8; b->headend-=bits/8; } ret&=m; b->headbit=bits&7; return ret; } long oggpack_bytes(oggpack_buffer *b){ return(b->count+b->headptr-b->head->buffer->data-b->head->begin+ (b->headbit+7)/8); } long oggpack_bits(oggpack_buffer *b){ return((b->count+b->headptr-b->head->buffer->data-b->head->begin)*8+ b->headbit); } gx/images/ctrl_classic.png000664 001750 001750 00000002366 12702465756 016765 0ustar00sergiosergio000000 000000 PNG  IHDR( `:sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYJIDATx[VUߞ5ZSFYYC&!T]"D!dCDPDO="T]z(Fj7S쮦&mqggzk^{wBQ-Bg7M ho:a?6h\q vay6v| ؃N\lĶ΍&1n8y؍[b_5U&E}lF[[Z[[122§oڴ/{}&nFAok׮]T*n:dff"""h x;w.JA`߾}~6l5k?y@---O:\.(0/fddKHH-[*ӉFyEraT*$&&"++ t`YnGÇⲺoPELɴOףs7o(ݎׯcll шVExx888f3:;;aZzj>}j~N.\˗MW^} TUUm$` ʾ[Z I ,˂eYp'6eap= w0@ww7mX")/ hxx?qqqD~~w ʕ+ڵkl2( 1? M*d`֭8z(jkkȑ#P(ʂGTC\Rm2`2tJwAXj/^<#ęGZZv؁'Oŋ8,**`Cn?&&&y湝7l2!zlB3L(..Ɖ'0:: fdeea||_ Nj& QQQ_=!?iX6w B]bHÇ@l6eee%l6[$6n)ݖg577CP$I1|fNp eRIh4eaaaiFZZ\ I<ϋ[ URh a &&o˲|X|9Ǐ2\{B} A%OrgYIIIhmm0`>}8S/7}x R (@t *\|KAk4 z}}}1rz %o X,z"PO"ezz Rp8D$I Q[ SZ$hKSP-4tx<|>dPz)qDEEg0zppP9S .D˅hiK$4gJ Ko‡D`4'd}1{ۅV`hnn=OB#iG.؅1ݎ4񻾾>T2\~/""O<#Bpmۆvx P>O)-@3U|RnFNN&''t:ߏ2Nw<.. _Jsl۶JJJ<^|). ֦Bz$::: $xWs5$''$bL&z<]vAӉ( ui^11˲?Yi^)լ@E_L')*s8Iccc ǃ!h4Ӛ;fj^8j522ޫW~| EIENDB`gx/gx_input.c000664 001750 001750 00000146532 12702465756 014352 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_input.c * * Genesis Plus GX input support * * Copyright Eke-Eke (2007-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #include "gui.h" #include "cheats.h" #ifdef HW_RVL #include #endif /* Analog sticks sensitivity */ #define ANALOG_SENSITIVITY 30 /* Delay before held keys triggering */ /* higher is the value, longer must the key remain held */ #define HELD_DELAY 30 /* Direction & selection update speed when a key is being held */ /* lower is the value, faster is the key update (min value = 1) */ #define HELD_SPEED 2 /* Configurable keys */ #define KEY_BUTTONA 0 #define KEY_BUTTONB 1 #define KEY_BUTTONC 2 #define KEY_START 3 #define KEY_BUTTONX 4 #define KEY_BUTTONY 5 #define KEY_BUTTONZ 6 #define KEY_MODE 7 #define KEY_MENU 8 #ifdef HW_RVL #define PAD_UP 0 #define PAD_DOWN 1 #define PAD_LEFT 2 #define PAD_RIGHT 3 /* default directions mapping */ static u32 wpad_dirmap[3][4] = { {WPAD_BUTTON_RIGHT, WPAD_BUTTON_LEFT, WPAD_BUTTON_UP, WPAD_BUTTON_DOWN}, /* WIIMOTE */ {WPAD_BUTTON_UP, WPAD_BUTTON_DOWN, WPAD_BUTTON_LEFT, WPAD_BUTTON_RIGHT}, /* WIIMOTE + NUNCHUK */ {WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN, WPAD_CLASSIC_BUTTON_LEFT, WPAD_CLASSIC_BUTTON_RIGHT} /* CLASSIC */ }; #define WPAD_BUTTONS_HELD (WPAD_BUTTON_UP | WPAD_BUTTON_DOWN | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | \ WPAD_BUTTON_MINUS | WPAD_BUTTON_PLUS | WPAD_BUTTON_A | WPAD_BUTTON_2 | \ WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT | \ WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_A) #endif #define PAD_BUTTONS_HELD (PAD_BUTTON_UP | PAD_BUTTON_DOWN | PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | \ PAD_TRIGGER_L | PAD_TRIGGER_R | PAD_BUTTON_A) static char keyname[MAX_KEYS][16]; static int held_cnt = 0; static int inputs_disabled = 0; /***************************************************************************************/ /* Gamecube PAD support */ /***************************************************************************************/ static void pad_config(int chan, int first_key, int last_key) { u16 p = 0; char msg[64]; /* disable background PAD scanning */ inputs_disabled = 1; /* Check if PAD is connected */ VIDEO_WaitVSync(); if (!(PAD_ScanPads() & (1< ANALOG_SENSITIVITY)) { ConfigRequested = 1; return; } /* Emulated device */ switch (input.dev[i]) { case DEVICE_PAD6B: { /* X,Y,Z,MODE buttons */ if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE; } case DEVICE_PAD3B: { /* A button */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; } case DEVICE_PAD2B: { /* D-PAD */ if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; /* default buttons */ if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_XE_1AP: { /* Left Stick analog position [0-255] */ input.analog[i][0] = (x + 128); input.analog[i][1] = y ? (127 - y) : (128 - y); /* Right Stick analog position [0-255] */ x = PAD_SubStickX(chan); y = PAD_SubStickY(chan); /* Emulated stick is unidirectional but can be rotated */ if (abs(x) > abs(y)) { input.analog[i+1][0] = (x + 128); } else { input.analog[i+1][0] = (y + 128); } /* Buttons */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_XE_A; if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_XE_B; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_XE_C; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_XE_START; if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_XE_D; if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_XE_E1; if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_XE_E2; if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_XE_SELECT; break; } case DEVICE_SPORTSPAD: { /* Y analog position [0-255] */ input.analog[i][1] = y ? (127 - y) : (128 - y); } case DEVICE_PADDLE: { /* X analog position [0-255] */ input.analog[i][0] = (x + 128); /* Buttons */ if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_LIGHTGUN: { /* Gun screen position (x,y) */ input.analog[i][0] += x / ANALOG_SENSITIVITY; input.analog[i][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[i][0] < 0) input.analog[i][0] = 0; else if (input.analog[i][0] > bitmap.viewport.w) input.analog[i][0] = bitmap.viewport.w; if (input.analog[i][1] < 0) input.analog[i][1] = 0; else if (input.analog[i][1] > bitmap.viewport.h) input.analog[i][1] = bitmap.viewport.h; /* Buttons */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_MOUSE: { /* Mouse relative movement (-255,255) */ input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2; /* Y-Axis inversion */ if (config.invert_mouse) { input.analog[i][1] = -input.analog[i][1]; } /* Buttons */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_MOUSE_CENTER; if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_MOUSE_LEFT; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_MOUSE_RIGHT; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_PICO: { /* D-PAD */ if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP; else if (p & PAD_BUTTON_DOWN) input.pad[0] |= INPUT_DOWN; if (p & PAD_BUTTON_LEFT) input.pad[0] |= INPUT_LEFT; else if (p & PAD_BUTTON_RIGHT) input.pad[0] |= INPUT_RIGHT; /* PEN screen position (x,y) */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] > 0x17c) input.analog[0][0] = 0x17c; else if (input.analog[0][0] < 0x3c) input.analog[0][0] = 0x3c; if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc; else if (input.analog[0][1] > 0x2f7) input.analog[0][1] = 0x2f7; /* PEN & RED button */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_PICO_RED; if (p & pad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_PICO_PEN; /* PAGE index increment */ if (p & pad_keymap[KEY_BUTTONC]) pico_current = (pico_current + 1) & 7; break; } case DEVICE_TEREBI: { /* PEN screen position (x,y) */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] < 0) input.analog[0][0] = 0; else if (input.analog[0][0] > 250) input.analog[0][0] = 250; if (input.analog[0][1] < 0) input.analog[0][1] = 0; else if (input.analog[0][1] > 250) input.analog[0][1] = 250; /* PEN button */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_BUTTON1; break; } case DEVICE_GRAPHIC_BOARD: { /* PEN screen position (x,y) */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] < 0) input.analog[0][0] = 0; else if (input.analog[0][0] > 255) input.analog[0][0] = 255; if (input.analog[0][1] < 0) input.analog[0][1] = 0; else if (input.analog[0][1] > 255) input.analog[0][1] = 255; /* MODE buttons */ if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_GRAPHIC_PEN; if (p & pad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_GRAPHIC_DO; if (p & pad_keymap[KEY_BUTTONC]) input.pad[0] |= INPUT_GRAPHIC_MENU; break; } case DEVICE_ACTIVATOR: { /* Left & right analog stick angle [0-360] */ float ang; /* Left stick values */ if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY)) { /* Calculate angle (in degree) */ ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI); if (x < 0) ang += 180.0; /* 8 bottom sensors = 8 areas */ if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2L; else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3L; else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4L; else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5L; else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6L; else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7L; else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8L; else input.pad[i] |= INPUT_ACTIVATOR_1L; } /* Right stick values */ x = PAD_SubStickX(chan); y = PAD_SubStickY(chan); if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY)) { /* Calculate angle (in degree) */ ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI); if (x < 0) ang += 180.0; /* 8 top sensors = 8 areas */ if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2U; else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3U; else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4U; else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5U; else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6U; else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7U; else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8U; else input.pad[i] |= INPUT_ACTIVATOR_1U; } break; } } } /***************************************************************************************/ /* Wii WPAD support */ /***************************************************************************************/ #ifdef HW_RVL static int wpad_StickX(WPADData *data, u8 right) { struct joystick_t* js = NULL; switch (data->exp.type) { case WPAD_EXP_NUNCHUK: js = right ? NULL : &data->exp.nunchuk.js; break; case WPAD_EXP_CLASSIC: js = right ? &data->exp.classic.rjs : &data->exp.classic.ljs; break; default: break; } if (js) { /* raw X position */ int pos = js->pos.x; /* X range calibration */ int min = js->min.x; int max = js->max.x; int center = js->center.x; /* value returned could be above calibration limits */ if (pos > max) return 127; if (pos < min) return -128; /* adjust against center position */ pos -= center; /* return interpolated range [-128;127] */ if (pos > 0) { return (int)(127.0 * ((float)pos / (float)(max - center))); } else { return (int)(128.0 * ((float)pos / (float)(center - min))); } } return 0; } static int wpad_StickY(WPADData *data, u8 right) { struct joystick_t* js = NULL; switch (data->exp.type) { case WPAD_EXP_NUNCHUK: js = right ? NULL : &data->exp.nunchuk.js; break; case WPAD_EXP_CLASSIC: js = right ? &data->exp.classic.rjs : &data->exp.classic.ljs; break; default: break; } if (js) { /* raw Y position */ int pos = js->pos.y; /* Y range calibration */ int min = js->min.y; int max = js->max.y; int center = js->center.y; /* value returned could be above calibration limits */ if (pos > max) return 127; if (pos < min) return -128; /* adjust against center position */ pos -= center; /* return interpolated range [-128;127] */ if (pos > 0) { return (int)(127.0 * ((float)pos / (float)(max - center))); } else { return (int)(128.0 * ((float)pos / (float)(center - min))); } } return 0; } static void wpad_config(u8 exp, int chan, int first_key, int last_key) { char msg[64]; u32 p = 255; /* Disable background PAD scanning */ inputs_disabled = 1; /* Check if device is connected */ WPAD_Probe(chan, &p); if (((exp > WPAD_EXP_NONE) && (p != exp)) || (p == 255)) { /* device not detected */ if (exp == WPAD_EXP_NONE) sprintf(msg, "WIIMOTE #%d is not connected !", chan+1); if (exp == WPAD_EXP_NUNCHUK) sprintf(msg, "NUNCHUK #%d is not connected !", chan+1); if (exp == WPAD_EXP_CLASSIC) sprintf(msg, "CLASSIC #%d is not connected !", chan+1); GUI_WaitPrompt("Error",msg); /* re-enable background PAD scanning and exit */ inputs_disabled = 0; return; } /* Configure each keys */ do { /* ignore unused keys */ if (strcmp(keyname[first_key], "N.A")) { /* remove any pending buttons */ while (WPAD_ButtonsHeld(chan)) { VIDEO_WaitVSync(); WPAD_ScanPads(); } /* configurable button */ sprintf(msg,"Press key for %s\n(HOME to return)",keyname[first_key]); GUI_MsgBoxUpdate(0,msg); /* wait for user input */ p = 0; while (!p) { VIDEO_WaitVSync(); WPAD_ScanPads(); p = WPAD_ButtonsDown(chan); } /* detect pressed key */ switch (exp) { /* Wiimote (TODO: add motion sensing !) */ case WPAD_EXP_NONE: { if (p & WPAD_BUTTON_2) p = WPAD_BUTTON_2; else if (p & WPAD_BUTTON_1) p = WPAD_BUTTON_1; else if (p & WPAD_BUTTON_B) p = WPAD_BUTTON_B; else if (p & WPAD_BUTTON_A) p = WPAD_BUTTON_A; else if (p & WPAD_BUTTON_PLUS) p = WPAD_BUTTON_PLUS; else if (p & WPAD_BUTTON_MINUS) p = WPAD_BUTTON_MINUS; else first_key = MAX_KEYS; break; } /* Wiimote + Nunchuk (TODO: add motion sensing !) */ case WPAD_EXP_NUNCHUK: { if (p & WPAD_BUTTON_2) p = WPAD_BUTTON_2; else if (p & WPAD_BUTTON_1) p = WPAD_BUTTON_1; else if (p & WPAD_BUTTON_B) p = WPAD_BUTTON_B; else if (p & WPAD_BUTTON_A) p = WPAD_BUTTON_A; else if (p & WPAD_BUTTON_PLUS) p = WPAD_BUTTON_PLUS; else if (p & WPAD_BUTTON_MINUS) p= WPAD_BUTTON_MINUS; else if (p & WPAD_NUNCHUK_BUTTON_Z) p = WPAD_NUNCHUK_BUTTON_Z; else if (p & WPAD_NUNCHUK_BUTTON_C) p = WPAD_NUNCHUK_BUTTON_C; else first_key = MAX_KEYS; break; } /* Classic Controller */ case WPAD_EXP_CLASSIC: { if (p & WPAD_CLASSIC_BUTTON_X) p = WPAD_CLASSIC_BUTTON_X; else if (p & WPAD_CLASSIC_BUTTON_A) p = WPAD_CLASSIC_BUTTON_A; else if (p & WPAD_CLASSIC_BUTTON_Y) p = WPAD_CLASSIC_BUTTON_Y; else if (p & WPAD_CLASSIC_BUTTON_B) p = WPAD_CLASSIC_BUTTON_B; else if (p & WPAD_CLASSIC_BUTTON_ZL) p = WPAD_CLASSIC_BUTTON_ZL; else if (p & WPAD_CLASSIC_BUTTON_ZR) p = WPAD_CLASSIC_BUTTON_ZR; else if (p & WPAD_CLASSIC_BUTTON_PLUS) p = WPAD_CLASSIC_BUTTON_PLUS; else if (p & WPAD_CLASSIC_BUTTON_MINUS) p = WPAD_CLASSIC_BUTTON_MINUS; else if (p & WPAD_CLASSIC_BUTTON_FULL_L) p = WPAD_CLASSIC_BUTTON_FULL_L; else if (p & WPAD_CLASSIC_BUTTON_FULL_R) p = WPAD_CLASSIC_BUTTON_FULL_R; else first_key = MAX_KEYS; break; } default: { first_key = MAX_KEYS; break; } } /* update key mapping */ if (first_key < MAX_KEYS) { config.wpad_keymap[exp + (chan * 3)][first_key] = p; } } } while (first_key++ < last_key); /* remove any pending buttons */ while (WPAD_ButtonsHeld(chan)) { VIDEO_WaitVSync(); WPAD_ScanPads(); } /* re-enable background PAD scanning and exit */ inputs_disabled = 0; } static void wpad_update(s8 chan, u8 i, u32 exp) { /* WPAD data */ WPADData *data = WPAD_Data(chan); /* WPAD status */ u32 p = data->btns_h; /* Analog sticks */ s8 x = 0; s8 y = 0; if (exp != WPAD_EXP_NONE) { x = wpad_StickX(data,0); y = wpad_StickY(data,0); } /* Retrieve current key mapping */ u32 *wpad_keymap = config.wpad_keymap[exp + (chan * 3)]; /* Emulated device */ switch (input.dev[i]) { case DEVICE_PAD6B: { /* X,Y,Z,MODE buttons */ if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; if (p & wpad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE; } case DEVICE_PAD3B: { /* A button */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; } case DEVICE_PAD2B: { /* D-PAD */ if ((p & wpad_dirmap[exp][PAD_UP]) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; /* default buttons */ if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_XE_1AP: { /* Left Stick analog position [0-255] */ input.analog[i][0] = (x + 128); input.analog[i][1] = y ? (127 - y) : 128; /* Right Stick analog position [0-255] */ if (exp == WPAD_EXP_CLASSIC) { /* Classic Controller right stick */ x = wpad_StickX(data,1); y = wpad_StickY(data,1); /* Emulated stick is unidirectional but can be rotated */ if (abs(x) > abs(y)) { input.analog[i+1][0] = (x + 128); } else { input.analog[i+1][0] = (y + 128); } } else { /* Wiimote D-PAD */ if ((p & wpad_dirmap[exp][PAD_DOWN]) || (p & wpad_dirmap[exp][PAD_LEFT])) input.analog[i+1][0]-=2; else if ((p & wpad_dirmap[exp][PAD_UP]) || (p & wpad_dirmap[exp][PAD_RIGHT])) input.analog[i+1][0]+=2; /* Limits */ if (input.analog[i+1][0] < 0) input.analog[i+1][0] = 0; else if (input.analog[i+1][0] > 255) input.analog[i+1][0] = 255; } /* Buttons */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_XE_A; if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_XE_B; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_XE_C; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_XE_START; if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_XE_D; if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_XE_E1; if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_XE_E2; if (p & wpad_keymap[KEY_MODE]) input.pad[i] |= INPUT_XE_SELECT; break; } case DEVICE_SPORTSPAD: { /* X analog position [0-255] */ if (p & wpad_dirmap[exp][PAD_LEFT]) input.analog[i][0]-=2; else if (p & wpad_dirmap[exp][PAD_RIGHT]) input.analog[i][0]+=2; else input.analog[i][0] = (x + 128); /* Y analog position [0-255] */ if (p & wpad_dirmap[exp][PAD_UP]) input.analog[i][1]-=2; else if (p & wpad_dirmap[exp][PAD_DOWN]) input.analog[i][1]+=2; else input.analog[i][1] = y ? (127 - y) : (128 - y); /* Limits */ if (input.analog[i][0] < 0) input.analog[i][0] = 0; else if (input.analog[i][0] > 255) input.analog[i][0] = 255; if (input.analog[i][1] < 0) input.analog[i][1] = 0; else if (input.analog[i][1] > 255) input.analog[i][1] = 255; /* Buttons */ if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_PADDLE: { /* X analog position [0-255] */ if (exp == WPAD_EXP_NONE) { /* Wiimote D-PAD */ if (p & wpad_dirmap[exp][PAD_LEFT]) input.analog[i][0]-=2; else if (p & wpad_dirmap[exp][PAD_RIGHT]) input.analog[i][0]+=2; /* Limits */ if (input.analog[i][0] < 0) input.analog[i][0] = 0; else if (input.analog[i][0] > 255) input.analog[i][0] = 255; } else { /* Left analog stick */ input.analog[i][0] = (x + 128); } /* Buttons */ if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_LIGHTGUN: { /* Gun screen position (x,y) */ if (exp != WPAD_EXP_CLASSIC) { /* Wiimote IR */ struct ir_t ir; WPAD_IR(chan, &ir); if (ir.valid) { /* screen position */ input.analog[i][0] = ((ir.x + config.calx) * bitmap.viewport.w) / 640; input.analog[i][1] = ((ir.y + config.caly) * bitmap.viewport.h) / 480; } else { /* lightgun should point outside screen area */ input.analog[i][0] = 512; input.analog[i][1] = 512; } } else { /* Classic Controller analog stick */ input.analog[i][0] += x / ANALOG_SENSITIVITY; input.analog[i][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[i][0] < 0) input.analog[i][0] = 0; else if (input.analog[i][0] > bitmap.viewport.w) input.analog[i][0] = bitmap.viewport.w; if (input.analog[i][1] < 0) input.analog[i][1] = 0; else if (input.analog[i][1] > bitmap.viewport.h) input.analog[i][1] = bitmap.viewport.h; } /* Buttons */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_MOUSE: { /* Mouse relative movement (-255,255) */ if (MOUSE_IsConnected()) { /* USB mouse support */ mouse_event event; MOUSE_GetEvent(&event); MOUSE_FlushEvents(); /* USB mouse position (-127;+127) -> (-255;+255) */ input.analog[i][0] = event.rx * 2; input.analog[i][1] = event.ry * 2; /* USB mouse buttons */ if (event.button & 1) input.pad[i] |= INPUT_MOUSE_RIGHT; if (event.button & 2) input.pad[i] |= INPUT_MOUSE_CENTER; if (event.button & 4) input.pad[i] |= INPUT_MOUSE_LEFT; } else if (exp != WPAD_EXP_CLASSIC) { /* Wiimote IR (buggy) */ struct ir_t ir; WPAD_IR(chan, &ir); /* Only if Wiimote is pointed to screen */ if(ir.smooth_valid) { input.analog[i][0] = (int)((ir.sx - 512) / 2 / ANALOG_SENSITIVITY); input.analog[i][1] = (int)((ir.sy - 384) * 2 / 3 / ANALOG_SENSITIVITY); } } else { /* Classic Controller analog stick position (-127;+127) -> (-255;+255) */ input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2; } /* Y-Axis inversion */ if (config.invert_mouse) { input.analog[i][1] = -input.analog[i][1]; } /* Buttons */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_MOUSE_CENTER; if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_MOUSE_LEFT; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_MOUSE_RIGHT; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; break; } case DEVICE_PICO: { /* D-PAD */ if (p & PAD_BUTTON_UP) input.pad[i] |= INPUT_UP; else if (p & PAD_BUTTON_DOWN) input.pad[i] |= INPUT_DOWN; if (p & PAD_BUTTON_LEFT) input.pad[i] |= INPUT_LEFT; else if (p & PAD_BUTTON_RIGHT) input.pad[i] |= INPUT_RIGHT; /* PEN screen position (x,y) */ if (exp != WPAD_EXP_CLASSIC) { /* Wiimote IR */ struct ir_t ir; WPAD_IR(chan, &ir); if (ir.valid) { input.analog[0][0] = 0x3c + ((ir.x + config.calx) * (0x17c - 0x3c + 1)) / 640; input.analog[0][1] = 0x1fc + ((ir.y + config.caly) * (0x2f7 - 0x1fc + 1)) / 480; } } else { /* Classic Controller analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] > 0x17c) input.analog[0][0] = 0x17c; else if (input.analog[0][0] < 0x3c) input.analog[0][0] = 0x3c; if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc; else if (input.analog[0][1] > 0x2f7) input.analog[0][1] = 0x2f7; } /* PEN & RED buttons */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_PICO_PEN; if (p & wpad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_PICO_RED; /* PAGE index increment */ if (p & wpad_keymap[KEY_BUTTONC]) pico_current = (pico_current + 1) & 7; break; } case DEVICE_TEREBI: { /* PEN screen position (x,y) */ if (exp != WPAD_EXP_CLASSIC) { /* Wiimote IR */ struct ir_t ir; WPAD_IR(chan, &ir); if (ir.valid) { input.analog[0][0] = ((ir.x + config.calx) * 250) / 640; input.analog[0][1] = ((ir.y + config.caly) * 250) / 480; } } else { /* Classic Controller analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] < 0)input.analog[0][0] = 0; else if (input.analog[0][0] > 250) input.analog[0][0] = 250; if (input.analog[0][1] < 0) input.analog[0][1] = 0; else if (input.analog[0][1] > 250) input.analog[0][1] = 250; } /* PEN button */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_BUTTON1; break; } case DEVICE_GRAPHIC_BOARD: { /* PEN screen position (x,y) */ if (exp != WPAD_EXP_CLASSIC) { /* Wiimote IR */ struct ir_t ir; WPAD_IR(chan, &ir); if (ir.valid) { input.analog[0][0] = ((ir.x + config.calx) * 255) / 640; input.analog[0][1] = ((ir.y + config.caly) * 255) / 480; } } else { /* Classic Controller analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; /* Limits */ if (input.analog[0][0] < 0)input.analog[0][0] = 0; else if (input.analog[0][0] > 255) input.analog[0][0] = 255; if (input.analog[0][1] < 0) input.analog[0][1] = 0; else if (input.analog[0][1] > 255) input.analog[0][1] = 255; } /* MODE Buttons */ if (p & wpad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_GRAPHIC_PEN; if (p & wpad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_GRAPHIC_DO; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[0] |= INPUT_GRAPHIC_MENU; break; } case DEVICE_ACTIVATOR: { /* Classic Controller only */ if (exp == WPAD_EXP_CLASSIC) { /* Left stick */ float mag = data->exp.classic.ljs.mag; float ang = data->exp.classic.ljs.ang; if (mag > 0.5) { /* 8 bottom sensors = 8 areas */ if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2L; else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3L; else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4L; else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5L; else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6L; else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7L; else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8L; else input.pad[i] |= INPUT_ACTIVATOR_1L; } /* Right stick */ mag = data->exp.classic.rjs.mag; ang = data->exp.classic.rjs.ang; if (mag > 0.5) { /* 8 top sensors = 8 areas */ if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2U; else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3U; else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4U; else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5U; else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6U; else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7U; else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8U; else input.pad[i] |= INPUT_ACTIVATOR_1U; } } break; } } } #endif /***************************************************************************************/ /* GX Input interface */ /***************************************************************************************/ void gx_input_Init(void) { PAD_Init(); #ifdef HW_RVL WPAD_Init(); WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL,640,480); #endif } int gx_input_FindDevices(void) { int i; #ifdef HW_RVL u32 wpad; #endif int found = 0; int player = 0; VIDEO_WaitVSync(); u32 pad = PAD_ScanPads(); for (i=0; iexp.classic.rjs.max.x != 255) { found++; } } else if (wpad != 255) { found++; } break; } case 2: /* Expansion Controller */ case 3: { wpad = 255; WPAD_Probe(config.input[player].port, &wpad); if (wpad == (config.input[player].device - 1)) { found++; } break; } #endif default: { break; } } /* next configured player */ player ++; } } /* return number of connected devices */ return found; } void gx_input_SetDefault(void) { int i,j; u32 exp; /* set default key mapping for each type of devices */ for (i=0; i<4; i++) { config.pad_keymap[i][KEY_BUTTONA] = PAD_BUTTON_B; config.pad_keymap[i][KEY_BUTTONB] = PAD_BUTTON_A; config.pad_keymap[i][KEY_BUTTONC] = PAD_BUTTON_X; config.pad_keymap[i][KEY_START] = PAD_BUTTON_START; config.pad_keymap[i][KEY_BUTTONX] = PAD_TRIGGER_L; config.pad_keymap[i][KEY_BUTTONY] = PAD_BUTTON_Y; config.pad_keymap[i][KEY_BUTTONZ] = PAD_TRIGGER_R; config.pad_keymap[i][KEY_MODE] = PAD_TRIGGER_Z; config.pad_keymap[i][KEY_MENU] = PAD_TRIGGER_Z | PAD_BUTTON_RIGHT; } #ifdef HW_RVL for (i=0; i<4; i++) { /* Wiimote (horizontal) */ config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONA] = WPAD_BUTTON_A; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONB] = WPAD_BUTTON_1; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONC] = WPAD_BUTTON_2; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_START] = WPAD_BUTTON_PLUS; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONX] = 0; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONY] = 0; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_BUTTONZ] = 0; config.wpad_keymap[i*3 + WPAD_EXP_NONE][KEY_MODE] = 0; /* Wiimote + Nunchuk */ config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONA] = WPAD_NUNCHUK_BUTTON_Z; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONB] = WPAD_BUTTON_B; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONC] = WPAD_BUTTON_A; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_START] = WPAD_BUTTON_PLUS; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONX] = WPAD_NUNCHUK_BUTTON_C; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONY] = WPAD_BUTTON_1; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_BUTTONZ] = WPAD_BUTTON_2; config.wpad_keymap[i*3 + WPAD_EXP_NUNCHUK][KEY_MODE] = WPAD_BUTTON_MINUS; /* Classic Controller */ config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONA] = WPAD_CLASSIC_BUTTON_Y; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONB] = WPAD_CLASSIC_BUTTON_B; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONC] = WPAD_CLASSIC_BUTTON_A; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_START] = WPAD_CLASSIC_BUTTON_PLUS; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONX] = WPAD_CLASSIC_BUTTON_ZL; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONY] = WPAD_CLASSIC_BUTTON_ZR; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_BUTTONZ] = WPAD_CLASSIC_BUTTON_X; config.wpad_keymap[i*3 + WPAD_EXP_CLASSIC][KEY_MODE] = WPAD_CLASSIC_BUTTON_MINUS; } #endif /* Default player inputs */ for (i=0; iexp.classic.rjs.max.x != 255) { /* Wiimote is available */ config.input[i].device = 1; config.input[i].port = j; } } } } } #endif /* Autodetect Gamecube Controllers */ VIDEO_WaitVSync(); exp = PAD_ScanPads(); for (i=0; i<4; i++) { /* check if Gamecube Controller is connected */ if (exp & (1 << i)) { for (j=0; j 0) { wpad_update(config.input[player].port, i, config.input[player].device - 1); } #endif /* increment player index */ player ++; } } /* Update RAM patches */ RAMCheatUpdate(); } /* Menu inputs update function */ void gx_input_UpdateMenu(void) { /* Check if inputs update are disabled */ if (inputs_disabled) return; /* PAD status update */ PAD_ScanPads(); /* PAD pressed keys */ s16 pp = PAD_ButtonsDown(0); /* PAD held keys (direction/selection) */ s16 hp = PAD_ButtonsHeld(0) & PAD_BUTTONS_HELD; /* PAD analog sticks (handled as PAD held direction keys) */ s8 x = PAD_StickX(0); s8 y = PAD_StickY(0); if (x > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_RIGHT; else if (x < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_LEFT; else if (y > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_UP; else if (y < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_DOWN; #ifdef HW_RVL /* WPAD status update */ WPAD_ScanPads(); WPADData *data = WPAD_Data(0); /* WPAD pressed keys */ u32 pw = data->btns_d; /* WPAD held keys (direction/selection) */ u32 hw = data->btns_h & WPAD_BUTTONS_HELD; /* WPAD analog sticks (handled as PAD held direction keys) */ x = wpad_StickX(data, 0); y = wpad_StickY(data, 0); if (x > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_RIGHT; else if (x < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_LEFT; else if (y > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_UP; else if (y < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_DOWN; #endif /* check if any direction/selection key is being held or just being pressed/released */ #ifdef HW_RVL if (pp||pw) held_cnt = 0; else if (hp||hw) held_cnt++; else held_cnt = 0; #else if (pp) held_cnt = 0; else if (hp) held_cnt++; else held_cnt = 0; #endif /* initial delay (prevents triggering to start immediately) */ if (held_cnt > HELD_DELAY) { /* key triggering */ pp |= hp; #ifdef HW_RVL pw |= hw; #endif /* delay until next triggering (adjusts direction/selection update speed) */ held_cnt -= HELD_SPEED; } #ifdef HW_RVL /* Wiimote & Classic Controller direction keys */ WPAD_IR(0, &m_input.ir); if (m_input.ir.valid) { /* Wiimote is handled vertically */ if (pw & (WPAD_BUTTON_UP|WPAD_CLASSIC_BUTTON_UP)) pp |= PAD_BUTTON_UP; else if (pw & (WPAD_BUTTON_DOWN|WPAD_CLASSIC_BUTTON_DOWN)) pp |= PAD_BUTTON_DOWN; else if (pw & (WPAD_BUTTON_LEFT|WPAD_CLASSIC_BUTTON_LEFT)) pp |= PAD_BUTTON_LEFT; else if (pw & (WPAD_BUTTON_RIGHT|WPAD_CLASSIC_BUTTON_RIGHT)) pp |= PAD_BUTTON_RIGHT; /* Wiimote pointer user calibration */ m_input.ir.x += config.calx; m_input.ir.y += config.caly; } else { /* Wiimote is handled horizontally */ if (pw & (WPAD_BUTTON_UP|WPAD_CLASSIC_BUTTON_LEFT)) pp |= PAD_BUTTON_LEFT; else if (pw & (WPAD_BUTTON_DOWN|WPAD_CLASSIC_BUTTON_RIGHT)) pp |= PAD_BUTTON_RIGHT; else if (pw & (WPAD_BUTTON_LEFT|WPAD_CLASSIC_BUTTON_DOWN)) pp |= PAD_BUTTON_DOWN; else if (pw & (WPAD_BUTTON_RIGHT|WPAD_CLASSIC_BUTTON_UP)) pp |= PAD_BUTTON_UP; } /* WPAD button keys */ if (pw & (WPAD_BUTTON_2|WPAD_BUTTON_A|WPAD_CLASSIC_BUTTON_A)) pp |= PAD_BUTTON_A; if (pw & (WPAD_BUTTON_1|WPAD_BUTTON_B|WPAD_CLASSIC_BUTTON_B)) pp |= PAD_BUTTON_B; if (pw & (WPAD_BUTTON_HOME|WPAD_CLASSIC_BUTTON_HOME)) pp |= PAD_TRIGGER_Z; if (pw & (WPAD_BUTTON_PLUS|WPAD_CLASSIC_BUTTON_PLUS|WPAD_CLASSIC_BUTTON_FULL_L)) pp |= PAD_TRIGGER_L; if (pw & (WPAD_BUTTON_MINUS|WPAD_CLASSIC_BUTTON_MINUS|WPAD_CLASSIC_BUTTON_FULL_L)) pp |= PAD_TRIGGER_R; #endif /* Update menu inputs */ m_input.keys = pp; } gx/gx_input.h000664 001750 001750 00000005276 12702465756 014356 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_input.c * * Genesis Plus GX input support * * Copyright Eke-Eke (2007-2015) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GC_INPUT_H_ #define _GC_INPUT_H_ #define osd_input_update() gx_input_UpdateEmu() /* max. supported inputs */ #ifdef HW_RVL #define MAX_INPUTS 8 #else #define MAX_INPUTS 4 #endif /* Configurable keys */ #define MAX_KEYS 8 /* Key configuration structure */ typedef struct { s8 device; u8 port; u8 padtype; } t_input_config; extern void gx_input_Init(void); extern int gx_input_FindDevices(void); extern void gx_input_SetDefault(void); extern void gx_input_Config(u8 chan, u8 device, u8 type); extern void gx_input_UpdateEmu(void); extern void gx_input_UpdateMenu(void); #endif gcw0/main.c000664 001750 001750 00000247734 12702465756 013671 0ustar00sergiosergio000000 000000 #ifdef __WIN32__ #include #else #define MessageBox(owner, text, caption, type) printf("%s: %s\n", caption, text) #endif #include "SDL.h" #include "SDL_thread.h" #include "shared.h" #include "sms_ntsc.h" #include "md_ntsc.h" #include "utils.h" #ifdef GCWZERO #include #include #include static int do_once = 1; static int gcw0_w = 320; static int gcw0_h = 240; static int gotomenu; static int show_lightgun; time_t current_time; const char *cursor[4]= { "./CLASSIC_01_RED.png", //doesn't flash (for epileptics it's default) "./CLASSIC_02.png", //square flashing red and white "./CLASSIC_01.png", "./SQUARE_02.png", }; #define JOY_DEADZONE 1000 #endif #ifdef GCWZERO #define SOUND_FREQUENCY 44100 #else #define SOUND_FREQUENCY 48000 #endif #define SOUND_SAMPLES_SIZE 2048 #define VIDEO_WIDTH 320 #define VIDEO_HEIGHT 240 int joynum = 0; int log_error = 0; int debug_on = 0; int turbo_mode = 0; int use_sound = 1; int fullscreen = 1; /* SDL_FULLSCREEN */ char rom_filename[256]; /* sound */ struct { char* current_pos; char* buffer; int current_emulated_samples; } sdl_sound; static uint8 brm_format[0x40] = { 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f }; static short soundframe[SOUND_SAMPLES_SIZE]; static void sdl_sound_callback(void *userdata, Uint8 *stream, int len) { if(sdl_sound.current_emulated_samples < len) { memset(stream, 0, len); } else { memcpy(stream, sdl_sound.buffer, len); /* loop to compensate desync */ do { sdl_sound.current_emulated_samples -= len; } while(sdl_sound.current_emulated_samples > 2 * len); memcpy(sdl_sound.buffer, sdl_sound.current_pos - sdl_sound.current_emulated_samples, sdl_sound.current_emulated_samples); sdl_sound.current_pos = sdl_sound.buffer + sdl_sound.current_emulated_samples; } } static int sdl_sound_init() { int n; SDL_AudioSpec as_desired, as_obtained; if(SDL_Init(SDL_INIT_AUDIO) < 0) { MessageBox(NULL, "SDL Audio initialization failed", "Error", 0); return 0; } as_desired.freq = SOUND_FREQUENCY; as_desired.format = AUDIO_S16LSB; as_desired.channels = 2; as_desired.samples = SOUND_SAMPLES_SIZE; as_desired.callback = sdl_sound_callback; if(SDL_OpenAudio(&as_desired, &as_obtained) == -1) { MessageBox(NULL, "SDL Audio open failed", "Error", 0); return 0; } if(as_desired.samples != as_obtained.samples) { MessageBox(NULL, "SDL Audio wrong setup", "Error", 0); return 0; } sdl_sound.current_emulated_samples = 0; n = SOUND_SAMPLES_SIZE * 2 * sizeof(short) * 20; sdl_sound.buffer = (char*)malloc(n); if(!sdl_sound.buffer) { MessageBox(NULL, "Can't allocate audio buffer", "Error", 0); return 0; } memset(sdl_sound.buffer, 0, n); sdl_sound.current_pos = sdl_sound.buffer; return 1; } static void sdl_sound_update(enabled) { int size = audio_update(soundframe) * 2; if (enabled) { int i; short *out; SDL_LockAudio(); out = (short*)sdl_sound.current_pos; for(i = 0; i < size; i++) { *out++ = soundframe[i]; } sdl_sound.current_pos = (char*)out; sdl_sound.current_emulated_samples += size * sizeof(short); SDL_UnlockAudio(); } } static void sdl_sound_close() { SDL_PauseAudio(1); SDL_CloseAudio(); if (sdl_sound.buffer) free(sdl_sound.buffer); } #ifdef GCWZERO //A-stick support static void sdl_joystick_init() { if(SDL_Init(SDL_INIT_JOYSTICK) < 0) { MessageBox(NULL, "SDL Joystick initialization failed", "Error", 0); return 0; } else MessageBox(NULL, "SDL Joystick initialisation successful", "Success", 0); return 1; } #endif /* video */ md_ntsc_t *md_ntsc; sms_ntsc_t *sms_ntsc; struct { SDL_Surface* surf_screen; SDL_Surface* surf_bitmap; SDL_Rect srect; SDL_Rect drect; Uint32 frames_rendered; } sdl_video; static int sdl_video_init() { if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { MessageBox(NULL, "SDL Video initialization failed", "Error", 0); return; } #ifdef GCWZERO sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_HWSURFACE | #else sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_HWSURFACE | fullscreen | #endif #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF #else SDL_DOUBLEBUF #endif ); sdl_video.surf_bitmap = SDL_CreateRGBSurface(SDL_HWSURFACE, 720, 576, 16, 0, 0, 0, 0); sdl_video.frames_rendered = 0; SDL_ShowCursor(0); return; } static void sdl_video_update() { static int test; if (system_hw == SYSTEM_MCD) { #ifdef GCWZERO if (test >= config.gcw0_frameskip) // >= in case frameskip has just been lowered { system_frame_scd(0); //render frame test = 0; } else { system_frame_scd(1); //skip frame render test ++; } #else system_frame_scd(0); #endif } else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) #ifdef GCWZERO { if (test >= config.gcw0_frameskip) { system_frame_gen(0); test = 0; } else { system_frame_gen(1); test ++; } #else system_frame_gen(0); #endif } else { #ifdef GCWZERO if (test >= config.gcw0_frameskip) { system_frame_sms(0); test = 0; } else { system_frame_sms(1); test ++; } #else system_frame_sms(0); #endif } /* viewport size changed */ if(bitmap.viewport.changed & 1) { bitmap.viewport.changed &= ~1; /* source bitmap */ #ifdef GCWZERO //remove left bar bug with SMS roms if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) { if (config.smsmaskleftbar) sdl_video.srect.x = 8; else sdl_video.srect.x = 0; } else { sdl_video.srect.x = 0; } #else sdl_video.srect.x = 0; #endif sdl_video.srect.y = 0; sdl_video.srect.w = bitmap.viewport.w+2*bitmap.viewport.x; sdl_video.srect.h = bitmap.viewport.h+2*bitmap.viewport.y; if (sdl_video.srect.w > VIDEO_WIDTH) { #ifdef GCWZERO if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) { if (config.smsmaskleftbar) sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2 + 8; else sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2; sdl_video.srect.w = VIDEO_WIDTH; } else { sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2; sdl_video.srect.w = VIDEO_WIDTH; } #else sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2; sdl_video.srect.w = VIDEO_WIDTH; #endif } if (sdl_video.srect.h > VIDEO_HEIGHT) { sdl_video.srect.y = (sdl_video.srect.h - VIDEO_HEIGHT) / 2; sdl_video.srect.h = VIDEO_HEIGHT; } /* destination bitmap */ sdl_video.drect.w = sdl_video.srect.w; sdl_video.drect.h = sdl_video.srect.h; sdl_video.drect.x = (VIDEO_WIDTH - sdl_video.drect.w) / 2; sdl_video.drect.y = (VIDEO_HEIGHT - sdl_video.drect.h) / 2; /* clear destination surface */ SDL_FillRect(sdl_video.surf_screen, 0, 0); #ifdef GCWZERO //triple buffering so stop flicker SDL_Flip(sdl_video.surf_screen); SDL_FillRect(sdl_video.surf_screen, 0, 0); SDL_Flip(sdl_video.surf_screen); SDL_FillRect(sdl_video.surf_screen, 0, 0); #endif #if 0 if (config.render && (interlaced || config.ntsc)) rect.h *= 2; if (config.ntsc) rect.w = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(rect.w) : SMS_NTSC_OUT_WIDTH(rect.w); if (config.ntsc) { sms_ntsc = (sms_ntsc_t *)malloc(sizeof(sms_ntsc_t)); md_ntsc = (md_ntsc_t *)malloc(sizeof(md_ntsc_t)); switch (config.ntsc) { case 1: sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite); break; case 2: sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo); break; case 3: sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); break; } } else { if (sms_ntsc) { free(sms_ntsc); sms_ntsc = NULL; } if (md_ntsc) { free(md_ntsc); md_ntsc = NULL; } } #endif } //DK IPU scaling for gg/sms roms #ifdef GCWZERO if (config.gcw0_fullscreen) { if( (gcw0_w != sdl_video.drect.w) || (gcw0_h != sdl_video.drect.h) ) { if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) { if (config.smsmaskleftbar) { sdl_video.srect.w = sdl_video.srect.w - 8; sdl_video.drect.w = sdl_video.srect.w; sdl_video.drect.x = 4; } else { sdl_video.srect.w = sdl_video.srect.w ; sdl_video.drect.w = sdl_video.srect.w; sdl_video.drect.x = 0; } } else { sdl_video.drect.x = 0; sdl_video.drect.w = sdl_video.srect.w; } sdl_video.drect.h = sdl_video.srect.h; sdl_video.drect.y = 0; gcw0_w=sdl_video.drect.w; gcw0_h=sdl_video.drect.h; if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) { sdl_video.surf_screen = SDL_SetVideoMode(256,gcw0_h, 16, SDL_HWSURFACE | #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF); #else SDL_DOUBLEBUF); #endif } else { sdl_video.surf_screen = SDL_SetVideoMode(gcw0_w,gcw0_h, 16, SDL_HWSURFACE | #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF); #else SDL_DOUBLEBUF); #endif } } } if (show_lightgun && !config.gcw0_fullscreen) // hack to remove cursor corruption of over game screen edge { SDL_FillRect(sdl_video.surf_screen, 0, 0); } #endif SDL_BlitSurface(sdl_video.surf_bitmap, &sdl_video.srect, sdl_video.surf_screen, &sdl_video.drect); //SDL_UpdateRect(sdl_video.surf_screen, 0, 0, 0, 0); #ifdef GCWZERO // Add scanlines to Game Gear games if requested if ( (system_hw == SYSTEM_GG) && config.gg_scanlines) { SDL_Surface *scanlinesSurface; scanlinesSurface = IMG_Load("./scanlines.png"); SDL_BlitSurface(scanlinesSurface, NULL, sdl_video.surf_screen, &sdl_video.drect); SDL_FreeSurface(scanlinesSurface); } if (show_lightgun) { // Remove previous cursor from black bars if (config.gcw0_fullscreen) { if (config.smsmaskleftbar) { if(system_hw == SYSTEM_SMS2) { SDL_Rect srect; srect.x = 0; srect.y = 0; srect.w = 4; srect.h = 192; SDL_FillRect(sdl_video.surf_screen, &srect, SDL_MapRGB(sdl_video.surf_screen->format, 0, 0, 0)); srect.x = 252; SDL_FillRect(sdl_video.surf_screen, &srect, SDL_MapRGB(sdl_video.surf_screen->format, 0, 0, 0)); } } } /* get mouse coordinates (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); SDL_Rect lrect; lrect.x = x-7; lrect.y = y-7; lrect.w = 15; lrect.h = 15; SDL_Surface *lightgunSurface; lightgunSurface = IMG_Load(cursor[config.cursor]); static lightgun_af = 0; SDL_Rect srect; srect.y = 0; srect.w = 15; srect.h = 15; //only show cursor if movement occurred within 3 seconds. time_t current_time2; current_time2 = time(NULL); if (lightgun_af >= 10) { srect.x = 0; if((current_time2 - current_time) < 3) SDL_BlitSurface(lightgunSurface, &srect, sdl_video.surf_screen, &lrect); } else { if (config.cursor != 0) srect.x = 15; else srect.x = 0; if((current_time2 - current_time) < 3) SDL_BlitSurface(lightgunSurface, &srect, sdl_video.surf_screen, &lrect); } lightgun_af++; if (lightgun_af == 20) lightgun_af = 0; SDL_FreeSurface(lightgunSurface); } //show_lightgun #endif SDL_Flip(sdl_video.surf_screen); ++sdl_video.frames_rendered; } static void sdl_video_close() { if (sdl_video.surf_bitmap) SDL_FreeSurface(sdl_video.surf_bitmap); if (sdl_video.surf_screen) SDL_FreeSurface(sdl_video.surf_screen); } /* Timer Sync */ struct { SDL_sem* sem_sync; unsigned ticks; } sdl_sync; static Uint32 sdl_sync_timer_callback(Uint32 interval) { #ifdef GCWZERO if (!gotomenu) { SDL_SemPost(sdl_sync.sem_sync); sdl_sync.ticks++; } #else SDL_SemPost(sdl_sync.sem_sync); sdl_sync.ticks++; #endif if (sdl_sync.ticks == (vdp_pal ? 50 : 20)) { SDL_Event event; SDL_UserEvent userevent; userevent.type = SDL_USEREVENT; userevent.code = vdp_pal ? (sdl_video.frames_rendered / 3) : sdl_video.frames_rendered; userevent.data1 = NULL; userevent.data2 = NULL; sdl_sync.ticks = sdl_video.frames_rendered = 0; event.type = SDL_USEREVENT; event.user = userevent; SDL_PushEvent(&event); } return interval; } static int sdl_sync_init() { if(SDL_InitSubSystem(SDL_INIT_TIMER|SDL_INIT_EVENTTHREAD) < 0) { MessageBox(NULL, "SDL Timer initialization failed", "Error", 0); return 0; } sdl_sync.sem_sync = SDL_CreateSemaphore(0); sdl_sync.ticks = 0; return 1; } static void sdl_sync_close() { if(sdl_sync.sem_sync) SDL_DestroySemaphore(sdl_sync.sem_sync); } static const uint16 vc_table[4][2] = { /* NTSC, PAL */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0xEA , 0x102}, /* Mode 5 (224 lines) */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0x106, 0x10A} /* Mode 5 (240 lines) */ }; static int sdl_control_update(SDLKey keystate) { switch (keystate) { #ifndef GCWZERO case SDLK_TAB: { system_reset(); break; } #endif case SDLK_F1: { if (SDL_ShowCursor(-1)) SDL_ShowCursor(0); else SDL_ShowCursor(1); break; } case SDLK_F2: { if (fullscreen) fullscreen = 0; else fullscreen = SDL_FULLSCREEN; sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_SWSURFACE | fullscreen); break; } case SDLK_F3: { if (config.bios == 0) config.bios = 3; else if (config.bios == 3) config.bios = 1; break; } case SDLK_F4: { if (!turbo_mode) use_sound ^= 1; break; } case SDLK_F5: { log_error ^= 1; break; } case SDLK_F6: { if (!use_sound) { turbo_mode ^=1; sdl_sync.ticks = 0; } break; } case SDLK_F7: { char save_state_file[256]; sprintf(save_state_file,"%s/%X.gp0", get_save_directory(), rominfo.realchecksum); FILE *f = fopen(save_state_file,"rb"); if (f) { uint8 buf[STATE_SIZE]; fread(&buf, STATE_SIZE, 1, f); state_load(buf); fclose(f); } break; } case SDLK_F8: { char save_state_file[256]; sprintf(save_state_file,"%s/%X.gp0", get_save_directory(), rominfo.realchecksum); FILE *f = fopen(save_state_file,"wb"); if (f) { uint8 buf[STATE_SIZE]; int len = state_save(buf); fwrite(&buf, len, 1, f); fclose(f); } break; } case SDLK_F9: { config.region_detect = (config.region_detect + 1) % 5; get_region(0); /* framerate has changed, reinitialize audio timings */ audio_init(snd.sample_rate, 0); /* system with region BIOS should be reinitialized */ if ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && (config.bios & 1))) { system_init(); system_reset(); } else { /* reinitialize I/O region register */ if (system_hw == SYSTEM_MD) { io_reg[0x00] = 0x20 | region_code | (config.bios & 1); } else { io_reg[0x00] = 0x80 | (region_code >> 1); } /* reinitialize VDP */ if (vdp_pal) { status |= 1; lines_per_frame = 313; } else { status &= ~1; lines_per_frame = 262; } /* reinitialize VC max value */ switch (bitmap.viewport.h) { case 192: vc_max = vc_table[0][vdp_pal]; break; case 224: vc_max = vc_table[1][vdp_pal]; break; case 240: vc_max = vc_table[3][vdp_pal]; break; } } break; } case SDLK_F10: { gen_reset(0); break; } case SDLK_F11: { config.overscan = (config.overscan + 1) & 3; if ((system_hw == SYSTEM_GG) && !config.gg_extra) { bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; } else { bitmap.viewport.x = (config.overscan & 2) * 7; } bitmap.viewport.changed = 3; break; } case SDLK_F12: { joynum = (joynum + 1) % MAX_DEVICES; while (input.dev[joynum] == NO_DEVICE) { joynum = (joynum + 1) % MAX_DEVICES; } break; } case SDLK_ESCAPE: { #ifndef GCWZERO /* exit */ return 0; #endif } default: break; } return 1; } static void shutdown() { FILE *fp; if (system_hw == SYSTEM_MCD) { /* save internal backup RAM (if formatted) */ char brm_file[256]; if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { sprintf(brm_file,"%s/", get_save_directory(), "scd.brm"); fp = fopen(brm_file, "wb"); if (fp!=NULL) { fwrite(scd.bram, 0x2000, 1, fp); fclose(fp); } } /* save cartridge backup RAM (if formatted) */ if (scd.cartridge.id) { if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { sprintf(brm_file,"%s/", get_save_directory(), "cart.brm"); fp = fopen(brm_file, "wb"); if (fp!=NULL) { fwrite(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); fclose(fp); } } } } if (sram.on) { /* save SRAM */ char save_file[256]; if (rom_filename[0] != '\0') { sprintf(save_file,"%s/%s.srm", get_save_directory(), rom_filename); fp = fopen(save_file, "wb"); if (fp!=NULL) { fwrite(sram.sram,0x10000,1, fp); fclose(fp); } } } audio_shutdown(); error_shutdown(); sdl_video_close(); sdl_sound_close(); sdl_sync_close(); SDL_Quit(); } #ifdef GCWZERO //menu! static int gcw0menu(void) { SDL_PauseAudio(1); /* display menu */ // change video mode sdl_video.surf_screen = SDL_SetVideoMode(320,240, 32, SDL_HWSURFACE | #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF); #else SDL_DOUBLEBUF); #endif // blank screen SDL_FillRect(sdl_video.surf_screen, 0, 0); enum {MAINMENU = 0, GRAPHICS_OPTIONS = 1, REMAP_OPTIONS = 2, SAVE_STATE = 3, LOAD_STATE = 4, MISC_OPTIONS = 5}; static int menustate = MAINMENU; // Menu text const char *gcw0menu_mainlist[9]= { "Resume game", "Save state", "Load state", "Graphics options", "Remap buttons", "Misc. Options", "", //spacer "Reset", "Quit" }; const char *gcw0menu_gfxlist[6]= { "Scaling", "Keep aspect ratio", "Scanlines (GG)", "Mask left bar (SMS)", "Frameskip", "Return to main menu", }; const char *gcw0menu_numericlist[4]= { "0", "1", "2", "3", }; const char *gcw0menu_onofflist[2]= { "Off", "On", }; const char *gcw0menu_remapoptionslist[9]= { "A", "B", "C", "X", "Y", "Z", "Start", "Mode", "Return to main menu", }; const char *gcw0menu_savestate[10]= { "Back to main menu", "Save state 1 (Quicksave)", "Save state 2", "Save state 3", "Save state 4", "Save state 5", "Save state 6", "Save state 7", "Save state 8", "Save state 9", }; const char *gcw0menu_loadstate[10]= { "Back to main menu", "Load state 1 (Quickload)", "Load state 2", "Load state 3", "Load state 4", "Load state 5", "Load state 6", "Load state 7", "Load state 8", "Load state 9", }; const char *gcw0menu_misc[7]= { "Back to main menu", "Resume on Save/Load", "A-stick", "Lock-on", "FM sound (SMS)", "Lightgun speed", "Lightgun Cursor", }; const char *lock_on_desc[4]= { " Off", " Game Genie", " Action Replay", "Sonic & Knuckles", }; // start menu loop bitmap.viewport.changed=1; //change screen res if required while(gotomenu) { // set up menu surface SDL_Surface *menuSurface = NULL; menuSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, 320, 240, 16, 0, 0, 0, 0); // identify system we are using to show correct background just cos we can :P if ( system_hw == SYSTEM_PICO) //Sega Pico { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./PICO.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } else if ( (system_hw == SYSTEM_SG) || (system_hw == SYSTEM_SGII) ) //SG-1000 I&II { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./SG1000.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } else if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || ( system_hw == SYSTEM_GGMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) //Mark III & Sega Master System I&II & Megadrive with power base converter { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./SMS.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } else if (system_hw == SYSTEM_GG) { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./GG.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } else if ( system_hw == SYSTEM_MD) //Megadrive { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./MD.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } else if ( system_hw == SYSTEM_MCD) //MegaCD { SDL_Surface *tempbgSurface; SDL_Surface *bgSurface; tempbgSurface = IMG_Load( "./MCD.png" ); bgSurface = SDL_DisplayFormat( tempbgSurface ); SDL_BlitSurface(bgSurface, NULL, menuSurface, NULL); SDL_FreeSurface(tempbgSurface); SDL_FreeSurface(bgSurface); } // show menu TTF_Init(); TTF_Font *ttffont = NULL; SDL_Color text_color = {180, 180, 180}; SDL_Color selected_text_color = {23, 86, 155}; //selected colour = Sega blue ;) SDL_Surface *textSurface; int i; static int selectedoption = 0; // Fill menu box SDL_Surface *MenuBackground; if (menustate == REMAP_OPTIONS) { MenuBackground = SDL_CreateRGBSurface(SDL_HWSURFACE, 320, 185, 16, 0, 0, 0, 0); SDL_Rect rect; rect.x = 0; rect.y = 35; rect.w = 320; rect.h = 185; SDL_FillRect(MenuBackground, 0, 0); SDL_SetAlpha(MenuBackground, SDL_SRCALPHA, 50); SDL_BlitSurface(MenuBackground, NULL, menuSurface, &rect); SDL_FreeSurface(MenuBackground); } else { MenuBackground = SDL_CreateRGBSurface(SDL_HWSURFACE, 180, 185, 16, 0, 0, 0, 0); SDL_Rect rect; rect.x = 60; rect.y = 35; rect.w = 180; rect.h = 185; SDL_FillRect(MenuBackground, 0, 0); SDL_SetAlpha(MenuBackground, SDL_SRCALPHA, 50); SDL_BlitSurface(MenuBackground, NULL, menuSurface, &rect); SDL_FreeSurface(MenuBackground); } // Show title ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); SDL_Rect destination; destination.x = 80; destination.y = 40; destination.w = 100; destination.h = 50; textSurface = TTF_RenderText_Solid(ttffont, "Genesis Plus GX", text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); TTF_CloseFont (ttffont); if (menustate == MAINMENU) { //there's no need to open/close font each cycle :P ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); for(i=0; i<9; i++) { SDL_Rect destination; destination.x = 80; destination.y = 70+(15*i); destination.w = 100; destination.h = 50; if (i == selectedoption) textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_mainlist[i], selected_text_color); else textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_mainlist[i], text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } TTF_CloseFont (ttffont); } else if (menustate == GRAPHICS_OPTIONS) { ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); for(i=0; i<6; i++) { SDL_Rect destination; destination.x = 80; destination.y = 70+(15*i); destination.w = 100; destination.h = 50; if ((i+10) == selectedoption) textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_gfxlist[i], selected_text_color); else textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_gfxlist[i], text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } /* Display On/Off */ SDL_Rect destination; destination.x = 220; destination.w = 100; destination.h = 50; // Scaling destination.y = 70+(15*0); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.gcw0_fullscreen], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Aspect ratio destination.y = 70+(15*1); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.keepaspectratio], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Scanlines destination.y = 70+(15*2); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.gg_scanlines], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Mask left bar destination.y = 70+(15*3); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.smsmaskleftbar], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Frameskip destination.y = 70+(15*4); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_numericlist[config.gcw0_frameskip], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); TTF_CloseFont (ttffont); } else if (menustate == REMAP_OPTIONS) { char* remap_text[256]; ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); sprintf(remap_text, "%s%25s", "GenPlus", "GCW-Zero"); SDL_Rect destination = {30, 60, 100, 50}; textSurface = TTF_RenderText_Solid(ttffont, remap_text, text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); for(i=0; i < 9; i++) { if (i < 8) { sprintf(remap_text, "%-5s %-7s", gcw0menu_remapoptionslist[i], gcw0_get_key_name(config.buttons[i])); } else { sprintf(remap_text, gcw0menu_remapoptionslist[i]); // for return option } SDL_Rect destination = {30, 80 + (15 * i), 100, 50}; if ((i+20) == selectedoption) { textSurface = TTF_RenderText_Solid(ttffont, remap_text, selected_text_color); } else { textSurface = TTF_RenderText_Solid(ttffont, remap_text, text_color); } SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } TTF_CloseFont (ttffont); } else if (menustate == SAVE_STATE) { //Show saved BMP as background if available SDL_Surface* screenshot; char load_state_screenshot[256]; sprintf(load_state_screenshot,"%s/%s.%d.bmp", get_save_directory(), rom_filename, selectedoption-30); screenshot = SDL_LoadBMP(load_state_screenshot); if (screenshot) { SDL_Rect destination; destination.x = (320 - screenshot->w) / 2; destination.y = (240 - screenshot->h) / 2; destination.w = 320; destination.h = 240; SDL_BlitSurface(screenshot, NULL, menuSurface, &destination); // Fill menu box SDL_Surface *MenuBackground = SDL_CreateRGBSurface(SDL_HWSURFACE, 180, 185, 16, 0, 0, 0, 0); SDL_Rect rect; rect.x = 60; rect.y = 35; rect.w = 180; rect.h = 185; SDL_FillRect(MenuBackground, 0, 0); SDL_SetAlpha(MenuBackground, SDL_SRCALPHA, 180); SDL_BlitSurface(MenuBackground, NULL, menuSurface, &rect); SDL_FreeSurface(MenuBackground); } SDL_FreeSurface(screenshot); // Show title ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); SDL_Rect destination; destination.x = 80; destination.y = 40; destination.w = 100; destination.h = 50; textSurface = TTF_RenderText_Solid(ttffont, "Genesis Plus GX", text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); TTF_CloseFont (ttffont); ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); for(i=0; i<10; i++) { SDL_Rect destination; destination.x = 80; destination.y = 70+(15*i); destination.w = 100; destination.h = 50; if ((i+30) == selectedoption) textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_savestate[i], selected_text_color); else textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_savestate[i], text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } TTF_CloseFont (ttffont); } else if (menustate == LOAD_STATE) { //Show saved BMP as background if available SDL_Surface* screenshot; char load_state_screenshot[256]; sprintf(load_state_screenshot,"%s/%s.%d.bmp", get_save_directory(), rom_filename, selectedoption-40); screenshot = SDL_LoadBMP(load_state_screenshot); if (screenshot) { SDL_Rect destination; destination.x = (320 - screenshot->w) / 2; destination.y = (240 - screenshot->h) / 2; destination.w = 320; destination.h = 240; SDL_BlitSurface(screenshot, NULL, menuSurface, &destination); // Fill menu box SDL_Surface *MenuBackground = SDL_CreateRGBSurface(SDL_HWSURFACE, 180, 185, 16, 0, 0, 0, 0); SDL_Rect rect; rect.x = 60; rect.y = 35; rect.w = 180; rect.h = 185; SDL_FillRect(MenuBackground, 0, 0); SDL_SetAlpha(MenuBackground, SDL_SRCALPHA, 180); SDL_BlitSurface(MenuBackground, NULL, menuSurface, &rect); SDL_FreeSurface(MenuBackground); } SDL_FreeSurface(screenshot); // Show title ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); SDL_Rect destination; destination.x = 80; destination.y = 40; destination.w = 100; destination.h = 50; textSurface = TTF_RenderText_Solid(ttffont, "Genesis Plus GX", text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); TTF_CloseFont (ttffont); ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); for(i=0; i<10; i++) { SDL_Rect destination; destination.x = 80; destination.y = 70+(15*i); destination.w = 100; destination.h = 50; if ((i+40) == selectedoption) textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_loadstate[i], selected_text_color); else textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_loadstate[i], text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } TTF_CloseFont (ttffont); } else if (menustate == MISC_OPTIONS) { ttffont = TTF_OpenFont("./ProggyTiny.ttf", 16); for(i=0; i<7; i++) { SDL_Rect destination; destination.x = 80; destination.y = 70+(15*i); destination.w = 100; destination.h = 50; if ((i+50) == selectedoption) textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_misc[i], selected_text_color); else textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_misc[i], text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); } /* Display On/Off */ SDL_Rect destination; destination.x = 220; destination.w = 100; destination.h = 50; // Save/load autoresume destination.y = 70+(15*1); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.sl_autoresume], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // A-stick destination.y = 70+(15*2); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.a_stick], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); /* Display Lock-on Types */ destination.x = 142; destination.y = 70+(15*3); textSurface = TTF_RenderText_Solid(ttffont, lock_on_desc[config.lock_on], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // FM sound(SMS) destination.x = 220; destination.y = 70+(15*4); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_onofflist[config.ym2413], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Lightgun speed destination.x = 220; destination.y = 70+(15*5); textSurface = TTF_RenderText_Solid(ttffont, gcw0menu_numericlist[config.lightgun_speed], selected_text_color); SDL_BlitSurface(textSurface, NULL, menuSurface, &destination); SDL_FreeSurface(textSurface); // Lightgun Cursor destination.y = 70+(15*6); SDL_Surface *lightgunSurface; lightgunSurface = IMG_Load(cursor[config.cursor]); static lightgun_af_demo = 0; SDL_Rect srect; srect.x = 0; srect.y = 0; srect.w = 15; srect.h = 15; if (lightgun_af_demo >= 10 && config.cursor != 0) { srect.x = 15; } lightgun_af_demo++; if (lightgun_af_demo == 20) lightgun_af_demo = 0; SDL_BlitSurface(lightgunSurface, &srect, menuSurface, &destination); SDL_FreeSurface(lightgunSurface); TTF_CloseFont (ttffont); } //TODO other menu's go here /* Update display */ SDL_Rect dest; dest.w = 320; dest.h = 240; dest.x = 0; dest.y = 0; SDL_BlitSurface(menuSurface, NULL, sdl_video.surf_screen, &dest); SDL_FreeSurface(menuSurface); SDL_Flip(sdl_video.surf_screen); /* Check for user input */ SDL_EnableKeyRepeat(0,0); static int keyheld=0; SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: sdl_control_update(event.key.keysym.sym); break; case SDL_KEYUP: keyheld = 0; break; default: break; } } if (event.type == SDL_KEYDOWN && !keyheld) { keyheld++; uint8 *keystate2; keystate2 = SDL_GetKeyState(NULL); if(keystate2[SDLK_DOWN]) { if (selectedoption > 9 && selectedoption < 20) //graphics menu { selectedoption++; if (selectedoption == 16) selectedoption = 10; } else if (selectedoption > 19 && selectedoption < 30) //remap menu { selectedoption++; if (selectedoption == 29) selectedoption = 20; } else if (selectedoption > 29 && selectedoption < 40) //save menu { selectedoption++; if (selectedoption == 40) selectedoption = 30; } else if (selectedoption > 39 && selectedoption < 50) //load menu { selectedoption++; if (selectedoption == 50) selectedoption = 40; } else if (selectedoption > 49 && selectedoption < 60) //misc menu { selectedoption++; if (selectedoption == 57) selectedoption = 50; } else //main menu { selectedoption++; if (selectedoption == 6) selectedoption = 7; if (selectedoption > 8) selectedoption=0; } SDL_Delay(100); } else if(keystate2[SDLK_UP]) { if (selectedoption > 9 && selectedoption < 20) //graphics menu { selectedoption--; if (selectedoption == 9) selectedoption = 15; } else if (selectedoption > 19 && selectedoption < 30) //remap menu { selectedoption--; if (selectedoption == 19) selectedoption = 28; } else if (selectedoption > 29 && selectedoption < 40) //save menu { selectedoption--; if (selectedoption == 29) selectedoption = 39; } else if (selectedoption > 39 && selectedoption < 50) //load menu { selectedoption--; if (selectedoption == 39) selectedoption = 49; } else if (selectedoption > 49 && selectedoption < 60) //misc menu { selectedoption--; if (selectedoption == 49) selectedoption = 56; } else { //main menu if (!selectedoption) selectedoption = 8; else selectedoption--; if (selectedoption == 6) selectedoption = 5; } SDL_Delay(100); } else if(keystate2[SDLK_LALT] && menustate != REMAP_OPTIONS) //back to last menu or quit menu { if (menustate == GRAPHICS_OPTIONS) { menustate = MAINMENU; selectedoption = 3; SDL_Delay(130); } else if (menustate == SAVE_STATE) { menustate = MAINMENU; selectedoption = 1; SDL_Delay(130); } else if (menustate == LOAD_STATE) { menustate = MAINMENU; selectedoption = 2; SDL_Delay(130); } else if (menustate == MISC_OPTIONS) { menustate = MAINMENU; selectedoption = 5; SDL_Delay(130); } else if (menustate == MAINMENU) { gotomenu=0; selectedoption=0; SDL_Delay(130); break; } } else if(keystate2[SDLK_LCTRL] && menustate != REMAP_OPTIONS) { if (selectedoption == 0) { //Resume gotomenu=0; selectedoption=0; SDL_Delay(130); break; } else if (selectedoption == 1) //Save { menustate = SAVE_STATE; selectedoption = 30; SDL_Delay(130); } else if (selectedoption == 2) //Load { menustate = LOAD_STATE; selectedoption = 40; SDL_Delay(130); } else if (selectedoption == 3) //Graphics { menustate = GRAPHICS_OPTIONS; selectedoption = 10; SDL_Delay(200); } else if (selectedoption == 4) //Remap { menustate = REMAP_OPTIONS; selectedoption=20; SDL_Delay(200); } else if (selectedoption == 5) //Misc. { menustate = MISC_OPTIONS; selectedoption=50; SDL_Delay(200); } else if (selectedoption == 7) //Reset { gotomenu = 0; selectedoption=0; system_reset(); SDL_Delay(130); break; } else if (selectedoption == 8) //Quit { exit(0); SDL_Delay(130); break; } else if (selectedoption == 10) { //Scaling config.gcw0_fullscreen = !config.gcw0_fullscreen; SDL_Delay(130); config_save(); } else if (selectedoption == 11) { //Keep aspect ratio SDL_Delay(130); config.keepaspectratio = !config.keepaspectratio; config_save(); do_once = 1; } else if (selectedoption == 12) { //Scanlines (GG) SDL_Delay(130); config.gg_scanlines = !config.gg_scanlines; config_save(); } else if (selectedoption == 13) { //Mask left bar SDL_Delay(130); config.smsmaskleftbar = !config.smsmaskleftbar; config_save(); } else if (selectedoption == 14) { //Frameskip SDL_Delay(130); config.gcw0_frameskip ++; if (config.gcw0_frameskip == 4) config.gcw0_frameskip = 0; config_save(); } else if (selectedoption == 15) { //Back to main menu menustate = MAINMENU; selectedoption = 3; SDL_Delay(130); } else if (selectedoption == 30) { //Return to main menu menustate = MAINMENU; selectedoption = 1; SDL_Delay(130); } else if (selectedoption > 30 && selectedoption < 40) { //save to selected savestate char save_state_file[256]; sprintf(save_state_file,"%s/%s.gp%d", get_save_directory(), rom_filename, selectedoption-30); FILE *f = fopen(save_state_file,"wb"); if (f) { uint8 buf[STATE_SIZE]; int len = state_save(buf); fwrite(&buf, len, 1, f); fclose(f); } //Save BMP screenshot char save_state_screenshot[256]; sprintf(save_state_screenshot,"%s/%s.%d.bmp", get_save_directory(), rom_filename, selectedoption-30); SDL_Surface* screenshot; if (!config.gcw0_fullscreen) { screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, sdl_video.srect.w, sdl_video.srect.h, 16, 0, 0, 0, 0); SDL_Rect temp; temp.x = 0; temp.y = 0; temp.w = sdl_video.srect.w; temp.h = sdl_video.srect.h; SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp); SDL_SaveBMP(screenshot, save_state_screenshot); SDL_FreeSurface(screenshot); } else { screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, gcw0_w, gcw0_h, 16, 0, 0, 0, 0); SDL_Rect temp; temp.x = 0; temp.y = 0; temp.w = gcw0_w; temp.h = gcw0_h; SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp); SDL_SaveBMP(screenshot, save_state_screenshot); SDL_FreeSurface(screenshot); } SDL_Delay(250); if (config.sl_autoresume) { menustate = MAINMENU; selectedoption = 0; gotomenu = 0; break; } } else if (selectedoption == 40) { //return to main menu menustate = MAINMENU; selectedoption = 2; SDL_Delay(130); } else if (selectedoption > 40 && selectedoption < 50) { //load selected loadstate char save_state_file[256]; sprintf(save_state_file,"%s/%s.gp%d", get_save_directory(), rom_filename, selectedoption-40 ); FILE *f = fopen(save_state_file,"rb"); if (f) { uint8 buf[STATE_SIZE]; fread(&buf, STATE_SIZE, 1, f); state_load(buf); fclose(f); } if (config.sl_autoresume) { gotomenu = 0; menustate = MAINMENU; selectedoption = 0; SDL_Delay(250); break; } } else if (selectedoption == 50) { //return to main menu menustate = MAINMENU; selectedoption = 5; SDL_Delay(130); } else if (selectedoption == 51) { //toggle auto resume when save/loading config.sl_autoresume=!config.sl_autoresume; config_save(); SDL_Delay(130); } else if (selectedoption == 52) { //toggle A-Stick config.a_stick=!config.a_stick; config_save(); SDL_Delay(130); } else if (selectedoption == 53) { config.lock_on = (++config.lock_on == 4)? 0 : config.lock_on; config_save(); SDL_Delay(130); } else if (selectedoption == 54) { config.ym2413 = !config.ym2413; config_save(); SDL_Delay(130); } else if (selectedoption == 55) { config.lightgun_speed++; if (config.lightgun_speed == 4) config.lightgun_speed = 1; config_save(); SDL_Delay(130); } else if (selectedoption == 56) { config.cursor++; if (config.cursor == 4) config.cursor = 0; config_save(); SDL_Delay(130); } } else if(menustate == REMAP_OPTIONS) {// REMAP_OPTIONS needs to capture all input SDLKey pressed_key = 0; if (keystate2[SDLK_RETURN]) pressed_key = SDLK_RETURN; else if (keystate2[SDLK_LCTRL]) pressed_key = SDLK_LCTRL; else if (keystate2[SDLK_LALT]) pressed_key = SDLK_LALT; else if (keystate2[SDLK_LSHIFT]) pressed_key = SDLK_LSHIFT; else if (keystate2[SDLK_SPACE]) pressed_key = SDLK_SPACE; else if (keystate2[SDLK_TAB]) pressed_key = SDLK_TAB; else if (keystate2[SDLK_BACKSPACE]) pressed_key = SDLK_BACKSPACE; else if (keystate2[SDLK_ESCAPE]) pressed_key = SDLK_ESCAPE; if (pressed_key) { if (selectedoption == 20) { //button a remap config.buttons[A] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 21) { //button b remap config.buttons[B] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 22) { //button c remap config.buttons[C] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 23) { //button x remap config.buttons[X] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 24) { //button y remap config.buttons[Y] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 25) { //button z remap config.buttons[Z] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 26) { //button start remap config.buttons[START] = (pressed_key==SDLK_ESCAPE)? 0: pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 27) { //button mode remap config.buttons[MODE] = pressed_key; config_save(); SDL_Delay(130); selectedoption++; } else if (selectedoption == 28) { //return to main menu menustate = MAINMENU; selectedoption = 4; SDL_Delay(130); } } } } }//menu loop SDL_PauseAudio(0); if(config.gcw0_fullscreen) { if ( (system_hw == SYSTEM_MARKIII) || (system_hw == SYSTEM_SMS) || (system_hw == SYSTEM_SMS2) || (system_hw == SYSTEM_PBC) ) { gcw0_w=sdl_video.drect.w; gcw0_h=sdl_video.drect.h; sdl_video.surf_screen = SDL_SetVideoMode(256,gcw0_h, 16, SDL_HWSURFACE | #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF); #else SDL_DOUBLEBUF); #endif } else { sdl_video.drect.w = sdl_video.srect.w; sdl_video.drect.h = sdl_video.srect.h; sdl_video.drect.x = 0; sdl_video.drect.y = 0; gcw0_w=sdl_video.drect.w; gcw0_h=sdl_video.drect.h; sdl_video.surf_screen = SDL_SetVideoMode(gcw0_w,gcw0_h, 16, SDL_HWSURFACE | #ifdef SDL_TRIPLEBUF SDL_TRIPLEBUF); #else SDL_DOUBLEBUF); #endif } } else { SDL_FillRect(sdl_video.surf_screen, 0, 0); SDL_Flip(sdl_video.surf_screen); SDL_FillRect(sdl_video.surf_screen, 0, 0); SDL_Flip(sdl_video.surf_screen); SDL_FillRect(sdl_video.surf_screen, 0, 0); SDL_Flip(sdl_video.surf_screen); } return 1; } #endif int sdl_input_update(void) { uint8 *keystate = SDL_GetKeyState(NULL); /* reset input */ input.pad[joynum] = 0; if(show_lightgun) input.pad[4] = 0; //player2: switch (input.dev[4]) { case DEVICE_LIGHTGUN: show_lightgun = 1; /* get mouse coordinates (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); if (config.gcw0_fullscreen) { input.analog[4][0] = x; input.analog[4][1] = y; } else { input.analog[4][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2; input.analog[4][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2; } if (config.smsmaskleftbar) x += 8; /* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */ if(keystate[SDLK_ESCAPE]) input.pad[4] |= INPUT_START; default: break; } switch (input.dev[joynum]) { case DEVICE_LIGHTGUN: { #ifdef GCWZERO show_lightgun = 2; /* get mouse coordinates (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); if (config.gcw0_fullscreen) { input.analog[0][0] = x; input.analog[0][1] = y; } else { input.analog[0][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2; input.analog[0][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2; } if (config.smsmaskleftbar) x += 8; /* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_ESCAPE]) input.pad[0] |= INPUT_START; #else /* get mouse coordinates (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* X axis */ input.analog[joynum][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2; /* Y axis */ input.analog[joynum][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2; /* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; break; #endif } #ifndef GCWZERO case DEVICE_PADDLE: { /* get mouse (absolute values) */ int x; int state = SDL_GetMouseState(&x, NULL); /* Range is [0;256], 128 being middle position */ input.analog[joynum][0] = x * 256 /VIDEO_WIDTH; /* Button I -> 0 0 0 0 0 0 0 I*/ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; break; } case DEVICE_SPORTSPAD: { /* get mouse (relative values) */ int x,y; int state = SDL_GetRelativeMouseState(&x,&y); /* Range is [0;256] */ input.analog[joynum][0] = (unsigned char)(-x & 0xFF); input.analog[joynum][1] = (unsigned char)(-y & 0xFF); /* Buttons I & II -> 0 0 0 0 0 0 II I*/ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; break; } case DEVICE_MOUSE: { SDL_ShowCursor(1); /* get mouse (relative values) */ int x,y; int state = SDL_GetRelativeMouseState(&x,&y); /* Sega Mouse range is [-256;+256] */ input.analog[joynum][0] = x * 2; input.analog[joynum][1] = y * 2; /* Vertical movement is upsidedown */ if (!config.invert_mouse) input.analog[joynum][1] = 0 - input.analog[joynum][1]; /* Start,Left,Right,Middle buttons -> 0 0 0 0 START MIDDLE RIGHT LEFT */ if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; break; } case DEVICE_XE_1AP: { /* A,B,C,D,Select,START,E1,E2 buttons -> E1(?) E2(?) START SELECT(?) A B C D */ if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_START; if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_Y; if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_B; if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_X; if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_MODE; if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_Z; /* Left Analog Stick (bidirectional) */ if(keystate[SDLK_UP]) input.analog[joynum][1]-=2; else if(keystate[SDLK_DOWN]) input.analog[joynum][1]+=2; else input.analog[joynum][1] = 128; if(keystate[SDLK_LEFT]) input.analog[joynum][0]-=2; else if(keystate[SDLK_RIGHT]) input.analog[joynum][0]+=2; else input.analog[joynum][0] = 128; /* Right Analog Stick (unidirectional) */ if(keystate[SDLK_KP8]) input.analog[joynum+1][0]-=2; else if(keystate[SDLK_KP2]) input.analog[joynum+1][0]+=2; else if(keystate[SDLK_KP4]) input.analog[joynum+1][0]-=2; else if(keystate[SDLK_KP6]) input.analog[joynum+1][0]+=2; else input.analog[joynum+1][0] = 128; /* Limiters */ if (input.analog[joynum][0] > 0xFF) input.analog[joynum][0] = 0xFF; else if (input.analog[joynum][0] < 0) input.analog[joynum][0] = 0; if (input.analog[joynum][1] > 0xFF) input.analog[joynum][1] = 0xFF; else if (input.analog[joynum][1] < 0) input.analog[joynum][1] = 0; if (input.analog[joynum+1][0] > 0xFF) input.analog[joynum+1][0] = 0xFF; else if (input.analog[joynum+1][0] < 0) input.analog[joynum+1][0] = 0; if (input.analog[joynum+1][1] > 0xFF) input.analog[joynum+1][1] = 0xFF; else if (input.analog[joynum+1][1] < 0) input.analog[joynum+1][1] = 0; break; } case DEVICE_PICO: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = 0x3c + (x * (0x17c-0x03c+1)) / VIDEO_WIDTH; input.analog[0][1] = 0x1fc + (y * (0x2f7-0x1fc+1)) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_MMASK) pico_current = (pico_current + 1) & 7; if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_PICO_RED; if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_PICO_PEN; break; } case DEVICE_TEREBI: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = (x * 250) / VIDEO_WIDTH; input.analog[0][1] = (y * 250) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_B; break; } case DEVICE_GRAPHIC_BOARD: { /* get mouse (absolute values) */ int x,y; int state = SDL_GetMouseState(&x,&y); /* Calculate X Y axis values */ input.analog[0][0] = (x * 255) / VIDEO_WIDTH; input.analog[0][1] = (y * 255) / VIDEO_HEIGHT; /* Map mouse buttons to player #1 inputs */ if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_GRAPHIC_PEN; if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_GRAPHIC_MENU; if(state & SDL_BUTTON_MMASK) input.pad[0] |= INPUT_GRAPHIC_DO; break; } case DEVICE_ACTIVATOR: { if(keystate[SDLK_g]) input.pad[joynum] |= INPUT_ACTIVATOR_7L; if(keystate[SDLK_h]) input.pad[joynum] |= INPUT_ACTIVATOR_7U; if(keystate[SDLK_j]) input.pad[joynum] |= INPUT_ACTIVATOR_8L; if(keystate[SDLK_k]) input.pad[joynum] |= INPUT_ACTIVATOR_8U; } #endif default: { #ifdef GCWZERO if(keystate[config.buttons[A]]) input.pad[joynum] |= INPUT_A; if(keystate[config.buttons[B]]) input.pad[joynum] |= INPUT_B; if(keystate[config.buttons[C]]) input.pad[joynum] |= INPUT_C; if(keystate[config.buttons[START]]) input.pad[joynum] |= INPUT_START; if (show_lightgun == 1) { if(keystate[config.buttons[X]]) input.pad[4] |= INPUT_A; //player 2 if(keystate[config.buttons[Y]]) input.pad[4] |= INPUT_B; //player 2 if(keystate[config.buttons[Z]]) input.pad[4] |= INPUT_C; //player 2 } else if (show_lightgun == 2) { if(keystate[config.buttons[X]]) input.pad[4] |= INPUT_A; //player 2 if(keystate[config.buttons[Y]]) input.pad[4] |= INPUT_B; //player 2 if(keystate[config.buttons[Z]]) input.pad[4] |= INPUT_C; //player 2 } else { if(keystate[config.buttons[X]]) input.pad[joynum] |= INPUT_X; if(keystate[config.buttons[Y]]) input.pad[joynum] |= INPUT_Y; if(keystate[config.buttons[Z]]) input.pad[joynum] |= INPUT_Z; } if(keystate[config.buttons[MODE]]) input.pad[joynum] |= INPUT_MODE; if (keystate[SDLK_ESCAPE] && keystate[SDLK_RETURN]) { gotomenu=1; } if (keystate[SDLK_ESCAPE] && keystate[SDLK_TAB]) { //save to quicksave slot char save_state_file[256]; sprintf(save_state_file,"%s/%s.gp1", get_save_directory(), rom_filename); FILE *f = fopen(save_state_file,"wb"); if (f) { uint8 buf[STATE_SIZE]; int len = state_save(buf); fwrite(&buf, len, 1, f); fclose(f); } //Save BMP screenshot char save_state_screenshot[256]; sprintf(save_state_screenshot,"%s/%s.1.bmp", get_save_directory(), rom_filename); SDL_Surface* screenshot; if (!config.gcw0_fullscreen) { screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, sdl_video.srect.w, sdl_video.srect.h, 16, 0, 0, 0, 0); SDL_Rect temp; temp.x = 0; temp.y = 0; temp.w = sdl_video.srect.w; temp.h = sdl_video.srect.h; SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp); SDL_SaveBMP(screenshot, save_state_screenshot); SDL_FreeSurface(screenshot); } else { screenshot = SDL_CreateRGBSurface(SDL_HWSURFACE, gcw0_w, gcw0_h, 16, 0, 0, 0, 0); SDL_Rect temp; temp.x = 0; temp.y = 0; temp.w = gcw0_w; temp.h = gcw0_h; SDL_BlitSurface(sdl_video.surf_bitmap, &temp, screenshot, &temp); SDL_SaveBMP(screenshot, save_state_screenshot); SDL_FreeSurface(screenshot); } SDL_Delay(250); } if (keystate[SDLK_ESCAPE] && keystate[SDLK_BACKSPACE]) { //load quicksave slot char save_state_file[256]; sprintf(save_state_file,"%s/%s.gp1", get_save_directory(), rom_filename ); FILE *f = fopen(save_state_file,"rb"); if (f) { uint8 buf[STATE_SIZE]; fread(&buf, STATE_SIZE, 1, f); state_load(buf); fclose(f); } SDL_Delay(250); } #else if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_A; if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_B; if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_X; if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_Y; if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_Z; if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_MODE; #endif #ifdef GCWZERO //A-stick support static int MoveLeft = 0; static int MoveRight = 0; static int MoveUp = 0; static int MoveDown = 0; Sint16 x_move = 0; Sint16 y_move = 0; static int lg_left = 0; static int lg_right = 0; static int lg_up = 0; static int lg_down = 0; SDL_Joystick* joy; if(SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(0); x_move = SDL_JoystickGetAxis(joy, 0); y_move = SDL_JoystickGetAxis(joy, 1); } // Control lightgun with A-stick if activated if (show_lightgun) { lg_left = 0; lg_right = 0; lg_up = 0; lg_down = 0; if (x_move < -1000 || x_move > 1000) { if (x_move < -1000 ) lg_left = 1; if (x_move < -20000) lg_left = 3; if (x_move > 1000 ) lg_right = 1; if (x_move > 20000) lg_right = 3; current_time = time(NULL); //cursor disappears after 3 seconds... } if (y_move < -1000 || y_move > 1000) { if (y_move < -1000 ) lg_up = 1; if (y_move < -20000) lg_up = 3; if (y_move > 1000 ) lg_down = 1; if (y_move > 20000) lg_down = 3; current_time = time(NULL); } // Keep mouse within screen, wrap around! int x,y; int state = SDL_GetMouseState(&x,&y); if (!config.gcw0_fullscreen) { if ((x - lg_left ) < sdl_video.drect.x ) x = VIDEO_WIDTH - sdl_video.drect.x; if ((y - lg_up ) < sdl_video.drect.y ) y = VIDEO_HEIGHT - sdl_video.drect.y; // if ((x + lg_right) > 288) x = 288; // if ((y + lg_down ) > 216) y = 216; // if ((x + lg_right) > 320) x = 320; // if ((y + lg_down ) > 240) y = 240; if ((x + lg_right) > VIDEO_WIDTH - sdl_video.drect.x) x = sdl_video.drect.x; if ((y + lg_down ) > VIDEO_HEIGHT - sdl_video.drect.y) y = sdl_video.drect.y; // sdl_video.drect.x = (VIDEO_WIDTH - sdl_video.drect.w) / 2; // sdl_video.drect.y = (VIDEO_HEIGHT - sdl_video.drect.h) / 2; } else //scaling on { if ((x - lg_left) < 0) x = gcw0_w; if ((y - lg_up ) < 0) y = gcw0_h; if ((x + lg_right) > gcw0_w) x = 0; if ((y + lg_down ) > gcw0_h) y = 0; } SDL_WarpMouse( ( x+ ( ( lg_right - lg_left ) * config.lightgun_speed ) ) , ( y+ ( ( lg_down - lg_up ) * config.lightgun_speed ) ) ); } else // otherwise it's just mirroring the D-pad controls if (config.a_stick) { MoveLeft = 0; MoveRight = 0; MoveUp = 0; MoveDown = 0; if (x_move < -1000 || x_move > 1000) { if (x_move < -1000) MoveLeft = 1; if (x_move > 1000) MoveRight = 1; } if (y_move < -1000 || y_move > 1000) { if (y_move < -1000) MoveUp = 1; if (y_move > 1000) MoveDown = 1; } } if(show_lightgun == 1) //Genesis/MD D-pad controls player 2 { if(MoveUp == 1) input.pad[4] |= INPUT_UP; if(MoveDown == 1) input.pad[4] |= INPUT_DOWN; if(MoveLeft == 1) input.pad[4] |= INPUT_LEFT; if(MoveRight == 1) input.pad[4] |= INPUT_RIGHT; if(keystate[SDLK_UP] == 1) input.pad[joynum] |= INPUT_UP; if(keystate[SDLK_DOWN] == 1) input.pad[joynum] |= INPUT_DOWN; if(keystate[SDLK_LEFT] == 1) input.pad[joynum] |= INPUT_LEFT; if(keystate[SDLK_RIGHT]== 1) input.pad[joynum] |= INPUT_RIGHT; } else if(show_lightgun == 2) //SMS D-pad controls player 2 { if(MoveUp == 1) input.pad[joynum] |= INPUT_UP; if(MoveDown == 1) input.pad[joynum] |= INPUT_DOWN; if(MoveLeft == 1) input.pad[joynum] |= INPUT_LEFT; if(MoveRight == 1) input.pad[joynum] |= INPUT_RIGHT; if(keystate[SDLK_UP] == 1) input.pad[4] |= INPUT_UP; if(keystate[SDLK_DOWN] == 1) input.pad[4] |= INPUT_DOWN; if(keystate[SDLK_LEFT] == 1) input.pad[4] |= INPUT_LEFT; if(keystate[SDLK_RIGHT]== 1) input.pad[4] |= INPUT_RIGHT; } else { if (keystate[SDLK_UP] || MoveUp == 1) input.pad[joynum] |= INPUT_UP; else if(keystate[SDLK_DOWN] || MoveDown == 1) input.pad[joynum] |= INPUT_DOWN; if (keystate[SDLK_LEFT] || MoveLeft == 1) input.pad[joynum] |= INPUT_LEFT; else if(keystate[SDLK_RIGHT] || MoveRight == 1) input.pad[joynum] |= INPUT_RIGHT; } #else if (keystate[SDLK_UP] ) input.pad[joynum] |= INPUT_UP; else if(keystate[SDLK_DOWN] ) input.pad[joynum] |= INPUT_DOWN; if (keystate[SDLK_LEFT] ) input.pad[joynum] |= INPUT_LEFT; else if(keystate[SDLK_RIGHT]) input.pad[joynum] |= INPUT_RIGHT; #endif } } return 1; } int main (int argc, char **argv) { FILE *fp; int running = 1; atexit(shutdown); /* Print help if no game specified */ if(argc < 2) { char caption[256]; sprintf(caption, "Genesis Plus GX\\SDL\nusage: %s gamename\n", argv[0]); MessageBox(NULL, caption, "Information", 0); exit(1); } error_init(); create_default_directories(); /* set default config */ set_config_defaults(); /* using rom file name instead of crc code to save files */ sprintf(rom_filename, "%s", get_file_name(argv[1])); /* mark all BIOS as unloaded */ system_bios = 0; /* Genesis BOOT ROM support (2KB max) */ memset(boot_rom, 0xFF, 0x800); fp = fopen(MD_BIOS, "rb"); if (fp != NULL) { int i; /* read BOOT ROM */ fread(boot_rom, 1, 0x800, fp); fclose(fp); /* check BOOT ROM */ if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) { /* mark Genesis BIOS as loaded */ system_bios = SYSTEM_MD; } /* Byteswap ROM */ for (i=0; i<0x800; i+=2) { uint8 temp = boot_rom[i]; boot_rom[i] = boot_rom[i+1]; boot_rom[i+1] = temp; } } /* initialize SDL */ if(SDL_Init(0) < 0) { char caption[256]; sprintf(caption, "SDL initialization failed"); MessageBox(NULL, caption, "Error", 0); exit(1); } #ifdef GCWZERO sdl_joystick_init(); #endif sdl_video_init(); if (use_sound) sdl_sound_init(); sdl_sync_init(); /* initialize Genesis virtual system */ SDL_LockSurface(sdl_video.surf_bitmap); memset(&bitmap, 0, sizeof(t_bitmap)); bitmap.width = 720; bitmap.height = 576; #if defined(USE_8BPP_RENDERING) bitmap.pitch = (bitmap.width * 1); #elif defined(USE_15BPP_RENDERING) bitmap.pitch = (bitmap.width * 2); #elif defined(USE_16BPP_RENDERING) bitmap.pitch = (bitmap.width * 2); #elif defined(USE_32BPP_RENDERING) bitmap.pitch = (bitmap.width * 4); #endif bitmap.data = sdl_video.surf_bitmap->pixels; SDL_UnlockSurface(sdl_video.surf_bitmap); bitmap.viewport.changed = 3; /* Load game file */ if(!load_rom(argv[1])) { char caption[256]; sprintf(caption, "Error loading file `%s'.", argv[1]); MessageBox(NULL, caption, "Error", 0); exit(1); } /* initialize system hardware */ //NOTE gcw0 second value determines framerate audio_init(SOUND_FREQUENCY, 0); system_init(); /* Mega CD specific */ char brm_file[256]; if (system_hw == SYSTEM_MCD) { /* load internal backup RAM */ sprintf(brm_file,"%s/", get_save_directory(), "scd.brm"); fp = fopen(brm_file, "rb"); if (fp!=NULL) { fread(scd.bram, 0x2000, 1, fp); fclose(fp); } /* check if internal backup RAM is formatted */ if (memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { /* clear internal backup RAM */ memset(scd.bram, 0x00, 0x200); /* Internal Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = 0x00; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (sizeof(scd.bram) / 64) - 3; /* format internal backup RAM */ memcpy(scd.bram + 0x2000 - 0x40, brm_format, 0x40); } /* load cartridge backup RAM */ if (scd.cartridge.id) { sprintf(brm_file,"%s/", get_save_directory(), "cart.brm"); fp = fopen(brm_file, "rb"); if (fp!=NULL) { fread(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); fclose(fp); } /* check if cartridge backup RAM is formatted */ if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { /* clear cartridge backup RAM */ memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); /* Cartridge Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; /* format cartridge backup RAM */ memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - sizeof(brm_format), brm_format, sizeof(brm_format)); } } } if (sram.on) { /* load SRAM */ char save_file[256]; sprintf(save_file,"%s/%s.srm", get_save_directory(), rom_filename); fp = fopen(save_file, "rb"); if (fp!=NULL) { fread(sram.sram,0x10000,1, fp); fclose(fp); } } /* reset system hardware */ system_reset(); if(use_sound) SDL_PauseAudio(0); /* 3 frames = 50 ms (60hz) or 60 ms (50hz) */ if(sdl_sync.sem_sync) SDL_SetTimer(vdp_pal ? 60 : 50, sdl_sync_timer_callback); /* emulation loop */ while(running) { SDL_Event event; if (SDL_PollEvent(&event)) { switch(event.type) { case SDL_USEREVENT: { char caption[100]; sprintf(caption,"Genesis Plus GX - %d fps - %s)", event.user.code, (rominfo.international[0] != 0x20) ? rominfo.international : rominfo.domestic); SDL_WM_SetCaption(caption, NULL); break; } case SDL_QUIT: { running = 0; break; } case SDL_KEYDOWN: { running = sdl_control_update(event.key.keysym.sym); break; } } } #ifdef GCWZERO if (do_once) { do_once--; //don't waste write cycles! if (config.keepaspectratio) { FILE* aspect_ratio_file = fopen("/sys/devices/platform/jz-lcd.0/keep_aspect_ratio", "w"); if (aspect_ratio_file) { fwrite("Y", 1, 1, aspect_ratio_file); fclose(aspect_ratio_file); } } if (!config.keepaspectratio) { FILE* aspect_ratio_file = fopen("/sys/devices/platform/jz-lcd.0/keep_aspect_ratio", "w"); if (aspect_ratio_file) { fwrite("N", 1, 1, aspect_ratio_file); fclose(aspect_ratio_file); } } } #endif sdl_video_update(); sdl_sound_update(use_sound); if(!turbo_mode && sdl_sync.sem_sync && sdl_video.frames_rendered % 3 == 0) { if (!config.gcw0_frameskip || (config.gcw0_frameskip && (system_hw != SYSTEM_MCD))) //we really only need this for fmv sequences if(!gotomenu) SDL_SemWait(sdl_sync.sem_sync); #ifdef GCWZERO } else { if (gotomenu) gcw0menu(); #endif } } return 0; } gx/utils/oggplayer.h000664 001750 001750 00000013073 12702465756 015644 0ustar00sergiosergio000000 000000 /* Copyright (c) 2008 Francisco Muoz 'Hermes' All rights reserved. Proper (standard) vorbis usage by Tantric, 2009 Threading modifications/corrections by Tantric, 2009 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef NO_SOUND #ifndef __OGGPLAYER_H__ #define __OGGPLAYER_H__ #include #include "tremor/ivorbiscodec.h" #include "tremor/ivorbisfile.h" #ifdef __cplusplus extern "C" { #endif #define OGG_ONE_TIME 0 #define OGG_INFINITE_TIME 1 #define OGG_STATUS_RUNNING 1 #define OGG_STATUS_ERR -1 #define OGG_STATUS_PAUSED 2 #define OGG_STATUS_EOF 255 /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Player OGG functions */ /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* int PlayOgg(int fd, int time_pos, int mode); Play an Ogg file. This file can be loaded from memory (mem_open(void *ogg, int size_ogg)) or from device with open("device:file.ogg",O_RDONLY,0); NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. -- Params --- buf: pointer to sound data buflen: buffer size in bytes time_pos: initial time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds mode: Use OGG_ONE_TIME or OGG_INFINITE_TIME. When you use OGG_ONE_TIME the sound stops and StatusOgg() return OGG_STATUS_EOF return: 0- Ok, -1 Error */ int PlayOgg(char * buf, int buflen, int time_pos, int mode); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* void StopOgg(); Stop an Ogg file. NOTE: The file is closed and the player thread is released -- Params --- */ void StopOgg(); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* void PauseOgg(int pause); Pause an Ogg file. -- Params --- pause: 0 -> continue, 1-> pause */ void PauseOgg(int pause); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* int StatusOgg(); Return the Ogg status -- Params --- return: OGG_STATUS_RUNNING OGG_STATUS_ERR -> not initialized? OGG_STATUS_PAUSED OGG_STATUS_EOF -> player stopped by End Of File */ int StatusOgg(); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* void SetVolumeOgg(int volume); Set the Ogg playing volume. NOTE: it change the volume of voice 0 (used for the Ogg player) -- Params --- volume: 0 to 255 (max) */ void SetVolumeOgg(int volume); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* s32 GetTimeOgg(); Return the Ogg time from the starts of the file -- Params --- return: 0 -> Ok or error condition (you must ignore this value) >0 -> time in milliseconds from the starts */ s32 GetTimeOgg(); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* void SetTimeOgg(s32 time_pos); Set the time position NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. -- Params --- time_pos: time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds */ void SetTimeOgg(s32 time_pos); /*------------------------------------------------------------------------------------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #endif #endif core/cart_hw/md_cart.h000664 001750 001750 00000010273 12702465756 016064 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Mega Drive cartridge hardware support * * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Most cartridge protections were initially documented by Haze * (http://haze.mameworld.info/) * * Realtec mapper was documented by TascoDeluxe * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _MD_CART_H_ #define _MD_CART_H_ #ifdef USE_DYNAMIC_ALLOC #define cart ext->md_cart #else #define cart ext.md_cart #endif /* Lock-On cartridge type */ #define TYPE_GG 0x01 /* Game Genie */ #define TYPE_AR 0x02 /* (Pro) Action Replay */ #define TYPE_SK 0x03 /* Sonic & Knuckles */ /* Special hardware (0x01 & 0x02 reserved for Master System 3-D glasses & Terebi Oekaki) */ #define HW_J_CART 0x04 #define HW_LOCK_ON 0x08 /* Cartridge extra hardware */ typedef struct { uint8 regs[4]; /* internal registers (R/W) */ uint32 mask[4]; /* registers address mask */ uint32 addr[4]; /* registers address */ uint16 realtec; /* realtec mapper */ uint16 bankshift; /* cartridge with bankshift mecanism reseted on software reset */ unsigned int (*time_r)(unsigned int address); /* !TIME signal ($a130xx) read handler */ void (*time_w)(unsigned int address, unsigned int data); /* !TIME signal ($a130xx) write handler */ unsigned int (*regs_r)(unsigned int address); /* cart hardware registers read handler */ void (*regs_w)(unsigned int address, unsigned int data); /* cart hardware registers write handler */ } cart_hw_t; /* Cartridge type */ typedef struct { uint8 rom[MAXROMSIZE]; /* ROM area */ uint8 *base; /* ROM base (saved for OS/Cartridge ROM swap) */ uint32 romsize; /* ROM size */ uint32 mask; /* ROM mask */ uint8 special; /* Lock-On, J-Cart or SMS 3-D glasses hardware */ cart_hw_t hw; /* Extra mapping hardware */ } md_cart_t; /* Function prototypes */ extern void md_cart_init(void); extern void md_cart_reset(int hard_reset); extern int md_cart_context_save(uint8 *state); extern int md_cart_context_load(uint8 *state); #endif gx/images/Main_showinfo.png000664 001750 001750 00000007156 12702465756 017122 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 IDATx{pU?ݹnBx@&$ H& aaȈIC LI?:XkP/b+l(+(q ! >ow@8fVt9})%(_0Ya8RWW;s[̙qu$&&^3fF)}(ZjյkמD"TU%==\INNfnQ@WryNh# Wmmmbbٌ1LӤ͛7#{{n/v7R%sԩtJJJzlhh^G4h0Ƒ4lݺ福ߍH)8q";wvݻwwyyGЊV=4iEEE TVVg^2'p;_ԝaٲeTVn"33@B,0 uVv-gΜtoc@Eaʕ_eee1wX۷o'7>nc CB lp4/ ˗/ ߞ,²,L0 (zjjjj"?/H)qFVZ5bĈ<͌3bm߾<~.fdr8k޼yŊXf͒ѣGfffƼ}zɓ3T3AJINNp;|cS E0E7 ::a䉧j4su$8TN5kQBa${" |;3`eĈOׯ/B)))i`lƎ["&4 #zr[//M\j o]Yk;~_^^Naa!۶mkSXXȶm8vX}… ={6i&@ЛjVVpxJ4y'7"'>,S&]J@3֡ȴIÑL}ci*$$81MRL,b߾}lfy^^/f΂ X`Al׮]Kjj*[l!11*|ڵ6{n:i$^pGGGǬFV^k ޷]7A UFt(C&'!cpbWq n"&0S )Uޯ}{}”)Sno{+Bjj*SLAJ9vXvnS4%;;m۶%F >rssc0mg7 !F=P hQTEZP) h&C`i s [Ȑ UQ/N:TAAڵ k b}yۍWdYV~͌9Ob2m|L@EA`-tS -a NTE N'R \mi`*z҂n磹/ƞR_@{/_@:thuvv6NpSHKbYa %iIXBb n:Q$%8hQaYXDZp(')x<_93&{///?M6Q]]MnnmϛCsΑݡt:/obE\pSHL!0 0,LBQtCA LpaQCv-O?,Yaښ2e wd3sLlق(TVVR^^Y`AlMR"hG>}+ ˭&>//œf85HCJɏ83p:~>lƴ uhot(t^oSKK )))cpP(+pGM?V04m:( PUӄH$GB#KH(Rh9;*\%K ;aY⍑HMb'N_'33G>cEQ7nS ֭^cذa,Z˲ذ,\L}Eu)(J׾8~Ϋl+~`@uOm 14-VcرN:1 dѢE''fee뭷xgI̥x#ddpš P2U ,C諡hP˚5kXpaB4   B1\r%긶Rʞ*++TWWם={URRʕ+GASS/2.cs1`iwM&~])ij02g~aFՏx\6P{n{P??.3229sM۶Юi^ɓ']ӦMZZX{<(**bUQv}Z[[9t.\iiiK|>ߛ=r ͥiO?4&LAߠa4H}P{SH)#C Y^WWL[zxpd=zݖ'x|.\H~~>MӌK=w_r!.^Hvv?d>?/9iz @zz:ddd0l0bvvvDCCCX%SSSYP}} ۞Ο?ǁ@ zrWg}ry}v1_[[wIENDB`libretro/msvc/msvc-2003-xbox1/000700 001750 001750 00000000000 12703321515 017050 5ustar00sergiosergio000000 000000 core/shared.h000664 001750 001750 00000001214 12702465756 014265 0ustar00sergiosergio000000 000000 #ifndef _SHARED_H_ #define _SHARED_H_ #include #include #include #include #include "types.h" #include "macros.h" #include "osd.h" #include "loadrom.h" #include "m68k.h" #include "z80.h" #include "system.h" #include "genesis.h" #include "vdp_ctrl.h" #include "vdp_render.h" #include "mem68k.h" #include "memz80.h" #include "membnk.h" #include "io_ctrl.h" #include "input.h" #include "sound.h" #include "sn76489.h" #include "ym2413.h" #include "ym2612.h" #include "sram.h" #include "ggenie.h" #include "areplay.h" #include "svp.h" #include "state.h" #endif /* _SHARED_H_ */ core/cart_hw/md_cart.c000664 001750 001750 00000174511 12702465756 016065 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Mega Drive cartridge hardware support * * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Many cartridge protections were initially documented by Haze * (http://haze.mameworld.info/) * * Realtec mapper was documented by TascoDeluxe * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "eeprom_i2c.h" #include "eeprom_spi.h" #include "gamepad.h" /* Cart database entry */ typedef struct { uint16 chk_1; /* header checksum */ uint16 chk_2; /* real checksum */ uint8 bank_start; /* first mapped bank in $400000-$7fffff region */ uint8 bank_end; /* last mapped bank in $400000-$7fffff region */ cart_hw_t cart_hw; /* hardware description */ } md_entry_t; /* Function prototypes */ static void mapper_sega_w(uint32 data); static void mapper_512k_w(uint32 address, uint32 data); static void mapper_ssf2_w(uint32 address, uint32 data); static void mapper_sf001_w(uint32 address, uint32 data); static void mapper_sf002_w(uint32 address, uint32 data); static void mapper_sf004_w(uint32 address, uint32 data); static uint32 mapper_sf004_r(uint32 address); static void mapper_t5740_w(uint32 address, uint32 data); static uint32 mapper_t5740_r(uint32 address); static uint32 mapper_smw_64_r(uint32 address); static void mapper_smw_64_w(uint32 address, uint32 data); static void mapper_realtec_w(uint32 address, uint32 data); static void mapper_seganet_w(uint32 address, uint32 data); static void mapper_32k_w(uint32 data); static void mapper_64k_w(uint32 data); static void mapper_64k_multi_w(uint32 address); static uint32 mapper_radica_r(uint32 address); static void default_time_w(uint32 address, uint32 data); static void default_regs_w(uint32 address, uint32 data); static uint32 default_regs_r(uint32 address); static uint32 default_regs_r_16(uint32 address); static uint32 custom_regs_r(uint32 address); static void custom_regs_w(uint32 address, uint32 data); static void custom_alt_regs_w(uint32 address, uint32 data); static uint32 topshooter_r(uint32 address); static void topshooter_w(uint32 address, uint32 data); static uint32 tekken_regs_r(uint32 address); static void tekken_regs_w(uint32 address, uint32 data); /* Games that need extra hardware emulation: - copy protection device - custom ROM banking device */ static const md_entry_t rom_database[] = { /* Funny World & Balloon Boy */ {0x0000,0x06ab,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}}, /* Whac-a-Critter */ {0xffff,0xf863,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}}, /* Earth Defense */ {0xffff,0x44fb,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}}, /* Tom Clown */ {0x0000,0xc0cd,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}}, /* RADICA (Volume 1) (bad dump ?) */ {0x0000,0x2326,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,mapper_radica_r,NULL,NULL,NULL}}, /* RADICA (Volume 1) */ {0x24f4,0xfc84,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,mapper_radica_r,NULL,NULL,NULL}}, /* RADICA (Volume 2) */ {0x104f,0x32e9,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,mapper_radica_r,NULL,NULL,NULL}}, /* Tenchi wo Kurau III: Sangokushi Gaiden - Chinese Fighter */ {0x9490,0x8180,0x40,0x6f,{{0x00,0x00,0x00,0x00},{0xf0000c,0xf0000c,0xf0000c,0xf0000c},{0x400000,0x400004,0x400008,0x40000c},0,1,NULL,NULL,default_regs_r,custom_alt_regs_w}}, /* Top Fighter */ {0x4eb9,0x5d8b,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Soul Edge VS Samurai Spirits */ {0x00ff,0x5d34,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Mulan */ {0x0404,0x1b40,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Pocket Monsters II */ {0x47f9,0x17e5,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Lion King 3 */ {0x0000,0x507c,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Super King Kong 99 */ {0x0000,0x7d6e,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Gunfight 3-in-1 */ {0x0000,0x6ff8,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}}, /* Pokemon Stadium */ {0x0000,0x843c,0x70,0x7f,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,NULL,NULL,NULL,custom_regs_w}}, /* Tekken 3 Special (original dump) (a bootleg version also exists, with patched protection & different boot routine which reads unused !TIME mapped area) */ {0x0000,0xc2f0,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,tekken_regs_r,tekken_regs_w}}, /* Lion King 2 */ {0xffff,0x1d9b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* Squirell King */ {0x0000,0x8ec8,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* Tiny Toon Adventures 3 */ {0x2020,0xed9c,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* Lian Huan Pao - Barver Battle Saga (registers accessed by Z80, related to sound engine ?) */ {0x30b9,0x1c2a,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* Shui Hu Zhuan (registers accessed by Z80, related to sound engine ?) */ {0x6001,0x0211,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* Feng Shen Ying Jie Chuan (registers accessed by Z80, related to sound engine ?) */ {0xffff,0x5d98,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* (*) Shui Hu - Feng Yun Zhuan (patched ROM, unused registers) */ {0x3332,0x872b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}}, /* (*) Chao Ji Da Fu Weng (patched ROM, various words witten to register, long word also read from $7E0000, unknown banking hardware ?) */ {0xa697,0xa697,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}}, /* (*) Aq Renkan Awa (patched ROM, ON/OFF bit sequence is written to register, unknown banking hardware ?) */ {0x8104,0x0517,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400001,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}}, /* (*) Tun Shi Tian Di III (patched ROM, unused register) */ {0x0000,0x9c5e,0x40,0x40,{{0xab,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400046,0x000000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}}, /* Ma Jiang Qing Ren - Ji Ma Jiang Zhi */ {0x0000,0x7037,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}}, /* Super Majon Club */ {0x0000,0x3b95,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}}, /* Feng Kuang Tao Hua Yuan (original version from Creaton Softec Inc) (a bootleg version also exists with patched protection and minor title screen variations) */ {0x0000,0x9dc4,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}}, /* (*) Jiu Ji Ma Jiang II - Ye Yan Bian (patched ROM, using expected register value - $0f - crashes the game) (uses 16-bits reads) */ {0x0c44,0xba81,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}}, /* 16 Zhang Ma Jiang (uses 16-bits reads) */ {0xfb40,0x4bed,0x40,0x40,{{0x00,0xaa,0x00,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x400002,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}}, /* 16 Tiles Mahjong II (uses 16-bits reads) */ {0xffff,0x0903,0x40,0x40,{{0x00,0x00,0xc9,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x400004,0x000000},0,0,NULL,NULL,default_regs_r_16,NULL}}, /* Thunderbolt II (uses 16-bits reads) */ {0x0000,0x1585,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}}, /* Chaoji Puke - Super Poker (correct ROM dump, original release is an overdump) */ {0xffff,0xd7b0,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Super Bubble Bobble */ {0x0000,0x16cd,0x40,0x40,{{0x55,0x0f,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}}, /* Tenchi wo Kurau II - The Battle of Red Cliffs (Unl) */ {0x0000,0xed61,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Huan Le Tao Qi Shu - Smart Mouse */ {0x0000,0x1a28,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* (*) Hei Tao 2 - Super Big 2 (patched ROM, unused registers) */ {0x0000,0x5843,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Mighty Morphin Power Rangers - The Fighting Edition */ {0x0000,0x2288,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Elf Wor */ {0x0080,0x3dba,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Ya-Se Chuanshuo */ {0xffff,0xd472,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* 777 Casino (For first one, 0x55 works as well. Other values are never used so they are guessed from on other unlicensed games using similar mapper) */ {0x0000,0xf8d9,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Wu Kong Wai Zhuan (original) (a bootleg version also exists, with patched protection & modified SRAM test routine ?) */ {0x0000,0x19ff,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* Soul Blade */ {0x0000,0x0c5b,0x40,0x40,{{0x63,0x98,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}}, /* King of Fighter 98 */ {0x0000,0xd0a0,0x48,0x4f,{{0x00,0x00,0xaa,0xf0},{0xffffff,0xffffff,0xfc0000,0xfc0000},{0x000000,0x000000,0x480000,0x4c0000},0,0,NULL,NULL,default_regs_r,NULL}}, /* Rockman X3 (bootleg version ? two last register returned values are ignored, note that 0xaa/0x18 would work as well) */ {0x0000,0x9d0e,0x40,0x40,{{0x0c,0x00,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x400004,0x400006},0,0,default_regs_r,NULL,default_regs_r,NULL}}, /* (*) Dragon Ball Final Bout (patched ROM, in original code, different switches occurs depending on returned value $00-$0f) */ {0xc65a,0xc65a,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}}, /* (*) Yang Jia Jiang - Yang Warrior Family (patched ROM, register value unused) */ {0x0000,0x96b0,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}}, /* Super Mario 2 1998 */ {0xffff,0x0474,0x00,0x00,{{0x0a,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}}, /* Super Mario World */ {0x2020,0xb4eb,0x00,0x00,{{0x1c,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}}, /* King of Fighter 99 */ {0x0000,0x021e,0x00,0x00,{{0x00,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,custom_regs_r,default_regs_w,NULL,NULL}}, /* Pocket Monster */ {0xd6fc,0x1eb1,0x00,0x00,{{0x00,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,custom_regs_r,default_regs_w,NULL,NULL}}, /* Pocket Monster (bootleg version ? two last register returned values are ignored & first register test has been modified) */ {0xd6fc,0x6319,0x00,0x00,{{0x14,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}}, /* A Bug's Life (bootleg version ? two last register returned values are ignored & first register test has been modified ?) */ {0x7f7f,0x2aad,0x00,0x00,{{0x28,0x01,0x1f,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0xa13002,0xa1303e,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}}, /* Game no Kanzume Otokuyou */ {0x0000,0xf9d1,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,mapper_seganet_w,NULL,NULL}}, /* Top Shooter (arcade hardware) */ {0xffff,0x3632,0x20,0x20,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,topshooter_r,topshooter_w}} }; /************************************************************ Cart Hardware initialization *************************************************************/ void md_cart_init(void) { int i; /*************************************************************************************************************** CARTRIDGE ROM MIRRORING *************************************************************************************************************** MD Cartridge area is mapped to $000000-$3fffff: -> when accessing ROM, 68k address lines A1 to A21 can be used by the internal cartridge hardware to decode full 4MB address range. -> depending on ROM total size and additional decoding hardware, some address lines might be ignored, resulting in ROM mirroring. Cartridges can use either 8-bits (x2) or 16-bits (x1, x2) Mask ROM chips, each chip size is a factor of 2 bytes: -> two 8-bits chips are equivalent to one 16-bits chip, no specific address decoding is required, needed address lines are simply connected to each chip, upper address lines are ignored and data lines are connected appropriately to each chip (D0-D7 to one chip, D8-D15 to the other one). ROM is generally mirrored each N bytes where N=2^(k+1) is the total ROM size (ROM1+ROM2,ROM1+ROM2,...) -> one single 16-bits chip do not need specific address decoding, address lines are simply connected depending on the ROM size, upper address lines being ignored. ROM is generally mirrored each N bytes where N=2^k is the size of the ROM chip (ROM1,ROM1,ROM1,...) -> two 16-bits chips of the same size are equivalent to one chip of double size, address decoding generally is the same except that specific hardware is used (one address line is generally used for chip selection, lower ones being used to address the chips and upper ones being ignored). ROM is generally mirrored each N bytes where N=2^(k+1) is the total ROM size (ROM1,ROM2,ROM1,ROM2,...) -> two 16-bits chips with different size are mapped differently. Address decoding is done the same way as above (one address line used for chip selection) but the ignored & required address lines differ from one chip to another, which makes ROM mirroring different. ROM2 size is generally half of ROM1 size and upper half ignored (ROM1,ROM2,XXXX,ROM1,ROM2,XXXX,...) From the emulator point of view, we only need to distinguish 2 cases: 1/ total ROM size is a factor of 2: ROM is mirrored each 2^k bytes. 2/ total ROM size is not a factor of 2: ROM is padded up to 2^k then mirrored each 2^k bytes. ******************************************************************************************************************/ /* calculate nearest size with factor of 2 */ unsigned int size = 0x10000; while (cart.romsize > size) size <<= 1; /* Sonic & Knuckles */ if (strstr(rominfo.international,"SONIC & KNUCKLES")) { /* disable ROM mirroring at $200000-$3fffff (normally mapped to external cartridge) */ size = 0x400000; } /* total ROM size is not a factor of 2 */ /* TODO: handle all possible ROM configurations using cartridge database */ if (cart.romsize < size) { if (size < MAXROMSIZE) { /* ROM is padded up to 2^k bytes */ memset(cart.rom + cart.romsize, 0xff, size - cart.romsize); } else { /* ROM is padded up to max ROM size */ memset(cart.rom + cart.romsize, 0xff, MAXROMSIZE - cart.romsize); } } /* ROM is mirrored each 2^k bytes */ cart.mask = size - 1; /* no special external hardware required by default */ cart.special = 0; /********************************************** DEFAULT CARTRIDGE MAPPING ***********************************************/ for (i=0; i<0x40; i++) { /* cartridge ROM */ m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = zbank_unused_w; } for (i=0x40; i<0x80; i++) { /* unused area */ m68k.memory_map[i].base = cart.rom + (i<<16); m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = zbank_unused_r; zbank_memory_map[i].write = zbank_unused_w; } /* support for Quackshot REV 01 (real) dump */ if (strstr(rominfo.product,"00004054-01") && (cart.romsize == 0x80000)) { /* $000000-$0fffff: first 256K mirrored (A18 not connected to ROM chip, A19 not decoded) */ for (i=0x00; i<0x10; i++) { /* $200000-$3fffff: mirror of $000000-$1fffff (A21 not decoded) */ m68k.memory_map[i].base = m68k.memory_map[i + 0x20].base = cart.rom + ((i & 0x03) << 16); } /* $100000-$1fffff: second 256K mirrored (A20 connected to ROM chip A18) */ for (i=0x10; i<0x20; i++) { /* $200000-$3fffff: mirror of $000000-$1fffff (A21 not decoded) */ m68k.memory_map[i].base = m68k.memory_map[i + 0x20].base = cart.rom + 0x40000 + ((i & 0x03) << 16); } } /********************************************** BACKUP MEMORY ***********************************************/ sram_init(); eeprom_i2c_init(); /* external SRAM */ if (sram.on && !sram.custom) { /* initialize default memory mapping for SRAM */ m68k.memory_map[sram.start >> 16].base = sram.sram; m68k.memory_map[sram.start >> 16].read8 = sram_read_byte; m68k.memory_map[sram.start >> 16].read16 = sram_read_word; m68k.memory_map[sram.start >> 16].write8 = sram_write_byte; m68k.memory_map[sram.start >> 16].write16 = sram_write_word; zbank_memory_map[sram.start >> 16].read = sram_read_byte; zbank_memory_map[sram.start >> 16].write = sram_write_byte; } /********************************************** SVP CHIP ***********************************************/ svp = NULL; if (strstr(rominfo.international,"Virtua Racing")) { svp_init(); m68k.memory_map[0x30].base = svp->dram; m68k.memory_map[0x30].read16 = NULL; m68k.memory_map[0x30].write16 = svp_write_dram; m68k.memory_map[0x31].base = svp->dram + 0x10000; m68k.memory_map[0x31].read16 = NULL; m68k.memory_map[0x31].write16 = svp_write_dram; m68k.memory_map[0x39].read16 = svp_read_cell_1; m68k.memory_map[0x3a].read16 = svp_read_cell_2; } /********************************************** LOCK-ON ***********************************************/ /* clear existing patches */ ggenie_shutdown(); areplay_shutdown(); /* initialize extra hardware */ switch (config.lock_on) { case TYPE_GG: { ggenie_init(); break; } case TYPE_AR: { areplay_init(); break; } case TYPE_SK: { /* store S&K ROM above cartridge ROM (and before backup memory) */ if (cart.romsize > 0x600000) break; /* try to load Sonic & Knuckles ROM file (2 MB) */ if (load_archive(SK_ROM, cart.rom + 0x600000, 0x200000, NULL) == 0x200000) { /* check ROM header */ if (!memcmp(cart.rom + 0x600000 + 0x120, "SONIC & KNUCKLES",16)) { /* try to load Sonic 2 & Knuckles UPMEM ROM (256 KB) */ if (load_archive(SK_UPMEM, cart.rom + 0x900000, 0x40000, NULL) == 0x40000) { /* $000000-$1FFFFF is mapped to S&K ROM */ for (i=0x00; i<0x20; i++) { m68k.memory_map[i].base = cart.rom + 0x600000 + (i << 16); } #ifdef LSB_FIRST for (i=0; i<0x200000; i+=2) { /* Byteswap ROM */ uint8 temp = cart.rom[i + 0x600000]; cart.rom[i + 0x600000] = cart.rom[i + 0x600000 + 1]; cart.rom[i + 0x600000 + 1] = temp; } for (i=0; i<0x40000; i+=2) { /* Byteswap ROM */ uint8 temp = cart.rom[i + 0x900000]; cart.rom[i + 0x900000] = cart.rom[i + 0x900000 + 1]; cart.rom[i + 0x900000 + 1] = temp; } #endif cart.special |= HW_LOCK_ON; } } } break; } default: { break; } } /********************************************** CARTRIDGE EXTRA HARDWARE ***********************************************/ memset(&cart.hw, 0, sizeof(cart.hw)); /* search for game into database */ for (i=0; i<(sizeof(rom_database)/sizeof(md_entry_t)); i++) { /* known cart found ! */ if ((rominfo.checksum == rom_database[i].chk_1) && (rominfo.realchecksum == rom_database[i].chk_2)) { int j = rom_database[i].bank_start; /* retrieve hardware information */ memcpy(&cart.hw, &(rom_database[i].cart_hw), sizeof(cart.hw)); /* initialize memory handlers for $400000-$7FFFFF region */ while (j <= rom_database[i].bank_end) { if (cart.hw.regs_r) { m68k.memory_map[j].read8 = cart.hw.regs_r; m68k.memory_map[j].read16 = cart.hw.regs_r; zbank_memory_map[j].read = cart.hw.regs_r; } if (cart.hw.regs_w) { m68k.memory_map[j].write8 = cart.hw.regs_w; m68k.memory_map[j].write16 = cart.hw.regs_w; zbank_memory_map[j].write = cart.hw.regs_w; } j++; } /* leave loop */ break; } } /* Realtec mapper */ if (cart.hw.realtec) { /* 8k BOOT ROM */ for (i=0; i<8; i++) { memcpy(cart.rom + 0x900000 + i*0x2000, cart.rom + 0x7e000, 0x2000); } /* BOOT ROM is mapped to $000000-$3FFFFF */ for (i=0x00; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + 0x900000; } } /* detect specific mappers */ if (strstr(rominfo.consoletype,"SEGA SSF")) { /* Everdrive extended SSF mapper */ cart.hw.time_w = mapper_512k_w; /* cartridge ROM mapping is reinitialized on /VRES */ cart.hw.bankshift = 1; } else if (strstr(rominfo.domestic,"SUPER STREET FIGHTER2")) { /* SSF2 mapper */ cart.hw.time_w = mapper_ssf2_w; /* cartridge ROM mapping is reinitialized on /VRES */ cart.hw.bankshift = 1; } else if (strstr(rominfo.product,"T-5740")) { /* T-5740XX-XX mapper */ cart.hw.bankshift = 1; m68k.memory_map[0x01].read8 = mapper_t5740_r; zbank_memory_map[0x01].read = mapper_t5740_r; /* specific !TIME handlers */ cart.hw.time_w = mapper_t5740_w; cart.hw.time_r = eeprom_spi_read; /* initialize SPI EEPROM board */ eeprom_spi_init(); } else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"001")) { /* SF-001 mapper */ m68k.memory_map[0x00].write8 = mapper_sf001_w; m68k.memory_map[0x00].write16 = mapper_sf001_w; zbank_memory_map[0x00].write = mapper_sf001_w; /* no !TIME handler */ cart.hw.time_w = m68k_unused_8_w; /* cartridge ROM is mapped to $3C0000-$3FFFFF on reset */ for (i=0x3c; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + (i << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = m68k_unused_8_w; } } else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"002")) { /* SF-002 mapper */ m68k.memory_map[0x00].write8 = mapper_sf002_w; m68k.memory_map[0x00].write16 = mapper_sf002_w; zbank_memory_map[0x00].write = mapper_sf002_w; /* no !TIME handler */ cart.hw.time_w = m68k_unused_8_w; } else if (strstr(rominfo.ROMType,"SF") && strstr(rominfo.product,"004")) { /* SF-004 mapper */ m68k.memory_map[0x00].write8 = mapper_sf004_w; m68k.memory_map[0x00].write16 = mapper_sf004_w; zbank_memory_map[0x00].write = mapper_sf004_w; /* specific !TIME handlers */ cart.hw.time_r = mapper_sf004_r; cart.hw.time_w = m68k_unused_8_w; /* first 256K ROM bank is mirrored into $000000-$1FFFFF on reset */ for (i=0x00; i<0x20; i++) { m68k.memory_map[i].base = cart.rom + ((i & 0x03) << 16); } /* 32K static RAM mapped to $200000-$2FFFFF is disabled on reset */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].base = sram.sram; m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = m68k_read_bus_8; zbank_memory_map[i].write = zbank_unused_w; } /* $300000-$3FFFFF is not mapped */ for (i=0x30; i<0x40; i++) { m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = m68k_read_bus_8; zbank_memory_map[i].write = zbank_unused_w; } } else if ((*(uint16 *)(cart.rom + 0x08) == 0x6000) && (*(uint16 *)(cart.rom + 0x0a) == 0x01f6) && (rominfo.realchecksum == 0xf894)) { /* Super Mario World 64 (unlicensed) mapper */ for (i=0x08; i<0x10; i++) { /* lower 512KB mirrored */ m68k.memory_map[i].base = cart.rom + ((i & 7) << 16); } for (i=0x10; i<0x40; i++) { /* unused area */ m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = m68k_read_bus_8; zbank_memory_map[i].write = zbank_unused_w; } for (i=0x60; i<0x70; i++) { /* custom hardware */ m68k.memory_map[i].base = cart.rom + 0x0f0000; m68k.memory_map[i].read8 = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r; m68k.memory_map[i].read16 = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r; m68k.memory_map[i].write8 = mapper_smw_64_w; m68k.memory_map[i].write16 = mapper_smw_64_w; zbank_memory_map[i].read = ((i & 0x07) < 0x04) ? NULL : mapper_smw_64_r; zbank_memory_map[i].write = mapper_smw_64_w; } } else if (cart.romsize > 0x400000) { /* assume linear ROM mapper without bankswitching (max. 10MB) */ for (i=0x40; i<0xA0; i++) { m68k.memory_map[i].base = cart.rom + (i<<16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } } /* default write handler for !TIME range ($A130xx)*/ if (!cart.hw.time_w) { cart.hw.time_w = default_time_w; } } /* hardware that need to be reseted on power on */ void md_cart_reset(int hard_reset) { int i; /* reset cartridge mapping */ if (cart.hw.bankshift) { for (i=0x00; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask); } } /* SVP chip */ if (svp) { svp_reset(); } /* Lock-ON */ switch (config.lock_on) { case TYPE_GG: { ggenie_reset(hard_reset); break; } case TYPE_AR: { areplay_reset(hard_reset); break; } case TYPE_SK: { if (cart.special & HW_LOCK_ON) { /* disable UPMEM chip at $300000-$3fffff */ for (i=0x30; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask); } } break; } default: { break; } } } int md_cart_context_save(uint8 *state) { int i; int bufferptr = 0; uint8 *base; /* cartridge mapping */ for (i=0; i<0x40; i++) { /* get base address */ base = m68k.memory_map[i].base; if (base == sram.sram) { /* SRAM */ state[bufferptr++] = 0xff; } else { /* ROM */ state[bufferptr++] = ((base - cart.rom) >> 16) & 0xff; } } /* hardware registers */ save_param(cart.hw.regs, sizeof(cart.hw.regs)); /* SVP */ if (svp) { save_param(svp->iram_rom, 0x800); save_param(svp->dram,sizeof(svp->dram)); save_param(&svp->ssp1601,sizeof(ssp1601_t)); } return bufferptr; } int md_cart_context_load(uint8 *state) { int i; int bufferptr = 0; uint8 offset; /* cartridge mapping */ for (i=0; i<0x40; i++) { /* get offset */ offset = state[bufferptr++]; if (offset == 0xff) { /* SRAM */ m68k.memory_map[i].base = sram.sram; m68k.memory_map[i].read8 = sram_read_byte; m68k.memory_map[i].read16 = sram_read_word; m68k.memory_map[i].write8 = sram_write_byte; m68k.memory_map[i].write16 = sram_write_word; zbank_memory_map[i].read = sram_read_byte; zbank_memory_map[i].write = sram_write_byte; } else { /* check if SRAM was mapped there before loading state */ if (m68k.memory_map[i].base == sram.sram) { m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = zbank_unused_w; } /* ROM */ m68k.memory_map[i].base = cart.rom + (offset << 16); } } /* hardware registers */ load_param(cart.hw.regs, sizeof(cart.hw.regs)); /* SVP */ if (svp) { load_param(svp->iram_rom, 0x800); load_param(svp->dram,sizeof(svp->dram)); load_param(&svp->ssp1601,sizeof(ssp1601_t)); } return bufferptr; } /************************************************************ MAPPER handlers *************************************************************/ /* "official" ROM/SRAM bankswitch (Phantasy Star IV, Story of Thor/Beyond Oasis, Sonic 3 & Knuckles) */ static void mapper_sega_w(uint32 data) { int i; if (data & 1) { if (sram.on) { /* Backup RAM mapped to $200000-$20ffff (normally mirrored up to $3fffff but this breaks Sonic Megamix and no game need it) */ m68k.memory_map[0x20].base = sram.sram; m68k.memory_map[0x20].read8 = sram_read_byte; m68k.memory_map[0x20].read16 = sram_read_word; zbank_memory_map[0x20].read = sram_read_byte; /* Backup RAM write protection */ if (data & 2) { m68k.memory_map[0x20].write8 = m68k_unused_8_w; m68k.memory_map[0x20].write16 = m68k_unused_16_w; zbank_memory_map[0x20].write = zbank_unused_w; } else { m68k.memory_map[0x20].write8 = sram_write_byte; m68k.memory_map[0x20].write16 = sram_write_word; zbank_memory_map[0x20].write = sram_write_byte; } } /* S&K lock-on chip */ if ((cart.special & HW_LOCK_ON) && (config.lock_on == TYPE_SK)) { /* S2K upmem chip mapped to $300000-$3fffff (256K mirrored) */ for (i=0x30; i<0x40; i++) { m68k.memory_map[i].base = (cart.rom + 0x900000) + ((i & 3) << 16); } } } else { /* cartridge ROM mapped to $200000-$3fffff */ for (i=0x20; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].write = zbank_unused_w; } } } /* Everdrive extended SSF ROM bankswitch documented by Krikzz (http://krikzz.com/pub/support/mega-ed/dev/extended_ssf.txt) */ static void mapper_512k_w(uint32 address, uint32 data) { uint32 i; /* 512K ROM paging */ uint8 *src = cart.rom + (data << 19); /* cartridge area ($000000-$3FFFFF) is divided into 8 x 512K banks */ address = (address << 2) & 0x38; /* remap selected ROM page to selected bank */ for (i=0; i<8; i++) { m68k.memory_map[address++].base = src + (i<<16); } } /* Super Street Fighter 2 ROM bankswitch documented by Bart Trzynadlowski (http://emu-docs.org/Genesis/ssf2.txt) */ static void mapper_ssf2_w(uint32 address, uint32 data) { /* only banks 1-7 are remappable, bank 0 remains unchanged */ if (address & 0x0E) { mapper_512k_w(address, data); } } /* SF-001 mapper */ static void mapper_sf001_w(uint32 address, uint32 data) { switch ((address >> 8) & 0xf) { case 0xe: { int i; /* bit 6: enable / disable cartridge access */ if (data & 0x40) { /* $000000-$3FFFFF is not mapped */ for (i=0x00; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + (i << 16); m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w; m68k.memory_map[i].write16 = (i > 0x00) ? m68k_unused_16_w : mapper_sf001_w; zbank_memory_map[i].read = zbank_unused_r; zbank_memory_map[i].write = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w; } } /* bit 7: enable / disable SRAM & ROM bankswitching */ else if (data & 0x80) { /* 256K ROM bank #15 mapped to $000000-$03FFFF */ for (i=0x00; i<0x04; i++) { m68k.memory_map[i].base = cart.rom + ((0x38 + i) << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } /* 256K ROM banks #2 to #15 mapped to $040000-$3BFFFF (last revision) or $040000-$3FFFFF (older revisions) */ for (i=0x04; i<(sram.start >> 16); i++) { m68k.memory_map[i].base = cart.rom + (i << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } /* 32K static RAM mirrored into $3C0000-$3FFFFF (odd bytes only) (last revision only) */ while (i<0x40) { m68k.memory_map[i].base = sram.sram; m68k.memory_map[i].read8 = sram_read_byte; m68k.memory_map[i].read16 = sram_read_word; m68k.memory_map[i].write8 = sram_write_byte; m68k.memory_map[i].write16 = sram_write_word; zbank_memory_map[i].read = sram_read_byte; zbank_memory_map[i].write = sram_write_byte; i++; } } else { /* 256K ROM banks #1 to #16 mapped to $000000-$3FFFFF (default) */ for (i=0x00; i<0x40; i++) { m68k.memory_map[i].base = cart.rom + (i << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w; m68k.memory_map[i].write16 = (i > 0x00) ? m68k_unused_16_w : mapper_sf001_w; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = (i > 0x00) ? m68k_unused_8_w : mapper_sf001_w; } } /* bit 5: lock bankswitch hardware when set */ if (data & 0x20) { /* disable bankswitch hardware access until hard reset */ m68k.memory_map[0x00].write8 = m68k_unused_8_w; m68k.memory_map[0x00].write16 = m68k_unused_16_w; zbank_memory_map[0x00].write = m68k_unused_8_w; } return; } default: { m68k_unused_8_w(address, data); return; } } } /* SF-002 mapper */ static void mapper_sf002_w(uint32 address, uint32 data) { int i; if (data & 0x80) { /* $000000-$1BFFFF mapped to $200000-$3BFFFF */ for (i=0x20; i<0x3C; i++) { m68k.memory_map[i].base = cart.rom + ((i & 0x1F) << 16); } } else { /* $200000-$3BFFFF mapped to $200000-$3BFFFF */ for (i=0x20; i<0x3C; i++) { m68k.memory_map[i].base = cart.rom + (i << 16); } } } /* SF-004 mapper */ static void mapper_sf004_w(uint32 address, uint32 data) { int i; switch ((address >> 8) & 0xf) { case 0xd: { /* bit 7: enable/disable static RAM access */ if (data & 0x80) { /* 32KB static RAM mirrored into $200000-$2FFFFF (odd bytes only) */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].read8 = sram_read_byte; m68k.memory_map[i].read16 = sram_read_word; m68k.memory_map[i].write8 = sram_write_byte; m68k.memory_map[i].write16 = sram_write_word; zbank_memory_map[i].read = sram_read_byte; zbank_memory_map[i].write = sram_write_byte; } } else { /* 32KB static RAM disabled at $200000-$2FFFFF */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = m68k_read_bus_8; zbank_memory_map[i].write = m68k_unused_8_w; } } return; } case 0x0e: { /* bit 5: enable / disable cartridge ROM access */ if (data & 0x20) { /* $000000-$1FFFFF is not mapped */ for (i=0x00; i<0x20; i++) { m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; zbank_memory_map[i].read = m68k_read_bus_8; } } /* bit 6: enable / disable first page mirroring */ else if (data & 0x40) { /* first page ROM bank */ uint8 base = (m68k.memory_map[0x00].base - cart.rom) >> 16; /* 5 x 256K ROM banks mapped to $000000-$13FFFF, starting from first page ROM bank */ for (i=0x00; i<0x14; i++) { m68k.memory_map[i].base = cart.rom + (((base + i) & 0x1f) << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } /* $140000-$1FFFFF is not mapped */ for (i=0x14; i<0x20; i++) { m68k.memory_map[i].read8 = m68k_read_bus_8; m68k.memory_map[i].read16 = m68k_read_bus_16; zbank_memory_map[i].read = m68k_read_bus_8; } } else { /* first page 256K ROM bank mirrored into $000000-$1FFFFF */ for (i=0x00; i<0x20; i++) { m68k.memory_map[i].base = m68k.memory_map[0].base + ((i & 0x03) << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } } /* bit 7: lock ROM bankswitching hardware when cleared */ if (!(data & 0x80)) { /* disable bankswitch hardware access */ m68k.memory_map[0x00].write8 = m68k_unused_8_w; m68k.memory_map[0x00].write16 = m68k_unused_16_w; zbank_memory_map[0x00].write = m68k_unused_8_w; } return; } case 0x0f: { /* bits 6-4: select first page ROM bank (8 x 256K ROM banks) */ uint8 base = ((data >> 4) & 7) << 2; if (m68k.memory_map[0].base == m68k.memory_map[4].base) { /* selected 256K ROM bank mirrored into $000000-$1FFFFF */ for (i=0x00; i<0x20; i++) { m68k.memory_map[i].base = cart.rom + ((base + (i & 0x03)) << 16); } } else { /* 5 x 256K ROM banks mapped to $000000-$13FFFF, starting from selected bank */ for (i=0x00; i<0x14; i++) { m68k.memory_map[i].base = cart.rom + (((base + i) & 0x1f) << 16); } } return; } default: { m68k_unused_8_w(address, data); return; } } } static uint32 mapper_sf004_r(uint32 address) { /* return first page 256K bank index ($00,$10,$20,...,$70) */ return (((m68k.memory_map[0x00].base - cart.rom) >> 18) << 4); } /* T-5740xx-xx mapper */ static void mapper_t5740_w(uint32 address, uint32 data) { int i; uint8 *base; switch (address & 0xff) { case 0x01: /* mode register */ { /* bits 7-4: unused ? */ /* bit 3: enable SPI registers access ? */ /* bit 2: not used ? */ /* bit 1: enable bankswitch registers access ? */ /* bit 0: always set, enable hardware access ? */ return; } case 0x03: /* page #5 register */ { /* map any of 16 x 512K ROM banks to $280000-$2FFFFF */ base = cart.rom + ((data & 0x0f) << 19); for (i=0x28; i<0x30; i++) { m68k.memory_map[i].base = base + ((i & 0x07) << 16); } return; } case 0x05: /* page #6 register */ { /* map any of 16 x 512K ROM banks to $300000-$37FFFF */ base = cart.rom + ((data & 0x0f) << 19); for (i=0x30; i<0x38; i++) { m68k.memory_map[i].base = base + ((i & 0x07) << 16); } return; } case 0x07: /* page #7 register */ { /* map any of 16 x 512K ROM banks to $380000-$3FFFFF */ base = cart.rom + ((data & 0x0f) << 19); for (i=0x38; i<0x40; i++) { m68k.memory_map[i].base = base + ((i & 0x07) << 16); } return; } case 0x09: /* serial EEPROM SPI board support */ { eeprom_spi_write(data); return; } default: { /* unknown registers */ m68k_unused_8_w(address, data); return; } } } static uint32 mapper_t5740_r(uint32 address) { /* By default, first 32K of each eight 512K pages mapped in $000000-$3FFFFF are mirrored in the 512K page */ /* mirroring is disabled/enabled when a specific number of words is being read from specific ROM addresses */ /* Exact decoding isn't known but mirrored data is expected on startup when reading a few times from $181xx */ /* this area doesn't seem to be accessed as byte later so it seems safe to always return mirrored data here */ if ((address & 0xff00) == 0x8100) { return READ_BYTE(cart.rom , (address & 0x7fff)); } return READ_BYTE(cart.rom, address); } /* Super Mario World 64 (unlicensed) mapper */ static void mapper_smw_64_w(uint32 address, uint32 data) { /* internal registers (saved to backup RAM) */ switch ((address >> 16) & 0x07) { case 0x00: /* $60xxxx */ { if (address & 2) { /* $600003 data write mode ? */ switch (sram.sram[0x00] & 0x07) { case 0x00: { /* update value returned at $660001-$660003 */ sram.sram[0x06] = ((sram.sram[0x06] ^ sram.sram[0x01]) ^ data) & 0xFE; break; } case 0x01: { /* update value returned at $660005-$660007 */ sram.sram[0x07] = data & 0xFE; break; } case 0x07: { /* update selected ROM bank (upper 512K) mapped at $610000-$61ffff */ m68k.memory_map[0x61].base = m68k.memory_map[0x69].base = cart.rom + 0x080000 + ((data & 0x1c) << 14); break; } default: { /* unknown mode */ break; } } /* $600003 data register */ sram.sram[0x01] = data; } else { /* $600001 ctrl register */ sram.sram[0x00] = data; } return; } case 0x01: /* $61xxxx */ { if (address & 2) { /* $610003 ctrl register */ sram.sram[0x02] = data; } return; } case 0x04: /* $64xxxx */ { if (address & 2) { /* $640003 data register */ sram.sram[0x04] = data; } else { /* $640001 data register */ sram.sram[0x03] = data; } return; } case 0x06: /* $66xxxx */ { /* unknown */ return; } case 0x07: /* $67xxxx */ { if (!(address & 2)) { /* $670001 ctrl register */ sram.sram[0x05] = data; /* upper 512K ROM bank-switching enabled ? */ if (sram.sram[0x02] & 0x80) { /* update selected ROM bank (upper 512K) mapped at $600000-$60ffff */ m68k.memory_map[0x60].base = m68k.memory_map[0x68].base = cart.rom + 0x080000 + ((data & 0x1c) << 14); } } return; } default: /* not used */ { m68k_unused_8_w(address, data); return; } } } static uint32 mapper_smw_64_r(uint32 address) { /* internal registers (saved to backup RAM) */ switch ((address >> 16) & 0x03) { case 0x02: /* $66xxxx */ { switch ((address >> 1) & 7) { case 0x00: return sram.sram[0x06]; case 0x01: return sram.sram[0x06] + 1; case 0x02: return sram.sram[0x07]; case 0x03: return sram.sram[0x07] + 1; case 0x04: return sram.sram[0x08]; case 0x05: return sram.sram[0x08] + 1; case 0x06: return sram.sram[0x08] + 2; case 0x07: return sram.sram[0x08] + 3; } } case 0x03: /* $67xxxx */ { uint8 data = (sram.sram[0x02] & 0x80) ? ((sram.sram[0x05] & 0x40) ? (sram.sram[0x03] & sram.sram[0x04]) : (sram.sram[0x03] ^ 0xFF)) : 0x00; if (address & 2) { /* $670003 */ data &= 0x7f; } else { /* $66xxxx data registers update */ if (sram.sram[0x05] & 0x80) { if (sram.sram[0x05] & 0x20) { /* update $660009-$66000f data register */ sram.sram[0x08] = (sram.sram[0x04] << 2) & 0xFC; } else { /* update $660001-$660003 data register */ sram.sram[0x06] = (sram.sram[0x01] ^ (sram.sram[0x03] << 1)) & 0xFE; } } } return data; } default: /* 64xxxx-$65xxxx */ { return 0x00; } } } /* Realtec ROM bankswitch (Earth Defend, Balloon Boy & Funny World, Whac-A-Critter) (Note: register usage is inverted in TascoDlx documentation) */ static void mapper_realtec_w(uint32 address, uint32 data) { switch (address) { case 0x402000: { /* number of mapped 64k blocks (the written value is a number of 128k blocks) */ cart.hw.regs[2] = data << 1; return; } case 0x404000: { /* 00000xxx */ cart.hw.regs[0] = data & 7; return; } case 0x400000: { /* 00000yy1 */ cart.hw.regs[1] = data & 6; /* ensure mapped size is not null */ if (cart.hw.regs[2]) { /* mapped start address is 00yy xxx0 0000 0000 0000 0000 */ uint32 base = (cart.hw.regs[0] << 1) | (cart.hw.regs[1] << 3); /* selected blocks are mirrored into the whole cartridge area */ int i; for (i=0x00; i<0x40; i++) { m68k.memory_map[i].base = &cart.rom[(base + (i % cart.hw.regs[2])) << 16]; } } return; } } } /* Game no Kanzume Otokuyou ROM Mapper */ static void mapper_seganet_w(uint32 address, uint32 data) { if ((address & 0xff) == 0xf1) { int i; if (data & 1) { /* ROM Write protected */ for (i=0; i<0x40; i++) { m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].write = zbank_unused_w; } } else { /* ROM Write enabled */ for (i=0; i<0x40; i++) { m68k.memory_map[i].write8 = NULL; m68k.memory_map[i].write16 = NULL; zbank_memory_map[i].write = NULL; } } } } /* Custom ROM Bankswitch used in Soul Edge VS Samurai Spirits, Top Fighter, Mulan, Pocket Monsters II, Lion King 3, Super King Kong 99, Pokemon Stadium */ static void mapper_32k_w(uint32 data) { int i; /* 64 x 32k banks */ if (data) { for (i=0; i<0x10; i++) { /* Remap to unused ROM area */ m68k.memory_map[i].base = &cart.rom[0x400000 + (i << 16)]; /* address = address OR (value << 15) */ memcpy(m68k.memory_map[i].base, cart.rom + ((i << 16) | (data & 0x3f) << 15), 0x8000); memcpy(m68k.memory_map[i].base + 0x8000, cart.rom + ((i << 16) | ((data | 1) & 0x3f) << 15), 0x8000); } } else { /* reset default $000000-$0FFFFF mapping */ for (i=0; i<16; i++) { m68k.memory_map[i].base = &cart.rom[i << 16]; } } } /* Custom ROM Bankswitch used in Chinese Fighter III */ static void mapper_64k_w(uint32 data) { int i; /* 16 x 64k banks */ if (data) { /* bank is mapped at $000000-$0FFFFF */ for (i=0; i<16; i++) { m68k.memory_map[i].base = &cart.rom[(data & 0xf) << 16]; } } else { /* reset default $000000-$0FFFFF mapping */ for (i=0; i<16; i++) { m68k.memory_map[i].base = &cart.rom[(i & 0xf) << 16]; } } } /* Custom ROM Bankswitch used in pirate "Multi-in-1" cartridges, A Bug's Life, King of Fighter 99, Pocket Monster, Rockman X3 */ static void mapper_64k_multi_w(uint32 address) { int i; /* 64 x 64k banks */ for (i=0; i<64; i++) { m68k.memory_map[i].base = &cart.rom[((address++) & 0x3f) << 16]; } } /* Custom ROM Bankswitch used in RADICA cartridges */ static uint32 mapper_radica_r(uint32 address) { int i = 0; address = (address >> 1); /* 64 x 64k banks */ for (i = 0; i < 64; i++) { m68k.memory_map[i].base = &cart.rom[((address++)& 0x3f)<< 16]; } return 0xffff; } /************************************************************ default !TIME signal handler *************************************************************/ static void default_time_w(uint32 address, uint32 data) { if (address < 0xa13040) { /* unlicensed cartridges mapper (default) */ mapper_64k_multi_w(address); return; } /* official cartridges mapper (default) */ mapper_sega_w(data); } /************************************************************ Internal register handlers *************************************************************/ static uint32 default_regs_r(uint32 address) { int i; for (i=0; i<4; i++) { if ((address & cart.hw.mask[i]) == cart.hw.addr[i]) { return cart.hw.regs[i]; } } return m68k_read_bus_8(address); } static uint32 default_regs_r_16(uint32 address) { int i; for (i=0; i<4; i++) { if ((address & cart.hw.mask[i]) == cart.hw.addr[i]) { return (cart.hw.regs[i] << 8); } } return m68k_read_bus_16(address); } static void default_regs_w(uint32 address, uint32 data) { int i; for (i=0; i<4; i++) { if ((address & cart.hw.mask[i]) == cart.hw.addr[i]) { cart.hw.regs[i] = data; return; } } m68k_unused_8_w(address, data); } /* basic register shifting hardware (Bug's Life, Pocket Monster) */ static uint32 custom_regs_r(uint32 address) { int i; for (i=0; i<4; i++) { if ((address & cart.hw.mask[i]) == cart.hw.addr[i]) { return cart.hw.regs[i] >> 1; } } return m68k_read_bus_8(address); } /* custom register hardware (Top Fighter, Lion King III, Super Donkey Kong 99, Mulan, Pocket Monsters II, Pokemon Stadium) */ static void custom_regs_w(uint32 address, uint32 data) { uint8 temp; /* ROM bankswitch */ if ((address >> 16) > 0x6f) { mapper_32k_w(data); return; } /* write register */ default_regs_w(address, data); /* bitswapping */ temp = cart.hw.regs[0]; switch (cart.hw.regs[1] & 3) { case 0: cart.hw.regs[2] = (temp << 1); break; case 1: cart.hw.regs[2] = (temp >> 1); return; case 2: cart.hw.regs[2] = ((temp >> 4) | ((temp & 0x0F) << 4)); return; default: cart.hw.regs[2] = (((temp >> 7) & 0x01) | ((temp >> 5) & 0x02) | ((temp >> 3) & 0x04) | ((temp >> 1) & 0x08) | ((temp << 1) & 0x10) | ((temp << 3) & 0x20) | ((temp << 5) & 0x40) | ((temp << 7) & 0x80)); return; } } /* alternate custom register hardware (Chinese Fighters III) */ static void custom_alt_regs_w(uint32 address, uint32 data) { /* ROM bankswitch */ if ((address >> 16) > 0x5f) { mapper_64k_w(data); return; } /* write regs */ default_regs_w(address, data); } /* "Tekken 3 Special" custom register hardware */ static uint32 tekken_regs_r(uint32 address) { /* data output */ if ((address & 0x0e) == 0x02) { /* maybe depends on mode bits ? */ return (cart.hw.regs[0] - 1); } return m68k_read_bus_16(address); } static void tekken_regs_w(uint32 address, uint32 data) { switch (address & 0x0e) { case 0x00: { /* data output reset ? (game writes $FF before & after protection check) */ cart.hw.regs[0]= 0x00; break; } case 0x02: { /* read only ? */ break; } case 0x0c: { /* data output mode bit 0 ? (game writes $01) */ break; } case 0x0e: { /* data output mode bit 1 ? (never written by game) */ break; } default: { /* data input (only connected to D0 ?)*/ if (data & 1) { /* 4-bit hardware register ($400004 corresponds to bit0, $400006 to bit1, etc) */ cart.hw.regs[0] |= 1 << (((address - 0x04) >> 1) & 3); } break; } } } /* "Top Shooter" arcade board hardware */ static uint32 topshooter_r(uint32 address) { if (address < 0x202000) { uint8 temp = 0xff; switch (address & 0xff) { case 0x43: { if (input.pad[0] & INPUT_A) temp &= ~0x80; /* Shoot */ if (input.pad[0] & INPUT_B) temp &= ~0x10; /* Bet */ if (input.pad[0] & INPUT_START) temp &= ~0x20; /* Start */ break; } case 0x45: /* ??? (DOWN) & Service Mode (UP) */ { if (input.pad[0] & INPUT_UP) temp &= ~0x08; /* Service Mode */ if (input.pad[0] & INPUT_DOWN) temp &= ~0x10; /* ???, used in service menu to select next option */ break; } case 0x47: { if (input.pad[0] & INPUT_RIGHT) temp &= ~0x03; /* Insert 10 coins */ break; } case 0x49: { if (input.pad[0] & INPUT_LEFT) temp &= ~0x03; /* Clear coins */ if (input.pad[0] & INPUT_C) temp &= ~0x01; /* Insert XXX coins */ break; } case 0x51: { temp = 0xA5; break; } default: { temp = m68k_read_bus_8(address); break; } } return temp; } return READ_BYTE(sram.sram , address & 0xffff); } static void topshooter_w(uint32 address, uint32 data) { if (address >= 0x202000) { WRITE_BYTE(sram.sram , address & 0xffff, data); return; } m68k_unused_8_w(address, data); } /* Sega Channel hardware (not emulated) */ /* $A13004: BUSY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Unused read16 00A13004 (00005B54) Unused read16 00A13004 (00005B70) Unused read16 00A13006 (00005B7C) Unused read16 00A13004 (00005BC4) Unused read16 00A13004 (00005BDA) Unused write16 00A13032 = 0004 (00005706) Unused write16 00A130F0 = 0000 (0000570E) Unused write16 00A130F0 = 0000 (0000463E) Unused write16 00A130F2 = 0001 (00004646) Unused write16 00A130F4 = 0002 (0000464E) Unused write16 00A130F6 = 0003 (00004656) Unused write16 00A130F8 = 0004 (0000465E) Unused write16 00A130FA = 0005 (00004666) Unused write16 00A13032 = 0004 (00005706) Unused write16 00A13032 = 0104 (0000579E) Unused write16 00380000 = ACDC (00005718) Unused write16 00380002 = 0000 (00005722) Unused read16 00380000 (0000572C) Unused write16 00A13032 = 0104 (0000579E) Unused write16 00300000 = ACDC (000057B2) Unused write16 00380000 = 0000 (000057BC) Unused read16 00300000 (000057C6) static uint32 sega_channel_r(uint32 address) { return m68k_read_bus_16(address);; } static void sega_channel_w(uint32 address, uint32 data) { m68k_unused_16_w(address, data); } */ gx/utils/oggplayer.c000664 001750 001750 00000027615 12702465756 015646 0ustar00sergiosergio000000 000000 /* Copyright (c) 2008 Francisco Muoz 'Hermes' All rights reserved. Proper (standard) vorbis usage by Tantric, 2009 Threading modifications/corrections by Tantric, 2009 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "oggplayer.h" #include #include #include /* functions to read the Ogg file from memory */ static struct { char *mem; int size; int pos; } file[4]; static int f_read(void * punt, int bytes, int blocks, int *f) { int b; int c; int d; if (bytes * blocks <= 0) return 0; blocks = bytes * blocks; c = 0; while (blocks > 0) { b = blocks; if (b > 4096) b = 4096; if (*f >= 0x666 && *f <= 0x669) { d = (*f) - 0x666; if (file[d].size == 0) return -1; if ((file[d].pos + b) > file[d].size) b = file[d].size - file[d].pos; if (b > 0) { memcpy(punt, file[d].mem + file[d].pos, b); file[d].pos += b; } } else b = read(*f, ((char *) punt) + c, b); if (b <= 0) { return c / bytes; } c += b; blocks -= b; } return c / bytes; } static int f_seek(int *f, ogg_int64_t offset, int mode) { if(f==NULL) return(-1); int k, d; mode &= 3; if (*f >= 0x666 && *f <= 0x669) { d = (*f) - 0x666; k = 0; if (file[d].size == 0) return -1; if (mode == 0) { if ((offset) >= file[d].size) { file[d].pos = file[d].size; k = -1; } else if ((offset) < 0) { file[d].pos = 0; k = -1; } else file[d].pos = offset; } if (mode == 1) { if ((file[d].pos + offset) >= file[d].size) { file[d].pos = file[d].size; k = -1; } else if ((file[d].pos + offset) < 0) { file[d].pos = 0; k = -1; } else file[d].pos += offset; } if (mode == 2) { if ((file[d].size + offset) >= file[d].size) { file[d].pos = file[d].size; k = -1; } else if ((file[d].size + offset) < 0) { file[d].pos = 0; k = -1; } else file[d].pos = file[d].size + offset; } } else k = lseek(*f, (int) offset, mode); if (k < 0) k = -1; else k = 0; return k; } static int f_close(int *f) { int d; if (*f >= 0x666 && *f <= 0x669) { d = (*f) - 0x666; file[d].size = 0; file[d].pos = 0; if (file[d].mem) { file[d].mem = (void *) 0; } return 0; } else return close(*f); return 0; } static long f_tell(int *f) { int k, d; if (*f >= 0x666 && *f <= 0x669) { d = (*f) - 0x666; k = file[d].pos; } else k = lseek(*f, 0, 1); return (long) k; } static int mem_open(char * ogg, int size) { static int one = 1; int n; if (one) { one = 0; for (n = 0; n < 4; n++) file[n].size = 0; } for (n = 0; n < 4; n++) { if (file[n].size == 0) { file[n].mem = ogg; file[n].size = size; file[n].pos = 0; return (0x666 + n); } } return -1; } static int mem_close(int fd) { if (fd >= 0x666 && fd <= 0x669) // it is a memory file descriptor? { fd -= 0x666; file[fd].size = 0; return 0; } else return f_close(&fd); } static ov_callbacks callbacks = { (size_t (*)(void *, size_t, size_t, void *)) f_read, (int (*)(void *, ogg_int64_t, int)) f_seek, (int (*)(void *)) f_close, (long (*)(void *)) f_tell }; /* OGG control */ #define READ_SAMPLES 4096 /* samples that it must read before to send */ #define MAX_PCMOUT 4096 /* minimum size to read ogg samples */ typedef struct { OggVorbis_File vf; vorbis_info *vi; int current_section; /* OGG file operation */ int fd; int mode; int eof; int flag; int volume; int seek_time; /* OGG buffer control */ short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */ int pcmout_pos; int pcm_indx; } private_data_ogg; static private_data_ogg private_ogg; /* OGG thread control */ #define STACKSIZE 8192 static u8 oggplayer_stack[STACKSIZE]; static lwpq_t oggplayer_queue = LWP_TQUEUE_NULL; static lwp_t h_oggplayer = LWP_THREAD_NULL; static int ogg_thread_running = 0; static void ogg_add_callback(int voice) { if (!ogg_thread_running) { ASND_StopVoice(0); return; } if (private_ogg.flag & 128) return; /* Ogg is paused */ if (private_ogg.pcm_indx >= READ_SAMPLES) { if (ASND_AddVoice(0, (void *) private_ogg.pcmout[private_ogg.pcmout_pos], private_ogg.pcm_indx << 1) == 0) { private_ogg.pcmout_pos ^= 1; private_ogg.pcm_indx = 0; private_ogg.flag = 0; LWP_ThreadSignal(oggplayer_queue); } } else { if (private_ogg.flag & 64) { private_ogg.flag &= ~64; LWP_ThreadSignal(oggplayer_queue); } } } static void * ogg_player_thread(private_data_ogg * priv) { int first_time = 1; long ret; /* init */ LWP_InitQueue(&oggplayer_queue); priv[0].vi = ov_info(&priv[0].vf, -1); ASND_Pause(0); priv[0].pcm_indx = 0; priv[0].pcmout_pos = 0; priv[0].eof = 0; priv[0].flag = 0; priv[0].current_section = 0; ogg_thread_running = 1; while (!priv[0].eof && ogg_thread_running) { if (priv[0].flag) LWP_ThreadSleep(oggplayer_queue); /* wait only when i have samples to send */ if (priv[0].flag == 0) /* wait to all samples are sended */ { if (ASND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos]) && ASND_StatusVoice(0) != SND_UNUSED) { priv[0].flag |= 64; continue; } if (priv[0].pcm_indx < READ_SAMPLES) { priv[0].flag = 3; if (priv[0].seek_time >= 0) { ov_time_seek(&priv[0].vf, priv[0].seek_time); priv[0].seek_time = -1; } ret = ov_read( &priv[0].vf, (void *) &priv[0].pcmout[priv[0].pcmout_pos][priv[0].pcm_indx], MAX_PCMOUT,/*0,2,1,*/&priv[0].current_section); priv[0].flag &= 192; if (ret == 0) { /* EOF */ if (priv[0].mode & 1) ov_time_seek(&priv[0].vf, 0); /* repeat */ else priv[0].eof = 1; /* stops */ } else if (ret < 0) { /* error in the stream. Not a problem, just reporting it in case we (the app) cares. In this case, we don't. */ if (ret != OV_HOLE) { if (priv[0].mode & 1) ov_time_seek(&priv[0].vf, 0); /* repeat */ else priv[0].eof = 1; /* stops */ } } else { /* we don't bother dealing with sample rate changes, etc, but you'll have to */ priv[0].pcm_indx += ret >> 1; /* get 16 bits samples */ } } else priv[0].flag = 1; } if (priv[0].flag == 1) { if (ASND_StatusVoice(0) == SND_UNUSED || first_time) { first_time = 0; if (priv[0].vi->channels == 2) { ASND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0, (void *) priv[0].pcmout[priv[0].pcmout_pos], priv[0].pcm_indx << 1, priv[0].volume, priv[0].volume, ogg_add_callback); priv[0].pcmout_pos ^= 1; priv[0].pcm_indx = 0; priv[0].flag = 0; } else { ASND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0, (void *) priv[0].pcmout[priv[0].pcmout_pos], priv[0].pcm_indx << 1, priv[0].volume, priv[0].volume, ogg_add_callback); priv[0].pcmout_pos ^= 1; priv[0].pcm_indx = 0; priv[0].flag = 0; } } } usleep(10); } ov_clear(&priv[0].vf); priv[0].fd = -1; priv[0].pcm_indx = 0; return 0; } void StopOgg() { ASND_StopVoice(0); ogg_thread_running = 0; if(h_oggplayer != LWP_THREAD_NULL) { if(oggplayer_queue != LWP_TQUEUE_NULL) LWP_ThreadSignal(oggplayer_queue); LWP_JoinThread(h_oggplayer, NULL); h_oggplayer = LWP_THREAD_NULL; } if(oggplayer_queue != LWP_TQUEUE_NULL) { LWP_CloseQueue(oggplayer_queue); oggplayer_queue = LWP_TQUEUE_NULL; } } int PlayOgg(char * buf, int buflen, int time_pos, int mode) { StopOgg(); private_ogg.fd = mem_open(buf, buflen); if (private_ogg.fd < 0) { private_ogg.fd = -1; return -1; } private_ogg.mode = mode; private_ogg.eof = 0; private_ogg.volume = 127; private_ogg.flag = 0; private_ogg.seek_time = -1; if (time_pos > 0) private_ogg.seek_time = time_pos; if (ov_open_callbacks((void *) &private_ogg.fd, &private_ogg.vf, NULL, 0, callbacks) < 0) { mem_close(private_ogg.fd); /* mem_close() can too close files from devices */ private_ogg.fd = -1; ogg_thread_running = 0; return -1; } if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread, &private_ogg, oggplayer_stack, STACKSIZE, 80) == -1) { ogg_thread_running = 0; ov_clear(&private_ogg.vf); private_ogg.fd = -1; return -1; } return 0; } void PauseOgg(int pause) { if (pause) { private_ogg.flag |= 128; } else { if (private_ogg.flag & 128) { private_ogg.flag |= 64; private_ogg.flag &= ~128; if (ogg_thread_running > 0) { LWP_ThreadSignal(oggplayer_queue); } } } } int StatusOgg() { if (ogg_thread_running == 0) return -1; /* Error */ else if (private_ogg.eof) return 255; /* EOF */ else if (private_ogg.flag & 128) return 2; /* paused */ else return 1; /* running */ } void SetVolumeOgg(int volume) { private_ogg.volume = volume; ASND_ChangeVolumeVoice(0, volume, volume); } s32 GetTimeOgg() { int ret; if (ogg_thread_running == 0 || private_ogg.fd < 0) return 0; ret = ((s32) ov_time_tell(&private_ogg.vf)); if (ret < 0) ret = 0; return ret; } void SetTimeOgg(s32 time_pos) { if (time_pos >= 0) private_ogg.seek_time = time_pos; } core/sound/000700 001750 001750 00000000000 12703321515 013745 5ustar00sergiosergio000000 000000 sdl/CHANGELOG.txt000664 001750 001750 00000121241 12702465756 014533 0ustar00sergiosergio000000 000000 -------------------- Genesis Plus History -------------------- All recent changes were backported from the GX version (Gamecube/Wii port), maintained by Eke-Eke. Please look at http://code.google.com/p/genplus-gx/ for more infos. --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.4 (21/06/2013) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * fixed access to read-only registers on Main-CPU side ("Batman Returns" platform level freeze) * fixed & improved emulation of PRG-RAM write protection register ("Lunar Eternal Blue" japanese version freeze) * improved SUB & MAIN-CPU synchronization ("Dracula Unleashed" freeze when using US Model 2 BIOS) * improved CPU polling detection * improved CDD emulation & added CD drive access time for SEEK command ("Panic!/Switch" intro missing scene) * added missing reinitialization of MAIN-CPU PRG-RAM bank on reset * added .OGG audio tracks support through LIBTREMOR [Core/Sound] --------------- * fixed YM2612 configurable DAC depth emulation * improved Low-Pass filter * added optional "MONO" output mode [Core/VDP] --------------- * fixed FIFO access timings when using invalid write code value ("Clue" menu) * fixed DMA Copy with undocumented code value ("Fatal Labyrinth" end sequence) * minor code fixes & optimizations [Core/CPU] --------------- * optimized 68k stack read/write functions * fixed broken 68k address error emulation * fixed 68k interrupt behavior (prevents interrupts from being executed multiple time when 68k is halted) * fixed Z80 registers initial state, added proper initialization when using PBC (verified on real hardware by Charles McDonald) [Core/MD] --------------- * fixed SRAM incompatibilities between BIG ENDIAN & LITTLE ENDIAN platforms (note: this breaks old .srm files with LITTLE ENDIAN platform ports) * added support for a few recently dumped unlicensed games * added auto-detection of byte-swapped ROM files --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.3 (26/11/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- no win32/SDL port changes --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.2 (24/11/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added default TOC for Shadow of the Beast II (prevent hangs when audio tracks are missing) * fixed CD-DA fader muting * fixed PCM channels panning on reset * fixed backup RAM file management when using disc swap with Mode 1 cartridge * incremented CD drive read latency: fixes Space Adventure Cobra (freeze when opening coffin at 2nd morgue scene) * improved CDD emulation accuracy: fixes Snatcher (freeze at the end of Act 2) & various CD player bugs * improved MAIN-SUB memory map mirroring in SCD mode (verified on real hardware by Charles McDonald) * implemented cycle-accurate "stopwatch" register emulation [Core/Sound] --------------- * fixed broken PSG noise frequency * fixed incorrect Game Gear PSG stereo emulation * implemented cycle-accurate Game Gear PSG stereo [Core/VDP] --------------- * fixed broken VDP DMA from SVP ROM latency (graphic errors in Virtua Racing) [Core/MD] --------------- * added Super Mario World 64 (unlicensed) cartridge hardware emulation [Core/Input] --------------- * added automatic detection for CD games with Justifier/Menacer support * improved Justifier/Menacer emulation --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.1 (13/10/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added support for CUE files * added CD-DA tracks emulation (needs CUE+BIN or ISO+WAV images) * added CD fader emulation * added CDD "Fast FW" & "Fast RW" commands emulation * improved CDD TOC emulation (random freezes in Sonic CD, Switch/Panic, Final Fight CD and probably many others) * improved PCM chip synchronization with SUB-CPU (missing speeches in Willy Beamish) * fixed PCM chip emulation (random hangs in Snatcher, missing sound effects in Switch/Panic, Final Fight CD, Wonderdog...) * fixed Word-RAM memory mode on soft-reset (missing logo gfx effects) * fixed SUB-CPU access to unused areas when using PC-relative instructions (Final Fight CD first boss random crash) * fixed CPU idle loop detection on memory mode register access (Pugsy CD first boss slowdown) * fixed Mode 1 emulation (cartridge boot mode) [Core/Sound] --------------- * replaced FIR resampler by Blip Buffer for FM resampling * modified SN76489 core for use of Blip Buffer * improved PSG & FM chips synchronization using Blip Buffer * added Game Gear PSG stereo support * fixed SG-1000 specific PSG noise * fixed YM2612 LFO AM waveform (California Games surfing event) * fixed YM2612 phase precision * minor optimizations to YM2612 core [Core/Game Gear] --------------- * added support for CJ Elephant Fugitive (recently released by SMS Power) * added Game Gear extended screen option [Core/Genesis] --------------- * added support for a few recently dumped (but unreleased) games [Core/General] --------------- * improved ROM & CD image file loading * various code cleanup --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.0 (01/07/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added Mega CD / Sega CD hardware emulation (incl. Sub 68K, CDD, CDC, PCM, GFX rotation/scaling, etc) * added .ISO & .BIN CD image file support * added 512K backup cartridge RAM support * added savestate support for CD games NOTES: ~~~~~~ * to play CD games, original BIOS ROM files are required in /genplus/bios/ directory: unzip & rename them to bios_CD_U.bin, bios_CD_E.bin, bios_CD_J.bin * CD audio tracks (CD-DA) are not supported (yet) [Core/CPU] --------------- * modified 68k core for Mega CD / Sega CD support * optimized 68k core using prebuild const tables [Core/VDP] --------------- * improved DMA accuracy * improved accuracy of nametables register & VSRAM writes during HBLANK: fixes "The Adventures of Batman & Robin" (graphical issues during 2nd Boss fight). * added support for 8-bit VRAM writes with undocumented code value (verified on real hardware by Nemesis) [Core/Sound] --------------- * improved synchronization between SN76489 & YM2162 cores. * improved accuracy of SN76489 core timings. [Core/MD] --------------- * added support for some recently dumped unlicensed games. * improved emulation of 32k bankswitch hardware used by a few unlicensed games. * fixed behavior of Z80 banked reads from 68k RAM (verified on real hardware). * fixed support for 128K Pro Action Replay ROM. [Core/MS] --------------- * added support for all recent korean ROM dumps by SMS Power. * added emulation of korean multi-game mapper (4-Pak All Action) * added pseudo-random RAM pattern initialization on Mark-III and Japanese Master System (fixes "Alibaba and 40 Thieves" & "Block Hole") * added port $3E emulation & internal BOOTROM support (Master System & Game Gear only). [Core/General] --------------- * added an option to set VDP mode (PAL/NTSC) independently from console region. * added an option to select original system master clock frequency (PAL/NTSC/AUTO), emulation will run at selected frequency when VSYNC is disabled. * fixed 68k context loading/saving (Sol Deace). * fixed C89 incompatibilities for better portability. * removed use of "long int" type for portability on 64-bit platforms. * moved savestate zlib compression out of emulation core (for ports that don't use it). * various optimizations. [Gamecube/Wii] --------------- * removed ROM load device selection from Load Menu: default ROM device must now be configured in menu settings. * added specific load buttons, browsers & saved paths for each systems, this also fixes slowdowns caused by screenshot loading when browsing from slow devices. * added support for left/right buttons as page up/down keys in ROM browsers * added right analog stick as default "return to menu" key for Gamecube controllers * added alternate remappable menu key combo for Gamecube controllers * added an option to disable VSYNC (emulator is synced with audio hardware instead of video). * added an option to boot system from "BIOS", with or without cartridge. * added Master System & Game Gear "BIOS" support (files should be named bios_U.sms, bios_J.sms, bios_E.sms & bios.gg and copied to /genplus/bios directory). * replaced "Hard Reset" button by a Soft Reset for systems having a Reset button (Mega Drive / Genesis & Master System) * State & SRAM files are now only compressed when saving to Gamecube Memory Cards * various fixes & cleanup. * compiled with devkitPPC r26 & libogc 1.8.11. [Gamecube] ---------- * improved progressive mode support when component cable is detected (hold B during startup to switch menu video mode configuration) --------------------------------------------------------------------------------------------------------- [07/08/2011] version 1.6.0 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/Sound] --------------- * added YM2413 emulation in Master System compatibility mode. * fixed SN76489 noise boost initialization. * minor YM2612 core optimizations. [Core/VDP] --------------- * added accurate emulation of SG-1000, Master System (315-5124, 315-5246) & Game Gear VDP. * added support for all TMS9918 rendering modes. * improved Mega Drive VDP timings accuracy in Master System Compatibility mode. * fixed color palette initialization. * fixed shifted sprites rendering in Mode 4. * modified pixel rendering support (pixel depth is now forced at compilation time). [Core/CPU] --------------- * optimized 68k core (rewrote 68k interrupt handling, removed multiple CPU types support & unused code) for 5~8% speed improvment [Core/IO] --------------- * added accurate emulation of Master System (315-5216, 315-5237, 315-5297) & Game Gear I/O controllers. * added Terebi Oekaki tablet emulation. * improved Mouse emulation (fixes mouse support in Cannon Fodder). * improved Justifier emulation (fixes gun support in Lethal Enforcers 2). * improved 6-Buttons control pad emulation (fixes Duke Nukem 3D) * modified lightgun emulation to use common key inputs for all devices. * 2-buttons controller is now picked by default for Master System games. [Core/MD] --------------- * added copy-protection hardware emulation for some new dumped games (Tiny Toon Adventures 3, Mighty Morphin Power Rangers & The Battle of Red Cliffs). * added Game Toshokan in EEPROM database (verified on real cartridge). * fixed Micro Machines 2 - Turbo Tournament EEPROM size (verified on real cartridge). * modified SRAM banswitch hardware emulation to be more compatible with some hacks. [Core/MS] --------------- * added Cyborg Z to Korean mapper database. [Core/GG] --------------- * added 93C46 EEPROM emulation (Majors Pro Baseball, World Series Baseball & World Series Baseball 95). [Core/General] --------------- * added support for .mdx ROM format. * added Game Gear & SG-1000 ROM support. * added accurate emulation of SG-1000, Master System (I, II) & Game Gear hardware models for 100% compatibility. * updated to new Genesis Plus license (see http://cgfm2.emuviews.com/) * removed DOS port * various code cleanup. --------------------------------------------------------------------------------------------------------- [31/03/2011] version 1.5.0 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/VDP] --------------- * added support for Master System compatibility mode (Z80 ports access mode), incl. Mode 5 rendering. * added Mode 4 rendering for both Genesis & Master System modes. * added alternate BG planes rendering functions (should be faster on PPC architectures). [Core/IO] --------------- * added support for Master System compatibility mode (Z80 ports access mode). * added Master System peripherals emulation (Control Pad, Paddle, Sports Pad & Light Phaser). * added XE-1AP (analog controller) emulation. * added Activator emulation. [Core/Extra] --------------- * added support for all known Master System cartridge mappers. * added copy-protection hardware emulation for a few MD unlicensed games: fixes 777 Casino (crash when talking to bunny girls). (NB: most of those unlicensed games seem to have been already patched by ROM dumpers, main purpose is documenting them) * added support for Top Shooter arcade board controller. (A=Shoot, B=Bet, C/RIGHT=Coins, START=Start, hold UP on startup to enter service mode) * improved King of Fighters 98 mapper emulation (registers address decoding is now 100% accurate) * fixed Game Genie when several codes affect same ROM address. * fixed EEPROM types for Brian Lara Cricket & NBA Jam TE (verified on real cartridges) [Core/General] --------------- * added Master System compatibility mode emulation (automatically enabled when loading ROM file with .sms extension). * improved savestate stability & compatibility (support for old 1.4.x savestates is preserved) * various code cleanup & comments. --------------------------------------------------------------------------------------------------------- [04/12/2010] version 1.4.1 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/Sound] --------------- * implemented Blargg's blip buffer in SN76489 core (all channels are now lineary interpolated) [Core/VDP] --------------- * improved 2-cell vscroll emulation accuracy, as verified on real hardware (Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge) * improved VBLANK flag accuracy, as observed on real hardware. * improved DMA operations accuracy, writes are now performed on a scanline basis: fixes Gaiares (flickering title screen). * improved DMA Fill timing accuracy. * fixed DMA with bad code values: fixes Williams Arcade Classics (corrupted gfx after soft reset). * fixed horizontal resolution changes during HBLANK: fixes Bugs Bunny in Double Trouble (2nd stage). * fixed Vertical Counter in interlace mode 1, as observed on real hardware. * fixed horizontal border width, as observed on real hardware. * various code improvments & optimizations. [Core/CPU] --------------- * fixed state of Z80 registers on reset (sound issues with Defender & Defender 2 in Williams Arcade Classics) * implemented 68k undocumented flags behavior for DIVU/DIVS instructions (Bloodshot / Battle Frenzy) [Core/Extra] --------------- * improved emulation of copy-protection hardware found in some unlicensed cartridges (Mulan, Pocket Monsters II). * enabled simultaneous use of multitap & J-CART (Super Skidmarks 6-player mode) * improved savestate format: added DMA, SVP, cartridge mapping & internal registers state informations * improved unlicensed ROM mappers emulation * added Chinese Fighters III mapper support * added Top Fighter mapper support * fixed Barver Battle Saga mapper support * fixed cartridge hardware soft-reset (Game Genie, SVP, ...) * fixed Game Genie registers byte reads ---------------------------------------------------------------------------------------------------------------------------------------------------- [06/30/10] version 1.4.0 (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- [Core/Sound] * completely rewrote sound processing/mixing: sound chips are now clocked with exact output framerate to ensure 100% smooth video & audio playback, with no lag or skipping, while rendering an accurate number of samples per frame and keeping PSG & FM chips in sync. * improved PSG & FM chips synchronization with CPU execution (fixed point precision). * improved YM2612 core general accuracy (SSG-EG, CSM mode,...) (based upon Nemesis recent tests on real hardware) * improved YM2612 LFO emulation accuracy: fixes "Spider-Man & Venom : Separation Anxiety" (intro) * fixed YM2612 bug with Timer B: fixes "Langrisser Hikari II"/"Der Langrisser II" (Sega logo) * fixed YM2612 context saving/loading. * fixed YM2612 state on reset. * removed outdated & less accurate Gens YM2612 core * added configurable YM2612 DAC resolution emulation. * added configurable & faster FIR resampler (thanks to Blargg & AamirM), removed libsamplerate support. * added configurable Low-Pass filtering * added configurable 3-Band Equalizer (thanks to Neil C). * added an option to boost SN76489 Noise Channel. * adjusted SN76489 cut-off frequency. [Core/VDP] * added support for CRAM writes during horizontal blanking (Striker, Zero the Kamikaze Squirrel,...) * added support for 2-Cell vertical scrolling in Interlaced 2 mode * added support for some undocumented mode register bits * added proper emulation of HV Counter latch: fixes Sunset Riders intro * added pixel-accurate emulation of mid-line display on/off (Nigel Mansell World Championship PAL, Ren & Stimpy's Invention PAL,...) * improved FIFO timings accuracy: fixes Sol Deace intro * improved sprite masking accuracy (thanks to Nemesis for his test program) * improved sprites processing accuracy: fixes (un)masked sprites in Mickey Mania (3D level), Sonic 2 (VS mode). * improved HBLANK flag timing accuracy: fixes Mega Turrican (Sky level) * improved horizontal blanking & HINT/VINT occurence timing accuracy, as measured on real hardware. * improved HCounter accuracy in 40-cell mode, as measured on real hardware. * improved color accuracy in VDP highlight mode to match results observed on real hardware [Core/CPU] * updated Z80 core to last version (fixes interrupt Mode 0 timing and some BIT instructions). * fixed some Z80 instructions timing. * improved Z80 interrupt accuracy * improved 68k accuracy (initial Reset timing + auto-vectored interrupts handling). * improved 68k timing accuracy for DIVU/DVIS (thanks to Jorge Cwik) & MULU/MULS instructions. * improved Z80 & 68k cpu execution/synchronization accuracy by using Master Clock as common reference (now run exactly 3420 M-Cycles per line). * modified Z80 & 68k cores to directly use external cycle count instead of intermediate counters. [Core/Extra] * added Game Genie hardware emulation (Game Genie ROM is now fully supported). * added Action Replay hardware emulation (Action replay ROM is now fully supported). * added S&K "Lock-On" hardware emulation (you can "lock" any games to Sonic & Knuckles). * added Cartridge "hot swap" feature. * added missing EEPROM support in some games. * added accurate TMSS emulation (VDP lock-out) * fixed Realtec mapper emulation: fixes missing sound in Balloon Boy / Funny World. * fixed lightgun auto-detection: fixes default cursor position in Lethal Enforcers II. * lots of code cleanup, bugfixes & optimization. ---------------------------------------------------------------------------------------------------------------------------------------------------- [12/14/08] version 1.3.0 (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * YM2612 bugfixes (MAME core): .fixed EG Decay->Substain transition when SL & DR are minimals: fix tracks #3 and #9 in "Mega Turrican" .fixed a bug in SSG-EG emulation code: fix Level 1 music in "Alisia Dragoon" .modified SSG-EG Decay End Level: fix some sound effects (ChainSaw, Zap...) in "Beavis & Butthead" .improved Detune overflow accuracy: fix very high frequency sounds in many games .fixed registers 0x20-0x26 Reset state: fix intro music in "B.O.B" .reverted incorrect fix with KEY ON: fix "Flamethrower" sound effect in "Alien 3" and many others * adjusted HCounter values: fixes line flickering in "Sonic 3D" bonus stage * adjusted VINT timing: fixes hang-up in "V.R Troopers" * improved HBLANK flag accuracy: fixes line flickering in "Gouketsuji Ichizoku" * fixed broken Z80 access to WRAM: fixes hang-up in "Mamono Hunter Youko" * modified JCART emulation: fixes corrupted tracks logo in "Micro Machines 2" * added Blargg's NTSC Filters support (NTSC video artifacts emulation) * optimized VDP rendering core, rewrote 68k interface (memory handlers, cycle execution, interrupts): greatly improved emulation speed ---------------------------------------------------------------------------------------------------------------------------------------------------- [08/26/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * YM2612(MAME): fixed LFO phase update for CH3 special mode: fix sound effects in Warlock & Aladdin (thanks to AamirM) * YM2612(MAME): fixed EG attenuation level on "KEY ON": fix Ecco 2's splash sound * YM2612(MAME): fixed SSG-EG emulation: fix Bubba'n Stix (Track 5) and many others * YM2612(MAME): replaced sample interpolation with libsamplerate support, High Quality mode is now more accurate * implemented cycle-accurate HINT timings: every timing sensitive games/demos are now *finally* working fine * fixed a bug affecting CRAM/VSRAM DMA timings * fixed Sprite Attribute Table address mask for VRAM writes * improved accuracy of 68k access to Z80: fix music in Pacman 2 when entering PAUSE menu * disabled "Address Error" emulation when UMK3 hack is loaded: fix game crashing after a round ends up * added support for some more unlicensed games: Pocket Monster, King of Fighter 98, Soul Blade (credits to Haze) * improved Menacer emulation: fix lightgun support in Body Count & T2: The Arcade Game * added Konami Justifier emulation: fix lightgun support in Lethal Enforcers 1 & 2 * added Sega Mouse emulation (Populous 2, Body Count, Shangai 2, Fun'n Games, ...) ---------------------------------------------------------------------------------------------------------------------------------------------------- [07/16/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * adjusted (again) HINT timings: fix Double Dragon 2 (game freezed), hopefully does not break anything else * fixed broken EEPROM support for Codemaster games * modified input update timings: fix Dungeons & Dragons * Warriors of the Eternal Sun (thanks to Notaz) * added support for "Ultimate Mortal Kombat Trilogy" hack (max. size supported is 10MBytes) * added (VERY) preliminar support for PICO roms (credits to Notaz for his documentation) * improved YM2612 emulation (credits to Nemesis for his tests on real hardware): .implemented phase overflow emulation: improved fix for special music instrument used in Comix Zone, Flashback, Ariel, Shaq Fu... .improved SSG-EG emulation in MAME core (also based on additional code from Alone Coder) .improved Timers emulation accuracy .improved Enveloppe Generator accuracy .fixed Channel 3 CSM mode emulation .implemented sample interpolation in MAME core to emulate the chip at original frequency (HQ YM2612 mode, from gens) ---------------------------------------------------------------------------------------------------------------------------------------------------- [06/01/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * improved HCounter accuracy: fix graphic glitches in "Striker (Europe)" * improved HINT timing accuracy: fix flickering in "Zero The Kamikaze Squirrel (USA)" * improved rendering accuracy when backdrop color is modified during HBLANK (Road Rash I/II/III) * fixed broken Game Genie support ---------------------------------------------------------------------------------------------------------------------------------------------------- [04/19/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * modified VINT timings a little bit: fix lockup during Desert Strike's intro * corrected 68k interrupts handling: fix graphic glitches in Darius II/Sagaia ---------------------------------------------------------------------------------------------------------------------------------------------------- [04/06/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * updated SVP core: fix some perspective issues in Virtua Racing (thanks to Notaz) * added internal SAT update during VRAM Fill: fix unmasked sprites during Battletech's intro * fixed m68k core issues with gcc 4.2.3: fix Xperts, Lemmings 2, M1 Abrams Battle Tank * forced YM2612 Enveloppe update: fix intro music in Batman&Robin (thanks to Aamir) ---------------------------------------------------------------------------------------------------------------------------------------------------- [03/01/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * added SVP emulation: Virtua Racing is now emulated (big thanks to Notaz and TascoDeluxe) * fixed VDP registers behaviour when VDP Mode 4 is enabled: fix Bass Masters Classic Pro, Captain Planet & The Planeeters * corrected a bug in DMA Fill operation: fix James Pond 3, Rockman World/Megaman Willy Wars (corrupted VRAM) * corrected typo errors in CPU cycle counters update: fix optiom screen music in "College Slam" and probably others games. * added preliminary support of undocumented YM2612 bug: fixes soundtracks of Shaq Fu, Spiderman, Comix Zone, Ariel and some others * added support for mappers & copy protection devices used in many unlicensed/pirate cartridges (see cart_hw.c for details) * rewrote memory handlers for better modularity and some (little) speedup * reduced Savestate size ---------------------------------------------------------------------------------------------------------------------------------------------------- [01/07/08] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * fixed interleaved rom detection: roms with .smd extension should now work fine * fixed a recently introduced bug in VDP registers writes: fixes bad colors in Toy Story (intro) * updated list of games using EEPROM: added Sports Talk Baseball (internal memory check fixed) and Brian Lara Cricket * fixed VINT flag update when VINT is disabled: fixes NCAA College Football * adjusted DMA timings in H32 mode: fixes flickering in Out of this World, Kawasaki Superbike Challenge & Formula One * adjusted line rendering and HBLANK timings: fixes flickering in Nigel Mansell's World Championship Racing, Deadly Moves/Power Athlete * fixed unmapped ROM reads through Z80 Bank: fixes Zombie High (Proto) * added support for custom ROM/RAM mapping used by Game no Kanzume Otokuyou ---------------------------------------------------------------------------------------------------------------------------------------------------- [12/28/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * many sourcecode cleanup and optimization * completely rewrote EEPROM emulation: now support all known EEPROM types (24C01-24C65) and mappers (Sega, Acclaim, EA, Codemasters) used in a few games (now use internal game database) as external RAM. This should at least fix save support in the following games: . NBA Jam (alternate Acclaim mapper) . College Slam, Frank Thomas Big Hurt Baseball (24C65 type) . NHLPA Hockey 93, Rings of Power (EA mapper) . Micro Machines serie, Brian Lara Cricket 96/Shane Warne Cricket (Codemasters mapper) * external RAM is now initialized to 0xFF by default: fix Micromachines 2, Dino Dini Soccer * fixed SRAM 16-bits memory handlers: fix some Sega Sports and EA Sports games (NFL95, NBA Action 95, NHL97, NHL98,...) * modified WRITE_xxx & READ_xxx macros for better portability and faster memory access on BIG ENDIAN platform * completely rewrote BIG ENDIAN support in render.c and vdp.c: rendering should be a little faster * rewrote ROM bankswitch emulation (Super Street Fighter II): ROM access are faster, using memory pointers instead of reading ROM copy from ARAM * fixed leftmost Window/PlaneA column render and implemented Window bug (as described by Charles Mc Donald) * improved "Sprite Limit" and "Sprite Collision" detection accuracy * modified RGB565 Color Palette to use the full available color range (0-31;0-63) * implemented "cycle accurate" HV Interrupt timings: fix Sesame's Street Counting Cafe, Legend of Galahad (intro) * improved VDP access timings accuracy (added FIFO emulation): fix Double Clutch * improved DMA timings accuracy: fix Winter Olympics (E), Arch Rivals and probably more * fixed HCounter again: Road Rash serie (I,II,III) don't need timing hacks anymore * fixed VCounter in Interlaced 2 mode: fix Combat Cars "VS-Mode" * improved Interlaced 2 mode (double resolution) rendering: Sonic 2, Combat Cars ("VS-Modes") look far better * added TMSS BIOS support (optional) * rewrote part of the YM2162 MAME's core: fixed internal FM timers handling, removed non-YM2612 emulation code and unused multiple cpu support * implemented "cycle accurate" FM timers & sound samples rendering * improved Z80 Interrupt timing accuracy: fix Sonic 3 music slowdowns * updated Z80 & 68000 cores to last MAME versions * improved Soft Reset emulation: X-Men 2 and Eternal Champions (random character selection) now work more like on real hardware. * added full overscan emulation (vertical & horizontal borders) for "pixel perfect" aspect ratio (tested against a real genesis) ---------------------------------------------------------------------------------------------------------------------------------------------------- [07/20/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * corrected TeamPlayer support: fix multiplayer in Gauntlet 4 (Sept. version), Pengo and a lot of others * added J-Cart support: enable multiplayer in Codemasters games (Pete Sampras, Micromachines games, Super Skidmarks) * added serial EEPROM autodetection: fix games with bad SRAM informations in header (NBA Jam TE) * added SVP faking: display 2D graphics in Virtua Racing (the game is however still unplayable) * added support for more internal IO registers: fixe some unlicensed games (Wisdom Tree games...) * added preliminary support for unmapped protection device: fix some unlicensed games with special built-in hardware (Squirell King, Lion King 2...) * added "Soft Reset" combo (in game, use L+Z triggers): this should be like pressing the RESET button on a real Genesis and this is required in some games to enable special features or even complete the game (ex: X-Men). ---------------------------------------------------------------------------------------------------------------------------------------------------- [06/21/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * added Multitap support (EA 4-Way Play and Sega Teamplayer): allowed up to four players in games supporting those peripherals * added partial Sega Menacer lightgun support (use Analog Stick): automatically set when detecting the 6-in-1 Menacer game ---------------------------------------------------------------------------------------------------------------------------------------------------- [05/18/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * you can now switch between FM cores without reseting the game. FM registers value are automatically restored when switching. * removed the previous VINT timings modification because it brokes some games (Rocket Knight, Thunderforce III,...) * added automatic Timing configuration (VDP latency, VINT timing & alternate Line Timing) at game loading, based upon specific romname detection. This means you can still modify some of these options afterwards but they are now automatically set/unset when loading a game which need special timing fixes. These fixes are also automatically desactivated when the current game doesn't need them. For information, games that are actually detected and need special timings to run properly are: .Legend of Galahad & Road Rash series (single line not rendered properly) .Sesame Street Counting Cafe (don't boot) .Chaos Engine/Soldiers of Fortune (graphic glitches on scrolling) ---------------------------------------------------------------------------------------------------------------------------------------------------- [05/08/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * VINT timings are now a little more accurate: fixes Sesame's Street Counting Cafe * SN76496 MAX_OUTPUT back to normal * modified FB_WNOISE value in SN76496 core according to John Kortink's last informations * added support for Maxim's PSG core, same as used in SMSPLUS (it becomes the default PSG core) * updated FM core to the latest MAME version * corrected DAC output level (fixes voices and some special FX being too low) * added support for Gens YM2612 (FM) core (MAME's one still remains default FM core) * added configurable preamplification for each sound cores (see Emulator Options) * added some other configurable sound options (boost overall volume, FM improvment for Gens YM2612) ---------------------------------------------------------------------------------------------------------------------------------------------------- [04/11/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * corrected MAX_OUTPUT value in SN76496 core: fix PSG sound (SFX) volume ---------------------------------------------------------------------------------------------------------------------------------------------------- [03/17/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * added an option to enable alternate line rendering timing (fix single line error in Road Rash series and Legend of Galahad's Intro) * Color RAM update now always reset color 0 to border color (fix color glitches in Mortal Kombat,...) (thanks to Noop's for the idea) ---------------------------------------------------------------------------------------------------------------------------------------------------- [03/09/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * modified HV counter tables (fix graphic glitches in Skitchin's sky, Lotus 2 Recs, Panorama Cotton, Dashin Desperados & maybe more) * completely rewrote DMA timings emulation so that it works for all games (no more cpu freezing) * added all DMA tranfer rates handling for each three DMA modes and added dma busy flag emulation * modified interrupts handling on VDP register #0 and #1 writes (fix Lemmings status bar) * added VDP RAM write latency (fix Chaos Engine/Soldier of Fortune gfx glitches) * modified FM timers handling a bit (fix Vectorman2 music) * corrected Sprite Limit rendering (fix Sonic 1 & Micromachines 2 title screens) * corrected IO Registers writes (fix Decap' Attack controls, no more need for alternate input) * corrected 6 Buttons Pad emulation (fix 6buttons detection in Mortal Kombat 3, Comix Zone and other 6-buttons compatible games) * modified sound mixing a bit according to Generator sourcecode (FM and PSG ratios seems more correct) ---------------------------------------------------------------------------------------------------------------------------------------------------- [02/07/07] (Eke-Eke) ---------------------------------------------------------------------------------------------------------------------------------------------------- * fixed fm timers (fix missing music in Castle of Illusion, Quackshot, Undead Line, Wonderboy in Monster Lair, Cal 50, Turbo Outrun, Thundeforce 4 and maybe more) * added complete EEPROM emulation (save support now works fine in Wonderboy5, Megaman Willy Wars, NBA Jam...) (credits to Notaz, adapted from Picodrive code) * added preliminar dma timing emulation (fix bottom screen in Legend of Galahad) (credits to Notaz, adapted from Picodrive code) * hack: clear Vint pending after Hint (INT level 4) acknowledge (fix Fatal Rewind) * hack: modify read_bus16 to return a random value (fake fetch) (fix Time Killers) * modified cpu execution timings, with more correct hblank and interrupts timing (fix ISS Deluxe, Double Dragon 2 and certainly more) (Based on Gens code) * modified busreq mechanism: better synchro between z80 & 68k (no need to dejitter anymore) (Based on Gens code) * added sprite collision detection (fix Strider 2) * modified dma fill operation for big endian platform (fix Contra Hardcorps gfx garbage) ---------------------------------------------------------------------------------------------------------------------------------------------------- [05/25/03] (Charles MacDonald) ---------------------------------------------------------------------------------------------------------------------------------------------------- * Fixed a typo that made Z80 banked access to the VDP registers always fail. ---------------------------------------------------------------------------------------------------------------------------------------------------- [05/17/03] (Charles MacDonald) ---------------------------------------------------------------------------------------------------------------------------------------------------- * Modified the rendering code to handle unaligned longword access to memory. ---------------------------------------------------------------------------------------------------------------------------------------------------- [04/20/03] (Charles MacDonald) ---------------------------------------------------------------------------------------------------------------------------------------------------- * Modified 68000 emulator to prevent 'tas.b $mem' from writing data back after a read (fixes Gargoyles). * Fixed bug in 68000 emulator to swap order of words written for address register indirect pre-decremented writes (fixes Jim Power graphics). * Added support for 240-line displays (for Super Skidmarks). * Rewrote part of the interrupt handling (fixes some raster effects). * Removed sprite collision detection code (never really worked). * Optimized sprite rendering inner loop. ---------------------------------------------------------------------------------------------------------------------------------------------------- [04/13/03] (Charles MacDonald) ---------------------------------------------------------------------------------------------------------------------------------------------------- * Finished up memory map for VDP DMA V-bus reads. * Fixed handling of 68000 writes to I/O chip at even addresses. * Fixed bit 7 handling of control register in I/O chip. * Finished up Z80 memory map. * Added code to handle Genesis hardware lock-ups. * Removed some faulty code from the 68000 memory map handlers. ---------------------------------------------------------------------------------------------------------------------------------------------------- [03/22/03] (Charles MacDonald) ---------------------------------------------------------------------------------------------------------------------------------------------------- * Completed implementation of Z80 banked memory handlers. libretro/Makefile.common000664 001750 001750 00000001261 12702465756 016471 0ustar00sergiosergio000000 000000 GENPLUS_SRC_DIR := $(CORE_DIR)/core \ $(CORE_DIR)/core/z80 \ $(CORE_DIR)/core/m68k \ $(CORE_DIR)/core/ntsc \ $(CORE_DIR)/core/sound \ $(CORE_DIR)/core/input_hw \ $(CORE_DIR)/core/cd_hw \ $(CORE_DIR)/core/cart_hw \ $(CORE_DIR)/core/cart_hw/svp SOURCES_C = $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c)) \ $(foreach dir,$(TREMOR_SRC_DIR),$(wildcard $(dir)/*.c)) \ $(LIBRETRO_DIR)/libretro.c SOURCES_C += $(LIBRETRO_DIR)/scrc32.c INCFLAGS += $(foreach dir,$(GENPLUS_SRC_DIR),-I$(dir)) -I$(LIBRETRO_DIR) gx/images/Ctrl_mastertap.png000664 001750 001750 00000014236 12702465756 017303 0ustar00sergiosergio000000 000000 PNG  IHDRL`fsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time06/17/146 IDATx{pSם?J%66cB0Xԡ4Є-v2m:xiISMv[M&lҴf4 !q1 l0S0ƶ,[eYq;I̝{=ι\N9AgKC QAEH wF2Xu~HEJJT瀉;N KP#k 9L K~D-G&dS6 8 `=6l( [ҕB}'e1 ~脭&TTҌ@*aKNB6ď!uX^N_j}kAI@=My>$!kRrS @2YmC(kJ kWSw'nC@Ȇj-r?fDn6߀*"|aÄ #} 1@Yj.dZ L iCQ*‚/Țmd#:rNSaCZFp00 JFl= Dn1CÆc,BDahw#_S¢IY9v䦙D#7QȤF"p7I/,ѷZW\~/_xtFra@KOO?ڪU7:BJVQQQ1uTRSS z{{iiiܹs9srrڵ! rP ~_t)c o}7x?_xz~@ Oz+a`ʕ8μ5k֬@! ( BaMMM>g&N8RHOO{E )Ȥ{rJXcc=Ja󀼼o_iii "n*/^իyg"-"bv˟'|Mml P^^Ν;9~86 Q7nO<ӧOgݺu_yXr%^` ))o4L$&NHbb".\^Nl3A!HMM ---^Ӛŋ:u*)))?7R\\ݻ`۶mKdggcqw3vXf3w^={6(ruuVLjj*/^0`467nˌ7A5j@DA`ԩtvvo}Rf͚źu )#&&gyh~_i&~jfL6fn70k,8h$&&nA@E|>z,hjj [dn7.df3PXXȂ X`&M"66XRSSx}:׋nI0L͗%IKKj~&LMO4,''{Q1$&&HOO'''lb$}a28p.^ٳg|Az}ǎ;tIIIz$$$x4>C=Dkk+& áx<3Lyyy8=''d2a0N|>>ɓ'illD$عs'B׳cXz5nz=@hA.f35k4cuV\.~J$"Ν墳S3 jn$&L={XjU8-I>裌7.:;;ꢥ28˗q:tuuqMYbfO<իtwwՅ^vp8ZGv1LΟ?˗)..fƍ$$$eӧOҥKF, ^h|>f?EQDE<&ꨯ,ST hB<[UUݧ 8q"_)--E3aDGG3j(***())}{瓐餲@ jeڵ8qBNʲe(++t2|\.===EQD$MLn7'N 77whtfjjjzz{{zDQ… \..]Bvff&OfӦM$W.\/LII +Wd=z 6xIOOCf37oDidirIjj*gΜ KOOgʔ)?>d-dffb0(ڊ'==Ύ;4z=eee,YRAࡇ_* lyᇹqutt#IPQQA^^^CRRcƌԩSc!ˆIDww79:sL ={6{/(&&&^/QQQX,KEEСC>}e˖~^u8vzc`06m$$$;ȫHuu5 wZTVVrш 0NGZZ{d]v vQQQDEE$I\z2?Gzz:x<bbbHMMe׮]8pOOOE#b I:GGG466sIII;vlhtN'---wtt I~7ox|Z|IOO,Z눢Ȍ3(..fڴiի4773sLhii!)) IF# |SNIKK Oss3%%%$%%N{{;Ofx<N>hEAOOOv^lݺ}Ԅ(L2vC㤤$hkk?)?'La08y$'11ݎ`@$1͸nظq#ΝjR]]Mqq1<L&N8ˣ:DQVf\.OSSVq;a2e ̞=3i$6oo~_wߍ^l޼¬Y&+"&Mɓ9u<裚{a0|9r|I^x6oO?kرcX,i^رcG`0h#)SPWW5.((&555D<:;;iooG׳uVvԩSٰaE*l¢5;٩9F+WPVV$I̛75k0w\VXiضm6 ɤ`zvVFOO:*++immԩSnIMMzq1j(,-ru]$''sQJJJ(//66l\!!,&&FsZZZضm-> ?87 /((6 /^dܹ\xEMMMfk]FUUqqq+pBrrrhmmn Frr2GĉK/OL| azիWݭiWrr2&L ==ʜ9s0L:C0k,,Y͛ٳg3fl6ksQ^^立C RƌCVV6$hf6IHH ''_9sDϭ̙3q:OgcǎQ__ό3|E>999 tgX40jykE,)hQh.eQ]lC'nq9tu%n=ff}m&RɁmuAIENDB`core/tremor/block.h000664 001750 001750 00000002125 12702465756 015423 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2008 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: shared block functions ********************************************************************/ #ifndef _V_BLOCK_ #define _V_BLOCK_ extern void _vorbis_block_ripcord(vorbis_block *vb); extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); #endif gx/images/Cart_ms.png000664 001750 001750 00000055372 12702465756 015715 0ustar00sergiosergio000000 000000 PNG  IHDRIesBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/24/11I" IDATx۫[rc~9{n)iZ%cA8$Ɩ-@pH !@^ Cyr ~#V+AR/O}[97ƨ<92RkbkϨQcT}jJDƯr)+_{v5" v67P41:o,䙗!k' Wya 5#SSu;svx5'Y1}$e9ʽ;on62ق:+QD県iaӁZE g~7V<^%yy@FɌUمy>'6W O{kŹWy!ܫr`7pΓoKOOҗx)7vs'o,9ػBo'  O2'x <]1:%%0Yy{>#sgj<OnnPֆۉj5I9if}`΅9lAjNʻx̞ULHzbMW#hn,^N_YftR9xrcIՅs5^gV WuK{\1.~_~g|mO588"J'#9u6x{w쮸vLucnywho6V<mH5{pZ4XWʞbA#~>pJ攻yL'Oe"i%G̴LLm;b;xjOx j,=!աrҍYxkq>=2_?dsj6THSp<acߐ?$(||48+s@Ck;3_r7 '_XOZ'Q-\+^)l4)=F"")#?IO(&,:[ 83suR.hlјyѹ.вpxј,6KJwtjd)q#՞}͸C{Rrvˁ;{&)e{defhFla)^.ߌ54 2ރ{9g懍퓋cv.z`ϟ{<55XDĐl,pL%'@ܘrqS`a&J9s j̓q5T(z"LwwJ`8"pVdfI\w'yZ4 ZXED*`+ܔbAJ/x\'@i5QTmqj8i&>9qsy'#amLΎ>sq3+ @GĸRJu$c.M$ hUXrv6B%\ILsGdR "BPWٜD065t$ N:SlNxp[ăA :7畛D$&ƬdIi8{Ճf,9,:ciYxƮAT0VJ\BR<Swf@I昦m۞_+u8$N[j= ND#p[NRb@%X{C1%5{@)dəJa.Y9bLY':I$8Fc:jPɤ0+ލfF<^\x:as )1%`kL)L h$lHmb&X.!2e-vSζr/<@ x+YG/<y=ukTǺr+]x@ٛ Cw;t=6nnGIƂ'Q97 "^ނF.1jT<ѢD7+55 /tQ*j.t4ca>Ċ~pSmC0/^< GEP}aTZG'} X7cb!|`4AM U'!4ԑ?ش]k4\G!@P D2֒@ !>*:<*}($D_$JJK<"]~!1* ͕- n19EkN~az|C6U $ "CS+0 >;%Pqrv(B Rd]+S <9)AF䊄 Y`JΔRqC%ƍ8r92ɩR)F=FVhG!T@I$d JzA. ) h,@ӊ)U 8“?LTaD"k%4$@3y2::X(dƺlhlFu¾I:!b(Hv284J5;aAhG x2r4S`.CCxvz6Ly4̂pGq`犫 >b# Nd:{SZdV)#莪} ѭ"Y|c/T!guth#ɝTk[gib?ZA7*@T[M Z9m@VgDzs^3zK͂<U$광?hm+fAR8|ނ8->BfΏV8uF#5jvnS~1xQqmú砨ayg V+F;)HCJZՅ,j+Y^u@Jj6ƺyz2v9oy+3Y Zuߋ ~#rXZ q`i*|vPiá U E1cJ>+w@SxCfiTO{6ۉ&Biyga/ބ . (+㴵<(B%8DBEp\3w$ ;4WdFo<RpF-ʃ; !XPڰ 7( 1Õ3Ppr'R*]X(kow:f+-^knmVr4ٗeG Tl#ۙgemNtLt'JxeyΜ3&\x2 ]rw~7^^[̙K[)n)3;:K_95W0? o8QU޹rny1ܵO,؝6Z0Y8zJ Aoѻz FK$[PDnBX+tEH&x]h) m:7q`.7H ̂5 d&Eݔzb5pՄ5a$pp(SxnMaPmMos%8H#]xBeoS0!Ȝsk<ڡc)ؓ9FO戡&'8^&ȥeM2nBPSGda-l+NVjpBjt4k+K#8uaƢk4VW/xO5o pz8󰮼nH.%㠐zno<̤NvԋXi* 'r\D :SA e2l.#?͙z:Pf&@ ~0YMi9h҇Yh8VqQE==(YL&b>  NN}PY}bCR'(˘Z}c:l2L.KA/P>Bq3u&(c=Å&D@8'L.)] w:ٯ28N\߾T|go|y em׾]=?˿ϿDNʕo>[7>=+7şy_3^ o oGOٗ9g>h`vIa AbU ,WG1J 7,', a1Q3,Ǒ<~GSi)a]>z'`6%v9%[rCW& "Pԇ8 %VX?( & .>t .БVqE#byLe|lI<Uc}$Yg5`e̕dI?c(CI8qQC5|%؅gS^cE0s_6 5%3UM>]OKP/BM%[sQ^h\x[<Ѷvi9l - );e&@v$?-ׯ߱yW?c30g J۸"]㑿<{z? ?O,+`"S!/Q2C4xpdHJLc@$.5!%! IDAT,ׂ 9sN`C?58NYsszqRisqV26勰f8&9-T&(iy7SͰjpξ q%̹PxwQ*P#l&: )sN%d4$9gF?q3gsl2Rg,` eաF.gO,beΙx!ʙ3\fLFS$C=c#D9Nyγ1na_3Je Xqpưr fsprV}:u!Y?7~)>$=oq~gXӂ|i{OWx~m얅b>g?o_竿3|?{yqM+bYf,2GWbhwgz7LtB\)9anxWfBX{=2y`iԦ ~ԝ۸q`ܜE#TC}݃{w?:vC~]A> (.8`1,i=t(!U~ufXyx88!Dvrt&|n0*cf|\00G=8FG#gcܠ.ISr~iwޝw=lg8wn/\^$ǻC G|nA:eK.ox{W~wԔ;/s(XjƘ*O1l9VFSPCFo,$Vͬ)qNYkadfjάIYKf@57%FQS 'ITPMs)PMCRq/7(t1r%9^&dT!tM$xgΪ i̖|#x:e\ Q3 I:GόDe"O3xƈȿa$ʨ O`a UU >YGiD6._G$þHE:f N2"1v%<&&` "qw䗾S|?wW'?O:_wo³}џ _|O5ˁos¯P9<{/|8&vn 2LiR2LSa)9VBְ0t9sTDy_46'1f^GeJфT#^. /z>)s~ҝem$^wipJxZfN M#7s&`+/ ᖠw㫶JEeLjd10=ty JFVŷ6//5يFDLn:6ʙ))v `#|Zxhnڔ/E5At'laOӂ#%2_[@1:yťҥ5ƔŲA1#W-P lYr+o'ʯ&}pk?|oQo䓟'~}vxX%x}{ߐ7%H_a3nys5s?Oҍ3UŧWI8׉>Ixc<9j~1 Imgr)aTsbX)҅2r#Iwe΄1HnHw ̓9sL)Xzj<9.Lmrx>J`w>H1ruLKp0I:+v};[g cj:sc I;%#Oʒd}Uu{pC $g$!-Z!hǿKKo2`ز!m,2mà  ؆)&e 4=2#xq"ftq^eUfFdʼns96)+US)UjV?NMGsqx$SHД(lv5q\ĊĪ˖ Jҟl}(K4=ДJ|ߧE4*G0H9v qNiwprSf 1ow~_O>~WI#/~{c{읷 Oi$zM>xwxg?wG%kXM/y)lp6v6o,>βRN,C,esqԜ#LGN j#[tir"hlsZ3j^e`7{-|ք&tjd_]ӜF)'L2sѡ?nԟ]P9}Lr}2_=3 + xIjf$).eV"H]aa Vm NlO/}>?/Hmÿ^~cOּ^|/sҦ›[?xf~o?Ɯw>%<_`J 9d[|g,9ٴ^ZvC2YJO Ɲ#71DėQK3RJ'V7sMԦFmG=dgd7erJv`I%LtQ!Ul!Dβs-8#+РfPcNAh];VߕB5mNHtghR:#)Z,|CpzX B$8T~=P~XݤT~,%,L~gԎ  CZW6[Xf윭Lq?%'ow7ē_9]mxwWo^ny)ϯ{~_bw卷ߡ-/?~!O?$|o[ls$ztBήAtl]R4U Ӧ[4AJ&SLDr d9Dr%$r,g,*+XhdV@9s d ș&+h&g+r%"[])w.K[gBvDFoqVse=Jfc- 䒒$sҟ.e.3\J\wZQʅ&5ʎX(J+,B…d:+.UQl3w*62\y,rfKP.I4{pfekGrA<ٶ֞PR3W̅GvH8z+fD\o@'Ks(%Wyz٣G-O<#M˯Ɇ/yꄧ~?_5 z&_ʧ!/w.ohz?y)6UGL5˜SѢ$B1'аv<njEmdAOѻ Nl6D12/zZ3j#e^NiIDࢄ <tS^+\& lZ@D9/E."QIQyR>hUh&ȏ-DU8ϊ#%dĪT.I[.l\ϳh5oe墷uB<}U=H}WѴʪ>`E.g'wSO3|'O bVZOOπ?yo5[UsFKl,eV5]]ķՇ-+aבsϚkgR#BKVXκHp$!xqhzAg4j{~jf"τDŽ4BOlb##"qNX6-FdBH#4+vDYxe3groX-fmgӖOBYSٴ/GBgϯ<--p6[u-M퍧xW4}eω뎳x9QMBO)Ca{ھ'+M{F'q !^"<4WY4IklV^G/^o[:|~qk(Xd/i|5M=^lbbtێQd5ISIuTYјiZ49)6 m"u V"1DŽ^v8LF294#Z l>e6:HgA![{R[5RFsDb ¹ALho鏏{%"˴X1/%roK8' K$?''fնp+jj14["g{#cf鱂HJ=iH}g4Q>^`.zO V8h'sYPdAc"]w]mFb#:ZnױvUƋTuv6sF9}';H"4N^pnќRB"}\ e>BmWE\`? t!qef'McfGk1PleEsF-jIy㲂3њZ#t!̶mhqxsm)p1Ln97жI %~Zegm@{qRځw9xSASZ =ۖDhZ+|a#;s3BLʑ6]_7y79CvEKW }GzT-#⅔;h!I_58 HdUre=(^hϵ[2tV\̹{>pٮ9o<^o0Oxۿ$ibig|зm [+'-^T7tGԴ@{Dxw\#4KYqbh%F3b~hM]4gfYCּ@J] &?ZqZ g^@j=T #y@؞;aUhrQsLX95WpVۨ NІkiFNȍcii])&'{.6-Ɨ` X_ D'3?|bմJ8G"ڴCf`ѵd ~%yźaMb;VhlCC#jd^lpnY@if5Mh|Cn>[Y=\gۀ䜸6f'x>O=?~~ŧ-=c/^={o69l6vli5f=}r&8AX̨R1[, ۘHAQBX,S9۶.G26Fp;bq"%nД"mېql\t;DijY!4:11mv>[e=(CϰFT+'ն"hCoc-ՠ@rEƈ!`Vg4&F"\DޞKJqڜMHT^/f:+jOs'hCOoJΉhKUB\rBw)q]J;)Yg }ʅ `{ƂM*vEU86@R/%Bqv9JYLs-nGLZ\BLX+cB!G&9läO?4݆hsFj\^G<{Ǝ(I;s&$0jr~hm_"6LNyw,:Gp"?O~aYl&?Yӥ6eAOc"DŽ;' U3ڕKy_Iy])>Zٮ_(fjiQzQ <.NtfKb ЂwFB(\,j>:Z_|=YɶRD.#MkKJGֹsfww7HE!n? e4&k{=}w9÷~XHM}M/ؽiCJjiXp1 `;LE:VBHQ;-I>e>]6e| FeO>~Q[#6IDATDFL0s>4 "`^ Τ$O'v`Wsס̭ڬlrɖt32)nq2[x)zl)G'y&rpmlkMTr3ë\փ: &hi\s1Fb 0Դ~\WMk LQ`Qh9j+GP [-tL%9FX̃YrM=.^phiVlկɇgrJ X a("<gE`Ⱦ}y_C1F+pX%{!]4WB5ҁq4WfS3bVb7ʕ* T癖gg?o8v[Vb>Do9  ?>DŽt V+\$.هz,n"(Q٩NE3!+K?w?U/359[}m[^^_ Z7-oơJjK?K978U3uiE/n$q=w Dm7M4͠)xgJ:ѳG'볍?zϞ<~"MnN}oV ™s&H0"br5Fu;>*s0E.x%KeTⱺr !NZYv;MД2Wgُ;РתwUlXf?˙"Cㆵv~^gXÎ_ֲjPKjȂ{}xJ'kS{Y0@ʑ|}HLlڛkcᚳGEX䜀a?;u^8׉9aFܚ68xah۶k*8J6$g)g; 5S&ܱc'?fx</9$N)Ia.уqN;PO엸`C'Ր ;Eyv۩{) usTYt=8f. -X:p~Qě==X'U>w '`SqSsuΑ5q~*MЧn^Z'WѿH5uׁ0ܱۮ1%ÌJΉ 9Pq.Wv|x[otlx?`1 ؔEw,RWZ変;9>Ƹ2"l .ӖcwG"J0PT{;L]Uǜ6=6~EoEqΟf5qQ RZM~f}W6q:y /6<BNql ȼ;%w֠2. .I`N;Қsw5'5H0f֗ N=uAOׁYua챝zsn; j> ʫ~g.)_Ug.X:0穝~VyuV*Zqr2CC塶b!/*?`Мi8Wtܰ@Vo쩆 >u`.t\3fL8l3cBIBrxs8k/B6/ It}!Ie+/8&x/sZlΌh*#7|."jv8]ց_ $0G]=H&IgS!t:T:PU#+orr:㆟\enU,¹}GBw؛b.H{ܽ Pwxw+b5ӂo ndjڸξw'#pI4G`{O۶b=5;aE./s$)传1UqQ|U6OknΎSoz+S\'A&Yac_l"I7AP +r3~>]ૂj>j%ݟJfs&tGesRY7*[hj&! :OHcyѠ .x8;Gr ޼q4gNuy1uuk)Dm=*w1q\a~j@cyq-&a.a{Џ " ě{]ivcCըP<߲`W%jC<Zajy1c4oI*58_s' 5.T֢=0z| IP [Q)Nu;;]VidCf/ !lRk₊|s,/B¹lKcBJM^jzO}m_o.[<,uJs;&a>`]5]7,:X~7[ſWlr 9t Ãcgb.:`nu)3_o:\ќ F;v۹_t[x%w[n}WMԽ6Deհ8l<oym뀇PaUXBw/yrgJ(6:f =p׍Ѹs};!p( :TXfre`7Dd~ϊ<6][}KAko$Ce=\XX&QF"_ĽoRb. DtP.>h=;QewĢA|P7tXr'{?}?bK094sR(`FRM<ÚժD@TK+H ڸ hk q,X1 ~qj)8{%lO >i~/N 9I4֞MԱw|hKPxn܂_4rU]"=fU'XB{q }0T\֠ x5ZX^b!9[ ^#n69=^uA6Kҵ՜!"LKt*`WS>:2bSHvyWdj8PfoM7%-\DՄjæ|..:|@9РSNM]눩S>t8=H@nx!ՉY\CҢB|15bV*p`[?d!4wOkEmJ,I:BhМyD8bYB!M+ղ D9W~ιKE_qL1_B"Z} J'SɊ)48Tьs{R#R*R4+)a[5/yJ#5Z[F iusΠ4ιG ؉ȥv_{\?yu6IZ++yvNX P;ˡUbfIMJ,/ˮ{Z-GI#jĨ㥈2gPpGg2z_7})QTi)&aıoRYw*|euz@X'?ڽE z\`xZ쪇 i43HyEQvkɠA@H9*J男\odԞy(.8|'ƈ8ld&}a+3aj,dmCgءƫEΓ-EC)-[e9B7N>QR0`hѢAS<%r0h.F 40):0\@`wJ@Up#ԷRNgu dTGN2(։揮tlCu1O" &XRrl C BL؀gkO4#o얜!hVZ%A Fg{X.z>lvYn>T',NOs'ypy U^udMԙmSU?mǮ(o':U%~6N/_&BdQH#RUVx@uCTJvf89?gPB@e%kZ̽"yt+#CqmpޑT}b4xb<T@N:{㦶-bJ*&сUއ9Fΐ)$ GǓ;U"%˿j"Ù|tcg;wkF7uyEʊYƹv0,"*Wh|3Z - }f(mҶ-vEll}GAwo>)Wg9P( z`WzЂ_426ήK(zs `c2]g?&nDBqY1})]::LXaPD0W .v`F&oPHcU*bfݨcA " ,T%Ur hՠ|1P^+{H@YYy9'! n({EU-Ɏ~o)0 >D@w9&n,q09&U |Q-=&d ⅼVbyH@zo7uqx,:.˫CCY'UO9ZIENDB`gcw0/opk-data/default.gcw0.desktop000664 001750 001750 00000000504 12702465756 020135 0ustar00sergiosergio000000 000000 [Desktop Entry] Name=Genesis Plus GX Comment=Genesis Plus GX for GCW-Zero MimeType=application/zip;application/x-genesis-rom;application/x-megadrive-rom;application/x-sms-rom;application/x-cd-image; Exec=gen_gcw0 %f Terminal=false Type=Application StartupNotify=true Icon=md Categories=emulators; X-OD-Manual=gcw0readme.txt core/tremor/block.c000664 001750 001750 00000031455 12702465756 015426 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: PCM data vector blocking, windowing and dis/reassembly ********************************************************************/ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "window.h" #include "registry.h" #include "misc.h" static int ilog(unsigned int v){ int ret=0; if(v)--v; while(v){ ret++; v>>=1; } return(ret); } /* pcm accumulator examples (not exhaustive): <-------------- lW ----------------> <--------------- W ----------------> : .....|..... _______________ | : .''' | '''_--- | |\ | :.....''' |_____--- '''......| | \_______| :.................|__________________|_______|__|______| |<------ Sl ------>| > Sr < |endW |beginSl |endSl | |endSr |beginW |endlW |beginSr |< lW >| <--------------- W ----------------> | | .. ______________ | | | ' `/ | ---_ | |___.'___/`. | ---_____| |_______|__|_______|_________________| | >|Sl|< |<------ Sr ----->|endW | | |endSl |beginSr |endSr |beginW | |endlW mult[0] |beginSl mult[n] <-------------- lW -----------------> |<--W-->| : .............. ___ | | : .''' |`/ \ | | :.....''' |/`....\|...| :.........................|___|___|___| |Sl |Sr |endW | | |endSr | |beginSr | |endSl |beginSl |beginW */ /* block abstraction setup *********************************************/ #ifndef WORD_ALIGN #define WORD_ALIGN 8 #endif int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ memset(vb,0,sizeof(*vb)); vb->vd=v; vb->localalloc=0; vb->localstore=NULL; return(0); } void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); if(bytes+vb->localtop>vb->localalloc){ /* can't just _ogg_realloc... there are outstanding pointers */ if(vb->localstore){ struct alloc_chain *link=(struct alloc_chain *)_ogg_malloc(sizeof(*link)); vb->totaluse+=vb->localtop; link->next=vb->reap; link->ptr=vb->localstore; vb->reap=link; } /* highly conservative */ vb->localalloc=bytes; vb->localstore=_ogg_malloc(vb->localalloc); vb->localtop=0; } { void *ret=(void *)(((char *)vb->localstore)+vb->localtop); vb->localtop+=bytes; return ret; } } /* reap the chain, pull the ripcord */ void _vorbis_block_ripcord(vorbis_block *vb){ /* reap the chain */ struct alloc_chain *reap=vb->reap; while(reap){ struct alloc_chain *next=reap->next; _ogg_free(reap->ptr); memset(reap,0,sizeof(*reap)); _ogg_free(reap); reap=next; } /* consolidate storage */ if(vb->totaluse){ vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); vb->localalloc+=vb->totaluse; vb->totaluse=0; } /* pull the ripcord */ vb->localtop=0; vb->reap=NULL; } int vorbis_block_clear(vorbis_block *vb){ _vorbis_block_ripcord(vb); if(vb->localstore)_ogg_free(vb->localstore); memset(vb,0,sizeof(*vb)); return(0); } static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ int i; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; private_state *b=NULL; memset(v,0,sizeof(*v)); b=(private_state *)(v->backend_state=_ogg_calloc(1,sizeof(*b))); v->vi=vi; b->modebits=ilog(ci->modes); /* Vorbis I uses only window type 0 */ b->window[0]=_vorbis_window(0,ci->blocksizes[0]/2); b->window[1]=_vorbis_window(0,ci->blocksizes[1]/2); /* finish the codebooks */ if(!ci->fullbooks){ ci->fullbooks=(codebook *)_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); for(i=0;ibooks;i++){ vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i]); /* decode codebooks are now standalone after init */ vorbis_staticbook_destroy(ci->book_param[i]); ci->book_param[i]=NULL; } } v->pcm_storage=ci->blocksizes[1]; v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); for(i=0;ichannels;i++) v->pcm[i]=(ogg_int32_t *)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); /* all 1 (large block) or 0 (small block) */ /* explicitly set for the sake of clarity */ v->lW=0; /* previous window size */ v->W=0; /* current window size */ /* initialize all the mapping/backend lookups */ b->mode=(vorbis_look_mapping **)_ogg_calloc(ci->modes,sizeof(*b->mode)); for(i=0;imodes;i++){ int mapnum=ci->mode_param[i]->mapping; int maptype=ci->map_type[mapnum]; b->mode[i]=_mapping_P[maptype]->look(v,ci->mode_param[i], ci->map_param[mapnum]); } return(0); } int vorbis_synthesis_restart(vorbis_dsp_state *v){ vorbis_info *vi=v->vi; codec_setup_info *ci; if(!v->backend_state)return -1; if(!vi)return -1; ci=vi->codec_setup; if(!ci)return -1; v->centerW=ci->blocksizes[1]/2; v->pcm_current=v->centerW; v->pcm_returned=-1; v->granulepos=-1; v->sequence=-1; ((private_state *)(v->backend_state))->sample_count=-1; return(0); } int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ _vds_init(v,vi); vorbis_synthesis_restart(v); return(0); } void vorbis_dsp_clear(vorbis_dsp_state *v){ int i; if(v){ vorbis_info *vi=v->vi; codec_setup_info *ci=(codec_setup_info *)(vi?vi->codec_setup:NULL); private_state *b=(private_state *)v->backend_state; if(v->pcm){ for(i=0;ichannels;i++) if(v->pcm[i])_ogg_free(v->pcm[i]); _ogg_free(v->pcm); if(v->pcmret)_ogg_free(v->pcmret); } /* free mode lookups; these are actually vorbis_look_mapping structs */ if(ci){ for(i=0;imodes;i++){ int mapnum=ci->mode_param[i]->mapping; int maptype=ci->map_type[mapnum]; if(b && b->mode)_mapping_P[maptype]->free_look(b->mode[i]); } } if(b){ if(b->mode)_ogg_free(b->mode); _ogg_free(b); } memset(v,0,sizeof(*v)); } } /* Unlike in analysis, the window is only partially applied for each block. The time domain envelope is not yet handled at the point of calling (as it relies on the previous block). */ int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ vorbis_info *vi=v->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; private_state *b=v->backend_state; int i,j; if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); v->lW=v->W; v->W=vb->W; v->nW=-1; if((v->sequence==-1)|| (v->sequence+1 != vb->sequence)){ v->granulepos=-1; /* out of sequence; lose count */ b->sample_count=-1; } v->sequence=vb->sequence; if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly was called on block */ int n=ci->blocksizes[v->W]/2; int n0=ci->blocksizes[0]/2; int n1=ci->blocksizes[1]/2; int thisCenter; int prevCenter; if(v->centerW){ thisCenter=n1; prevCenter=0; }else{ thisCenter=0; prevCenter=n1; } /* v->pcm is now used like a two-stage double buffer. We don't want to have to constantly shift *or* adjust memory usage. Don't accept a new block until the old is shifted out */ /* overlap/add PCM */ for(j=0;jchannels;j++){ /* the overlap/add section */ if(v->lW){ if(v->W){ /* large/large */ ogg_int32_t *pcm=v->pcm[j]+prevCenter; ogg_int32_t *p=vb->pcm[j]; for(i=0;ipcm[j]+prevCenter+n1/2-n0/2; ogg_int32_t *p=vb->pcm[j]; for(i=0;iW){ /* small/large */ ogg_int32_t *pcm=v->pcm[j]+prevCenter; ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; for(i=0;ipcm[j]+prevCenter; ogg_int32_t *p=vb->pcm[j]; for(i=0;ipcm[j]+thisCenter; ogg_int32_t *p=vb->pcm[j]+n; for(i=0;icenterW) v->centerW=0; else v->centerW=n1; /* deal with initial packet state; we do this using the explicit pcm_returned==-1 flag otherwise we're sensitive to first block being short or long */ if(v->pcm_returned==-1){ v->pcm_returned=thisCenter; v->pcm_current=thisCenter; }else{ v->pcm_returned=prevCenter; v->pcm_current=prevCenter+ ci->blocksizes[v->lW]/4+ ci->blocksizes[v->W]/4; } } /* track the frame number... This is for convenience, but also making sure our last packet doesn't end with added padding. If the last packet is partial, the number of samples we'll have to return will be past the vb->granulepos. This is not foolproof! It will be confused if we begin decoding at the last page after a seek or hole. In that case, we don't have a starting point to judge where the last frame is. For this reason, vorbisfile will always try to make sure it reads the last two marked pages in proper sequence */ if(b->sample_count==-1){ b->sample_count=0; }else{ b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; } if(v->granulepos==-1){ if(vb->granulepos!=-1){ /* only set if we have a position to set to */ v->granulepos=vb->granulepos; /* is this a short page? */ if(b->sample_count>v->granulepos){ /* corner case; if this is both the first and last audio page, then spec says the end is cut, not beginning */ if(vb->eofflag){ /* trim the end */ /* no preceeding granulepos; assume we started at zero (we'd have to in a short single-page stream) */ /* granulepos could be -1 due to a seek, but that would result in a long coun`t, not short count */ v->pcm_current-=(b->sample_count-v->granulepos); }else{ /* trim the beginning */ v->pcm_returned+=(b->sample_count-v->granulepos); if(v->pcm_returned>v->pcm_current) v->pcm_returned=v->pcm_current; } } } }else{ v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ if(v->granulepos>vb->granulepos){ long extra=v->granulepos-vb->granulepos; if(extra) if(vb->eofflag){ /* partial last frame. Strip the extra samples off */ v->pcm_current-=extra; } /* else {Shouldn't happen *unless* the bitstream is out of spec. Either way, believe the bitstream } */ } /* else {Shouldn't happen *unless* the bitstream is out of spec. Either way, believe the bitstream } */ v->granulepos=vb->granulepos; } } /* Update, cleanup */ if(vb->eofflag)v->eofflag=1; return(0); } /* pcm==NULL indicates we just want the pending samples, no more */ int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm){ vorbis_info *vi=v->vi; if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ if(pcm){ int i; for(i=0;ichannels;i++) v->pcmret[i]=v->pcm[i]+v->pcm_returned; *pcm=v->pcmret; } return(v->pcm_current-v->pcm_returned); } return(0); } int vorbis_synthesis_read(vorbis_dsp_state *v,int bytes){ if(bytes && v->pcm_returned+bytes>v->pcm_current)return(OV_EINVAL); v->pcm_returned+=bytes; return(0); } gx/images/Button_down.png000664 001750 001750 00000010147 12702465756 016616 0ustar00sergiosergio000000 000000 PNG  IHDRh ?`sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATx]ipy}=;K@x'H$PL]&M.eޚR A 2Yezh@UU]`ЬISJ1ہʋq&nBgҶ<ڶ=fe{,^mL8a־\>&<̲+jfi`s8 6n|l s>k\ OsCn/95#>^zP3q&P>pK/=;6\8+yȨ?'mN5#0-M,Q fxeKLDUu   )DŽ GY+t7bζ#59 73)#9*ZSrKخgLb*7?v׃O zOo(5cr4lZ,9G:rX;u׽!u/}[r:S7Z[vw 0,ːeY&0Cfyty1#f>*2A{ Cvg۶̉mcۇǧ O†&slWE"` CO>~wnPAgN.O=LbąSnG*5:a{q}VL; , ,2B 0Mbֈ! bjЮq\5]ڄ3qq탏O|mG@\x{]~(@!7C"X (s2bA,`HeI" > ^$IRWS9,w)Z&-$O@@@@`ڐ[#d2REEőYա@@l7n2,<*766JR? ]SM!:1cZPzvp8)έM&%Ln2c,ě` .! BUKQMӲ_;@i% gr'i?}Ƣ+iccr  dѢyW$r0 Eۂx嵟`m꓏ @( À(4-oZMW͒$!wFQ躎Q!\/Ӯ<00e}==q F&Bk&u<0OV2U#>͛ܳ;0oNCޤ朻!IGCyƞ[躎7qJ{wUCG"k['OIB:Q{>x?{4q*!?m]9Ob 3 ?ůN|=݁JGa]_o|R`!JG^4ѣG):;?EG&\7{3vh,E y8s_?* :{&*+Զxz-FmNL)hwnlb=x>ݠů8}3v%A C`VyS}|(3k9 ]'Ӡ 6s0h$.OUeOoߊo-ʨyƜkI{0Ԍ?:Asm>0z09Xhg~ҥKvypƍ WtrUMuxAP4@t]0t.^š# zRSg~$3w9gpb7iz:D@/"hO^k0ߏ>mmm4e ,T|g ɁXT#;Mq>[TUbْF{t@&#c ~ ^7'ϊGI8o}֪*emْrG/Ds$2~P|ץdꞔ,%qˇ6,|&swCu|'x!LDSLЃq-'W z8 Cz1X4ٱu}cx'sy˃w] N: CdbT:=ñKCUUKUPX0"9 ?WkNC=~4SQJq_H§X=gKOOrraЅ硃 5/?P;2o_ϙ_?l0h8}$7܇dǽ =Í' fNz+BB- so9׬>.]r+VnS\%Aty0 1`dp`|電zzz|e7k:t;u[aנHcDc# ԦuPL0ha\>I\>%AO> ZSA٧5xޯ={|W֮[;dǖIttt3X7Heok*Ë/uITV%GZ@@@BHJ+Ծv/{5gà`6\:umgG+*_XPT  ©_'@@Fw7QJjq[ZqÅO z8|8Zc  0tHt}G= vr+W :sn};hHr 5]7:25AA 6A]M  EQK.3;6oQ_;۷/{{p h?Xl*;ƣtOXR +J0t蔂0f- sB vSA# ڪu>I;~* JݬY4ȒE N&ox%hΡikm(h,t<|NuiH̛%G)RZE #{Cc_J3 ur m~3 ljhtWz4;e3 1-﩮VV.wΪeKn>􅎛/olO0vynѱQ64Xl9v_-GF4I5$ZX*94%ZhCV"!X$YaN} :9M|y M,f21 ;7)^q "1pj6h/79Yݓ-Wů]žצqXz0m6A)2-{V@ucl95W,Y8euWAk>4F"2(lf9} mٛN%7$RWGi~5#J&ST-lFAi c1?PN/NHWqYcadzovYiZMK%{ pAyЋ]A[*(ym%44jXsqǍC~1LޚAnͱ珙cahomm:Ycy%"Er|s9fͪ I}}.>P_ۓV\tx.Tn,[dF1(AѰghe4oOzn0ɠfʘ(%L!;ri8=KșX~c/CRFp 7*g[r۴O;_ |V\O$B%)p"TU_: ` RXOIENDB`gx/images/Button_sm_yellow.png000664 001750 001750 00000005426 12702465756 017665 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/25/10ru jIDATxݚ}LU?.[ȋW&t]묊8nqKYWuً]̲gki[BǚVE*E^щss_j9o9 <'=ɶm'IOTs"9bL3"P:n ǙaFUu2Eut]'//>4䴴/X`H Ê';=)H, ,K(hfDz F'{.cKKK4ozC &ٶchɵ݅j`[*Bѵ0h& 8Ff &Bdee!I^-iC!@]Ny$ p8uݰ7Mq |˲, ۶}䆚;} 9Bm"4MEQrFV 0.d݀ '11QiooOm҅8a$${h'R:GNA*jU 'êO,9#B`&~w94V@Ծi^\K5=Xev i洰8SQmgԝ +^Va hoii!55;|ā нjYfpKYYYr`fϭ5<\qvԕCckN5O@'{ g2}wenx ֖AW ӏ=ё#Gصk&LNZatUW}¼ ϝ1a`Q J,\PNiP*z{{ .D_ |IکSl˜1c.ޱP+GCK() pWCNipߤ,<E0 G]]=jԨo} uٲe>yf6mDIII?hn?J@]dʉV:dB̌xF`o}dY& Euu5v^^qpũ Xp![Z-\Eג0PYQEQ8qx<%%%~0C菒ĪUV>IOO'99 py.]Ӝ={˲윜B%gΜʕ.HɴrEc.] 2x^233˺}jll$--ziiigRRR>8rӱcn%vIENDB`gx/images/Main_play_gcn.png000664 001750 001750 00000007224 12702465756 017056 0ustar00sergiosergio000000 000000 PNG  IHDRT _sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 IDATx{pTU?ӝG b15"YF]dEbY&QRXU:*`mS"l B I#to80:U}={?=ιGRr-)5kYUZnYViJcc#{f[M?BF՛5|iӦl,ϵ)׼(,[lŋ]RRD"\.rrr(**"''tRRRn[DJWWgΜcǎ*'Op…{%vW( .\3zb!L4k8MMMl޼O>)SԗOྼ|2G.5od_"//}?8eYXlܸZy}vGc(,Z1̜93^-[Xv-㋋y/$z#0B0uv_Zҡi,XঀQrqm˲0M0XbGdgg'&lٲe#GĽl˖-<Ӭy|!?6/R0H`G#)_dd|r6m|38Ś";xժU$yb]( ]]]̚5${=*++y'')8`;HG#rPl#0MͿ$$S,a˖-7 SvZ_>k֬iXr4ùہ>sT>_MecHoN*Z`H0HDUQ4BäܖLn#P)D?L-[Fyy-ק\ytiwM0|(ro2z!222X|9I `+ʠp%%34KA  4vt 9.[Υ1]ɡBFMbbk͚5ӄxk.Fq>===p8<0;vǎçjPR!BDC*pñA8D,i50B)ѥ$Ȏ; (@QQ555TWWEmm-@֒Mkk+,^l֯_Jmm-<#W? ǦcǎEUա'O2zx_}G 8Ah0 `/uEԇԴ(ܟDqH*$ihhn~'2{lV\ 0]WÇimm'۷뫮FUU6mĆ PUfsmۘIAA@ c`4:thpoo/<ԐB"-P/a`a EhIq> ruśu dYY۽{7{n8+8q"> ۶m\u]@;o6.9SAA!T }fvxWguPgOdr]=.hR쯽}ŀԠiL8eTUBEEEݻybnf,Z[[6lnoԒ(@X@饫r %q,AV1adM:$KAp wyqpGaɒ%uuu̞= ̘4vmvĉL0I lB`FQ{{%$x ATJL)Hu(tJIc OQPL$˜1c~kÇǏ#;;{@m6imm%;;G&~ӧOSPP|_~c= ^yES"$ŰH I$'N>RZ&K-hBK-%]CmuuuŏΝK G5~ٴi֭QRX1Ms@];y$ɝ  ޽{xL1kGaLJǶq 5YOgjb2ݎEXJZI$D?.l$raMXu= xg),,TD(s!ƍGVV]LVLe!w CXR"Q0B2*K7!!ppα9<Ì1!tMŖ3c1f4SCCiJxg)))?S2!uR ;#!#$(&Fa0UE!" /t [Fk2gΜ J@u]G4t];4 sN:;;#.kTGG9)tׯ~o[QQE|!hii᭷bϞ=zN𒮸0S8[]I09s&Ox̙u; ǼW^q}|<<ò,,ܹsttt4gtM".]!|qqd2ٷocccr96mڄR qPJBKK iQ0 DY: Ϟ=ݻB!RxWݳ,DpwCi$ vEkk+{%s4 qp]qmp8L$?w6$I=zѣG1 N>$AJR*ZYY!ouFׅÇٺu+xǁeaaum5lۦX,506Du1::Jss37nmLdyyZ8tvvb&rq{@DYڗJ455111AX&m1)UR)< (f^x144|Gu<ׯ_{QWWǏ󬭭1;;իW͛7WPT*uq~J&8C\&D",--Q*p]˲D"޽qH$iضM:& `P(|ƶm,":/_BP}ׯ_;<]y9333%Ed\.eddl6K("ɰ}vN:Ν;rVX,Boo/mmm,..>L)|&"hdYLӬ_[[ò,VWWY]]Ų,RA8;Dd͛7+WP__OMMMe~"RO2=='?1)"2vwE2 [R@ @P`bbozYgL4w;vf``#G X]]X,VKR*/_djj_??>})$ }hoo677H$eͶmRi獥20 3gV~[.o0 1 2_D׋[,OIENDB`core/ntsc/sms_ntsc.txt000664 001750 001750 00000012303 12702465756 016210 0ustar00sergiosergio000000 000000 sms_ntsc 0.2.3: Sega Master System NTSC Video Filter ---------------------------------------------------- Author : Shay Green Website : http://www.slack.net/~ant/ Forum : http://groups.google.com/group/blargg-sound-libs License : GNU Lesser General Public License (LGPL) Language: C or C++ Overview -------- To perform NTSC filtering, first allocate memory for a sms_ntsc_t object and call sms_ntsc_init(), then call sms_ntsc_blit() to perform filtering. You can call sms_ntsc_init() at any time to change image parameters. By default, sms_ntsc_blit() reads and writes pixels in 16-bit RGB. Edit sms_ntsc_config.h to change this. RGB Palette Generation ---------------------- A 4096-color RGB palette can be generated for use in a normal blitter. In your sms_ntsc_setup_t structure, point palette_out to a 12288-byte buffer (4096 * 3) to hold the palette, then call sms_ntsc_init(). If you only need the palette and aren't going to be using the NTSC blitter, pass 0 for the first parameter. Image Parameters ---------------- Many image parameters can be adjusted and presets are provided for composite video, S-video, RGB, and monochrome. Most are floating-point values with a general range of -1.0 to 1.0, where 0 is normal. The ranges are adjusted so that one parameter at an extreme (-1 or +1) and the rest at zero shouldn't result in any internal overflow (garbage pixels). Setting multiple parameters to their extreme can produce garbage. Put another way, the state space defined by all parameters within the range -1 to +1 is not fully usable, but some extreme corners are very useful so I don't want to reduce the parameter ranges. The sharpness and resolution parameters have similar effects. Resolution affects how crisp pixels are. Sharpness merely enhances the edges by increasing contrast, which makes things brighter at the edges. Artifacts sets how much "junk" is around the edges where colors and brightness change in the image, where -1 completely eliminates them. (Color) bleed affects how much colors blend together and the artifact colors at the edges of pixels surrounded by black. (Color) fringing affects how much color fringing occurs around the edges of bright objects, especially white text on a black background. When using custom settings, initialize your sms_ntsc_setup_t using one of the standard setups before customizing it. This will ensure that all fields are properly initialized, including any added in future releases of the library that your current code can't even know about. sms_ntsc_setup_t setup; setup = sms_ntsc_composite; /* do this first */ setup.sharpness = custom_sharpness; sms_ntsc_init( ntsc, &setup ); Image Size ---------- For proper aspect ratio, the image generated by the library must be doubled vertically. Use the SMS_NTSC_OUT_WIDTH() and SMS_NTSC_IN_WIDTH() macros to convert between input and output widths that the blitter uses. For example, if you are blitting an image 256 pixels wide, use SMS_NTSC_OUT_WIDTH( 256 ) to find out how many output pixels are written per row. Another example, use SMS_NTSC_IN_WIDTH( 640 ) to find how many input pixels will fit within 640 output pixels. Custom Blitter -------------- You can write your own blitter, allowing customization of how input pixels are obtained, the format of output pixels (15, 16, or 32-bit RGB), optimizations for your platform, and additional effects like efficient scanline doubling during blitting. Macros are included in sms_ntsc.h for writing your blitter so that your code can be carried over without changes to improved versions of the library. The default blitter at the end of sms_ntsc.c shows how to use the macros. Contact me for further assistance. The SMS_NTSC_BEGIN_ROW macro allows starting up to three pixels. The first pixel is cut off; its use is in specifying a background color other than black for the sliver on the left edge. The next two pixels can be used to handle the extra one or two pixels not handled by the main chunks of three pixels. For example if you want to blit 257 input pixels on a row (for whatever odd reason), you would start the first two with SMS_NTSC_BEGIN_ROW( ... sms_ntsc_black, line_in [0], line_in [1] ), then do the remaining 255 in chunks of three (255 is divisible by 3). Limitations ----------- The library's horizontal rescaling is too wide by about 3% in order to allow a much more optimal implementation. This means that a 248 pixel wide input image should appear as 563 output pixels, but with this library appears as 581 output pixels. TV aspect ratios probably vary by this much anyway. If you really need unscaled output, contact me and I'll see about adding it. Thanks ------ Thanks to NewRisingSun for his original code and explanations of NTSC, which was a starting point for me learning about NTSC video and decoding. Thanks to the Nesdev forum for feedback and encouragement. Thanks to Martin Freij (Nestopia author) and Charles MacDonald (SMS Plus author) for significant ongoing testing and feedback as the library has improved. Thanks to byuu (bsnes author) and pagefault (ZSNES team) for feedback about the SNES version. -- Shay Green core/tremor/ivorbiscodec.h000664 001750 001750 00000015126 12702465756 017011 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: libvorbis codec headers ********************************************************************/ #ifndef _vorbis_codec_h_ #define _vorbis_codec_h_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "ogg.h" typedef struct vorbis_info{ int version; int channels; long rate; /* The below bitrate declarations are *hints*. Combinations of the three values carry the following implications: all three set to the same value: implies a fixed rate bitstream only nominal set: implies a VBR stream that averages the nominal bitrate. No hard upper/lower limit upper and or lower set: implies a VBR bitstream that obeys the bitrate limits. nominal may also be set to give a nominal rate. none set: the coder does not care to speculate. */ long bitrate_upper; long bitrate_nominal; long bitrate_lower; long bitrate_window; void *codec_setup; } vorbis_info; /* vorbis_dsp_state buffers the current vorbis audio analysis/synthesis state. The DSP state belongs to a specific logical bitstream ****************************************************/ typedef struct vorbis_dsp_state{ int analysisp; vorbis_info *vi; ogg_int32_t **pcm; ogg_int32_t **pcmret; int pcm_storage; int pcm_current; int pcm_returned; int preextrapolate; int eofflag; long lW; long W; long nW; long centerW; ogg_int64_t granulepos; ogg_int64_t sequence; void *backend_state; } vorbis_dsp_state; typedef struct vorbis_block{ /* necessary stream state for linking to the framing abstraction */ ogg_int32_t **pcm; /* this is a pointer into local storage */ oggpack_buffer opb; long lW; long W; long nW; int pcmend; int mode; int eofflag; ogg_int64_t granulepos; ogg_int64_t sequence; vorbis_dsp_state *vd; /* For read-only access of configuration */ /* local storage to avoid remallocing; it's up to the mapping to structure it */ void *localstore; long localtop; long localalloc; long totaluse; struct alloc_chain *reap; } vorbis_block; /* vorbis_block is a single block of data to be processed as part of the analysis/synthesis stream; it belongs to a specific logical bitstream, but is independant from other vorbis_blocks belonging to that logical bitstream. *************************************************/ struct alloc_chain{ void *ptr; struct alloc_chain *next; }; /* vorbis_info contains all the setup information specific to the specific compression/decompression mode in progress (eg, psychoacoustic settings, channel setup, options, codebook etc). vorbis_info and substructures are in backends.h. *********************************************************************/ /* the comments are not part of vorbis_info so that vorbis_info can be static storage */ typedef struct vorbis_comment{ /* unlimited user comment fields. libvorbis writes 'libvorbis' whatever vendor is set to in encode */ char **user_comments; int *comment_lengths; int comments; char *vendor; } vorbis_comment; /* libvorbis encodes in two abstraction layers; first we perform DSP and produce a packet (see docs/analysis.txt). The packet is then coded into a framed OggSquish bitstream by the second layer (see docs/framing.txt). Decode is the reverse process; we sync/frame the bitstream and extract individual packets, then decode the packet back into PCM audio. The extra framing/packetizing is used in streaming formats, such as files. Over the net (such as with UDP), the framing and packetization aren't necessary as they're provided by the transport and the streaming layer is not used */ /* Vorbis PRIMITIVES: general ***************************************/ extern void vorbis_info_init(vorbis_info *vi); extern void vorbis_info_clear(vorbis_info *vi); extern int vorbis_info_blocksize(vorbis_info *vi,int zo); extern void vorbis_comment_init(vorbis_comment *vc); extern void vorbis_comment_add(vorbis_comment *vc, char *comment); extern void vorbis_comment_add_tag(vorbis_comment *vc, char *tag, char *contents); extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); extern void vorbis_comment_clear(vorbis_comment *vc); extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); extern int vorbis_block_clear(vorbis_block *vb); extern void vorbis_dsp_clear(vorbis_dsp_state *v); /* Vorbis PRIMITIVES: synthesis layer *******************************/ extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, ogg_packet *op); extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); extern int vorbis_synthesis_restart(vorbis_dsp_state *v); extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep); extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm); extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); /* Vorbis ERRORS and return codes ***********************************/ #define OV_FALSE -1 #define OV_EOF -2 #define OV_HOLE -3 #define OV_EREAD -128 #define OV_EFAULT -129 #define OV_EIMPL -130 #define OV_EINVAL -131 #define OV_ENOTVORBIS -132 #define OV_EBADHEADER -133 #define OV_EVERSION -134 #define OV_ENOTAUDIO -135 #define OV_EBADPACKET -136 #define OV_EBADLINK -137 #define OV_ENOSEEK -138 #ifdef __cplusplus } #endif /* __cplusplus */ #endif gx/images/ctrl_option_on.png000664 001750 001750 00000001560 12702465756 017343 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09IDATxK]Eߝ{nLI/$.D?pޅ~!\p݉QE"H I3&ɝ{uQU=eWU)w 0w ƨģ8À_#E?΃,Xq]ibegRyRY(ǎp**aMsr=؋3Lq-&W)cN3˃YzKˁ8Wƻt(sVsɺ  2q}it;]j \5 ]^M3?D~+x1~ogA P'NQ~lH-|/pDt3} O 3x8U^) |c1N4eQ8G\:17>Hݮז/8+Rr/f4)(ж1 `WpRTu+Ļ=#r_v􊆣\E];AE'2Aڋߋ %Kj/[Nx*XfcM)VR7/Nq,n 5BTǁ?itt+A`f$#v@ɮ5TuV+s~:"?d~ 1)x'V~Ԅ}8bEHOxP$guJv#B 7!+]hpo!(< <j]WY)(~`)3&^?&"x {O{ HFN`;?^94)|ſ%vM Gzu "6/2!,EDuUZ<܋!;{7v.4U,>Ⱥܰ Ũa4 >B<R(rȽ.BSSvP1X*wrن9"h-c#U~GyW=?^#ߢEi8t;NSX_ޠ؎mE/́:ī=Og+!P P8yr Z_N63ָMDGqb :lat-oi|*"Q[!&(@ZD^ BVtMRBLhI~cՖjyC8is"ȕ~D͂9Ez XCs",]͂9!UR*ϣSHBw V x82- U*sYl" ]( oEI(&!b::<*WYYWPBi ^3@7r"qթPjrMyEq|.ڎ܈x=4U\B:~"o>,chD`_Bl} 0ڸHwa SgFJv OBhOt)ZDTxGP p}Eހ`!GGsDCDeH۩x\ !^vG'ϴ$Y+)3S'Bn}5(:)""GBYXgPk^p t5'۽Jmh`뉭ejrb2%(W)gG/yH~b?@YX@;țB,u}/6\~oEvuV>HR*;d:GX"d"|> #oΣOh䗢 Q܁D2dEL@";;(Djjp /Y.%gI]@ְ ͚\ = W3hp = v﵈~qit;((s0͒( dI#ByhxK^ -B? | =iLgH q %q]*J YYZHp<S\(^=,L r(CrnPtˆJYgӊiay6##(A)JAFP 2Rd #(A)JAFP 2Rd #(A)JAFP 2Rd #(A)JAFP 2Rd #(գtm@K8ZC*ovx[mZ:I۽ɕ@{_:mn{gc;W9皁FFݦHt57;܄^}]6X4 MVDhdHsn}V"kɚg_ gF'ιF}oB`~ ҃FsMF^~(}z`hO kvs~V{~9 6owunF .Z&Y+@sn rMd 2 Y`ĈroBL\mI49W;oFYH" d)ErpU.1+_k ܂`彿?o*Z}.SSㆹe|{9V.K(JVDnڃEMGͨA{mf+ ^4]eG1$YmVo)&-SZ7RĽRbaPFIENDB`core/m68k/m68ki_instruction_jump_table.h000664 001750 001750 00004622145 12702465756 021425 0ustar00sergiosergio000000 000000 static void (* const m68ki_instruction_jump_table[0x10000])(void) = { m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_ori_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_ai, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi, m68k_op_ori_8_pi7, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd, m68k_op_ori_8_pd7, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_di, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_ix, m68k_op_ori_8_aw, m68k_op_ori_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_16_toc, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_ori_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_ai, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pi, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_pd, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_di, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_ix, m68k_op_ori_16_aw, m68k_op_ori_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_16_tos, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_ori_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_ai, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pi, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_pd, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_di, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_ix, m68k_op_ori_32_aw, m68k_op_ori_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_andi_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_ai, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi, m68k_op_andi_8_pi7, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd, m68k_op_andi_8_pd7, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_di, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_ix, m68k_op_andi_8_aw, m68k_op_andi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_16_toc, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_andi_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_ai, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pi, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_pd, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_di, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_ix, m68k_op_andi_16_aw, m68k_op_andi_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_16_tos, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_andi_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_ai, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pi, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_pd, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_di, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_ix, m68k_op_andi_32_aw, m68k_op_andi_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_subi_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_ai, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi, m68k_op_subi_8_pi7, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd, m68k_op_subi_8_pd7, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_di, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_ix, m68k_op_subi_8_aw, m68k_op_subi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_subi_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_ai, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pi, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_pd, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_di, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_ix, m68k_op_subi_16_aw, m68k_op_subi_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_subi_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_ai, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pi, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_pd, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_di, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_ix, m68k_op_subi_32_aw, m68k_op_subi_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_addi_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_ai, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi, m68k_op_addi_8_pi7, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd, m68k_op_addi_8_pd7, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_di, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_ix, m68k_op_addi_8_aw, m68k_op_addi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_addi_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_ai, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pi, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_pd, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_di, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_ix, m68k_op_addi_16_aw, m68k_op_addi_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_addi_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_ai, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pi, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_pd, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_di, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_ix, m68k_op_addi_32_aw, m68k_op_addi_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_btst_32_s_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_ai, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi, m68k_op_btst_8_s_pi7, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd, m68k_op_btst_8_s_pd7, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_di, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_ix, m68k_op_btst_8_s_aw, m68k_op_btst_8_s_al, m68k_op_btst_8_s_pcdi, m68k_op_btst_8_s_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_bchg_32_s_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_ai, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi, m68k_op_bchg_8_s_pi7, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd, m68k_op_bchg_8_s_pd7, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_di, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_ix, m68k_op_bchg_8_s_aw, m68k_op_bchg_8_s_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_bclr_32_s_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_ai, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi, m68k_op_bclr_8_s_pi7, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd, m68k_op_bclr_8_s_pd7, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_di, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_ix, m68k_op_bclr_8_s_aw, m68k_op_bclr_8_s_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_bset_32_s_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_ai, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi, m68k_op_bset_8_s_pi7, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd, m68k_op_bset_8_s_pd7, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_di, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_ix, m68k_op_bset_8_s_aw, m68k_op_bset_8_s_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_eori_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_ai, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi, m68k_op_eori_8_pi7, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd, m68k_op_eori_8_pd7, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_di, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_ix, m68k_op_eori_8_aw, m68k_op_eori_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_16_toc, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_eori_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_ai, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pi, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_pd, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_di, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_ix, m68k_op_eori_16_aw, m68k_op_eori_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_16_tos, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_eori_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_ai, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pi, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_pd, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_di, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_ix, m68k_op_eori_32_aw, m68k_op_eori_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_cmpi_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_ai, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi, m68k_op_cmpi_8_pi7, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd, m68k_op_cmpi_8_pd7, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_di, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_ix, m68k_op_cmpi_8_aw, m68k_op_cmpi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_cmpi_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_ai, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pi, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_pd, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_di, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_ix, m68k_op_cmpi_16_aw, m68k_op_cmpi_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_cmpi_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_ai, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pi, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_pd, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_di, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_ix, m68k_op_cmpi_32_aw, m68k_op_cmpi_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_btst_32_r_d, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_movep_16_er, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_ai, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi, m68k_op_btst_8_r_pi7, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd, m68k_op_btst_8_r_pd7, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_di, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_ix, m68k_op_btst_8_r_aw, m68k_op_btst_8_r_al, m68k_op_btst_8_r_pcdi, m68k_op_btst_8_r_pcix, m68k_op_btst_8_r_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_bchg_32_r_d, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_movep_32_er, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_ai, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi, m68k_op_bchg_8_r_pi7, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd, m68k_op_bchg_8_r_pd7, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_di, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_ix, m68k_op_bchg_8_r_aw, m68k_op_bchg_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_bclr_32_r_d, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_movep_16_re, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_ai, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi, m68k_op_bclr_8_r_pi7, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd, m68k_op_bclr_8_r_pd7, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_di, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_ix, m68k_op_bclr_8_r_aw, m68k_op_bclr_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_bset_32_r_d, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_movep_32_re, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_ai, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi, m68k_op_bset_8_r_pi7, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd, m68k_op_bset_8_r_pd7, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_di, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_ix, m68k_op_bset_8_r_aw, m68k_op_bset_8_r_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_move_8_aw_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_ai, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi, m68k_op_move_8_aw_pi7, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd, m68k_op_move_8_aw_pd7, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_di, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_ix, m68k_op_move_8_aw_aw, m68k_op_move_8_aw_al, m68k_op_move_8_aw_pcdi, m68k_op_move_8_aw_pcix, m68k_op_move_8_aw_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_move_8_al_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_ai, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi, m68k_op_move_8_al_pi7, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd, m68k_op_move_8_al_pd7, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_di, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_ix, m68k_op_move_8_al_aw, m68k_op_move_8_al_al, m68k_op_move_8_al_pcdi, m68k_op_move_8_al_pcix, m68k_op_move_8_al_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_move_8_pi_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_ai, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi, m68k_op_move_8_pi_pi7, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd, m68k_op_move_8_pi_pd7, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_di, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_ix, m68k_op_move_8_pi_aw, m68k_op_move_8_pi_al, m68k_op_move_8_pi_pcdi, m68k_op_move_8_pi_pcix, m68k_op_move_8_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_move_8_pd_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_ai, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi, m68k_op_move_8_pd_pi7, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd, m68k_op_move_8_pd_pd7, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_di, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_ix, m68k_op_move_8_pd_aw, m68k_op_move_8_pd_al, m68k_op_move_8_pd_pcdi, m68k_op_move_8_pd_pcix, m68k_op_move_8_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_move_8_d_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_ai, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi, m68k_op_move_8_d_pi7, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd, m68k_op_move_8_d_pd7, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_di, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_ix, m68k_op_move_8_d_aw, m68k_op_move_8_d_al, m68k_op_move_8_d_pcdi, m68k_op_move_8_d_pcix, m68k_op_move_8_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_move_8_ai_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_ai, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi, m68k_op_move_8_ai_pi7, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd, m68k_op_move_8_ai_pd7, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_di, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_ix, m68k_op_move_8_ai_aw, m68k_op_move_8_ai_al, m68k_op_move_8_ai_pcdi, m68k_op_move_8_ai_pcix, m68k_op_move_8_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_move_8_pi7_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_ai, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi, m68k_op_move_8_pi7_pi7, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd, m68k_op_move_8_pi7_pd7, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_di, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_ix, m68k_op_move_8_pi7_aw, m68k_op_move_8_pi7_al, m68k_op_move_8_pi7_pcdi, m68k_op_move_8_pi7_pcix, m68k_op_move_8_pi7_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_move_8_pd7_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_ai, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi, m68k_op_move_8_pd7_pi7, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd, m68k_op_move_8_pd7_pd7, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_di, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_ix, m68k_op_move_8_pd7_aw, m68k_op_move_8_pd7_al, m68k_op_move_8_pd7_pcdi, m68k_op_move_8_pd7_pcix, m68k_op_move_8_pd7_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_move_8_di_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_ai, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi, m68k_op_move_8_di_pi7, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd, m68k_op_move_8_di_pd7, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_di, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_ix, m68k_op_move_8_di_aw, m68k_op_move_8_di_al, m68k_op_move_8_di_pcdi, m68k_op_move_8_di_pcix, m68k_op_move_8_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_move_8_ix_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_ai, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi, m68k_op_move_8_ix_pi7, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd, m68k_op_move_8_ix_pd7, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_di, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_ix, m68k_op_move_8_ix_aw, m68k_op_move_8_ix_al, m68k_op_move_8_ix_pcdi, m68k_op_move_8_ix_pcix, m68k_op_move_8_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_d, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_a, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_ai, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pi, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_pd, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_di, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_ix, m68k_op_move_32_aw_aw, m68k_op_move_32_aw_al, m68k_op_move_32_aw_pcdi, m68k_op_move_32_aw_pcix, m68k_op_move_32_aw_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_d, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_a, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_ai, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pi, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_pd, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_di, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_ix, m68k_op_move_32_al_aw, m68k_op_move_32_al_al, m68k_op_move_32_al_pcdi, m68k_op_move_32_al_pcix, m68k_op_move_32_al_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_d, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_a, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_ai, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pi, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_pd, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_di, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_ix, m68k_op_move_32_d_aw, m68k_op_move_32_d_al, m68k_op_move_32_d_pcdi, m68k_op_move_32_d_pcix, m68k_op_move_32_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_d, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_a, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_ai, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pi, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_pd, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_di, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_ix, m68k_op_movea_32_aw, m68k_op_movea_32_al, m68k_op_movea_32_pcdi, m68k_op_movea_32_pcix, m68k_op_movea_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_d, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_a, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_ai, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pi, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_pd, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_di, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_ix, m68k_op_move_32_ai_aw, m68k_op_move_32_ai_al, m68k_op_move_32_ai_pcdi, m68k_op_move_32_ai_pcix, m68k_op_move_32_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_d, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_a, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_ai, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pi, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_pd, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_di, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_ix, m68k_op_move_32_pi_aw, m68k_op_move_32_pi_al, m68k_op_move_32_pi_pcdi, m68k_op_move_32_pi_pcix, m68k_op_move_32_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_d, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_a, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_ai, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pi, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_pd, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_di, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_ix, m68k_op_move_32_pd_aw, m68k_op_move_32_pd_al, m68k_op_move_32_pd_pcdi, m68k_op_move_32_pd_pcix, m68k_op_move_32_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_d, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_a, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_ai, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pi, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_pd, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_di, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_ix, m68k_op_move_32_di_aw, m68k_op_move_32_di_al, m68k_op_move_32_di_pcdi, m68k_op_move_32_di_pcix, m68k_op_move_32_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_d, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_a, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_ai, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pi, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_pd, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_di, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_ix, m68k_op_move_32_ix_aw, m68k_op_move_32_ix_al, m68k_op_move_32_ix_pcdi, m68k_op_move_32_ix_pcix, m68k_op_move_32_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_d, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_a, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_ai, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pi, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_pd, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_di, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_ix, m68k_op_move_16_aw_aw, m68k_op_move_16_aw_al, m68k_op_move_16_aw_pcdi, m68k_op_move_16_aw_pcix, m68k_op_move_16_aw_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_d, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_a, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_ai, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pi, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_pd, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_di, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_ix, m68k_op_move_16_al_aw, m68k_op_move_16_al_al, m68k_op_move_16_al_pcdi, m68k_op_move_16_al_pcix, m68k_op_move_16_al_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_d, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_a, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_ai, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pi, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_pd, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_di, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_ix, m68k_op_move_16_d_aw, m68k_op_move_16_d_al, m68k_op_move_16_d_pcdi, m68k_op_move_16_d_pcix, m68k_op_move_16_d_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_d, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_a, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_ai, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pi, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_pd, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_di, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_ix, m68k_op_movea_16_aw, m68k_op_movea_16_al, m68k_op_movea_16_pcdi, m68k_op_movea_16_pcix, m68k_op_movea_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_d, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_a, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_ai, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pi, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_pd, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_di, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_ix, m68k_op_move_16_ai_aw, m68k_op_move_16_ai_al, m68k_op_move_16_ai_pcdi, m68k_op_move_16_ai_pcix, m68k_op_move_16_ai_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_d, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_a, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_ai, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pi, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_pd, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_di, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_ix, m68k_op_move_16_pi_aw, m68k_op_move_16_pi_al, m68k_op_move_16_pi_pcdi, m68k_op_move_16_pi_pcix, m68k_op_move_16_pi_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_d, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_a, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_ai, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pi, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_pd, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_di, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_ix, m68k_op_move_16_pd_aw, m68k_op_move_16_pd_al, m68k_op_move_16_pd_pcdi, m68k_op_move_16_pd_pcix, m68k_op_move_16_pd_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_d, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_a, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_ai, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pi, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_pd, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_di, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_ix, m68k_op_move_16_di_aw, m68k_op_move_16_di_al, m68k_op_move_16_di_pcdi, m68k_op_move_16_di_pcix, m68k_op_move_16_di_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_d, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_a, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_ai, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pi, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_pd, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_di, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_ix, m68k_op_move_16_ix_aw, m68k_op_move_16_ix_al, m68k_op_move_16_ix_pcdi, m68k_op_move_16_ix_pcix, m68k_op_move_16_ix_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_negx_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_ai, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi, m68k_op_negx_8_pi7, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd, m68k_op_negx_8_pd7, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_di, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_ix, m68k_op_negx_8_aw, m68k_op_negx_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_negx_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_ai, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pi, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_pd, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_di, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_ix, m68k_op_negx_16_aw, m68k_op_negx_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_negx_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_ai, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pi, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_pd, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_di, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_ix, m68k_op_negx_32_aw, m68k_op_negx_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_move_16_frs_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_ai, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pi, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_pd, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_di, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_ix, m68k_op_move_16_frs_aw, m68k_op_move_16_frs_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_clr_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_ai, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi, m68k_op_clr_8_pi7, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd, m68k_op_clr_8_pd7, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_di, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_ix, m68k_op_clr_8_aw, m68k_op_clr_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_clr_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_ai, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pi, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_pd, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_di, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_ix, m68k_op_clr_16_aw, m68k_op_clr_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_clr_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_ai, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pi, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_pd, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_di, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_ix, m68k_op_clr_32_aw, m68k_op_clr_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_neg_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_ai, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi, m68k_op_neg_8_pi7, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd, m68k_op_neg_8_pd7, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_di, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_ix, m68k_op_neg_8_aw, m68k_op_neg_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_neg_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_ai, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pi, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_pd, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_di, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_ix, m68k_op_neg_16_aw, m68k_op_neg_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_neg_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_ai, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pi, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_pd, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_di, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_ix, m68k_op_neg_32_aw, m68k_op_neg_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_move_16_toc_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_ai, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pi, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_pd, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_di, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_ix, m68k_op_move_16_toc_aw, m68k_op_move_16_toc_al, m68k_op_move_16_toc_pcdi, m68k_op_move_16_toc_pcix, m68k_op_move_16_toc_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_not_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_ai, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi, m68k_op_not_8_pi7, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd, m68k_op_not_8_pd7, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_di, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_ix, m68k_op_not_8_aw, m68k_op_not_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_not_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_ai, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pi, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_pd, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_di, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_ix, m68k_op_not_16_aw, m68k_op_not_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_not_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_ai, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pi, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_pd, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_di, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_ix, m68k_op_not_32_aw, m68k_op_not_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_move_16_tos_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_ai, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pi, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_pd, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_di, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_ix, m68k_op_move_16_tos_aw, m68k_op_move_16_tos_al, m68k_op_move_16_tos_pcdi, m68k_op_move_16_tos_pcix, m68k_op_move_16_tos_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_nbcd_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_ai, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi, m68k_op_nbcd_8_pi7, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd, m68k_op_nbcd_8_pd7, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_di, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_ix, m68k_op_nbcd_8_aw, m68k_op_nbcd_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_swap_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_pea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_di, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_ix, m68k_op_pea_32_aw, m68k_op_pea_32_al, m68k_op_pea_32_pcdi, m68k_op_pea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_ext_16, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_movem_16_re_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_pd, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_di, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_ix, m68k_op_movem_16_re_aw, m68k_op_movem_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_ext_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_movem_32_re_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_pd, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_di, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_ix, m68k_op_movem_32_re_aw, m68k_op_movem_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_tst_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_ai, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi, m68k_op_tst_8_pi7, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd, m68k_op_tst_8_pd7, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_di, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_ix, m68k_op_tst_8_aw, m68k_op_tst_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_tst_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_ai, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pi, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_pd, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_di, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_ix, m68k_op_tst_16_aw, m68k_op_tst_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_tst_32_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_ai, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pi, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_pd, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_di, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_ix, m68k_op_tst_32_aw, m68k_op_tst_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_tas_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_ai, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi, m68k_op_tas_8_pi7, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd, m68k_op_tas_8_pd7, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_di, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_ix, m68k_op_tas_8_aw, m68k_op_tas_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_ai, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_movem_16_er_pi, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_di, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_ix, m68k_op_movem_16_er_aw, m68k_op_movem_16_er_al, m68k_op_movem_16_er_pcdi, m68k_op_movem_16_er_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_ai, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_movem_32_er_pi, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_di, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_ix, m68k_op_movem_32_er_aw, m68k_op_movem_32_er_al, m68k_op_movem_32_er_pcdi, m68k_op_movem_32_er_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_trap, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16, m68k_op_link_16_a7, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32, m68k_op_unlk_32_a7, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_tou, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_move_32_fru, m68k_op_reset, m68k_op_nop, m68k_op_stop, m68k_op_rte_32, m68k_op_illegal, m68k_op_rts_32, m68k_op_trapv, m68k_op_rtr_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_jsr_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_di, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_ix, m68k_op_jsr_32_aw, m68k_op_jsr_32_al, m68k_op_jsr_32_pcdi, m68k_op_jsr_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_jmp_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_di, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_ix, m68k_op_jmp_32_aw, m68k_op_jmp_32_al, m68k_op_jmp_32_pcdi, m68k_op_jmp_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_chk_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_ai, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pi, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_pd, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_di, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_ix, m68k_op_chk_16_aw, m68k_op_chk_16_al, m68k_op_chk_16_pcdi, m68k_op_chk_16_pcix, m68k_op_chk_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_lea_32_ai, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_di, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_ix, m68k_op_lea_32_aw, m68k_op_lea_32_al, m68k_op_lea_32_pcdi, m68k_op_lea_32_pcix, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_st_8_d, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_dbt_16, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_ai, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi, m68k_op_st_8_pi7, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd, m68k_op_st_8_pd7, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_di, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_ix, m68k_op_st_8_aw, m68k_op_st_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_sf_8_d, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_dbf_16, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_ai, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi, m68k_op_sf_8_pi7, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd, m68k_op_sf_8_pd7, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_di, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_ix, m68k_op_sf_8_aw, m68k_op_sf_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_shi_8_d, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_dbhi_16, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_ai, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi, m68k_op_shi_8_pi7, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd, m68k_op_shi_8_pd7, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_di, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_ix, m68k_op_shi_8_aw, m68k_op_shi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_sls_8_d, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_dbls_16, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_ai, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi, m68k_op_sls_8_pi7, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd, m68k_op_sls_8_pd7, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_di, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_ix, m68k_op_sls_8_aw, m68k_op_sls_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_scc_8_d, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_dbcc_16, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_ai, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi, m68k_op_scc_8_pi7, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd, m68k_op_scc_8_pd7, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_di, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_ix, m68k_op_scc_8_aw, m68k_op_scc_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_scs_8_d, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_dbcs_16, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_ai, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi, m68k_op_scs_8_pi7, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd, m68k_op_scs_8_pd7, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_di, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_ix, m68k_op_scs_8_aw, m68k_op_scs_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_sne_8_d, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_dbne_16, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_ai, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi, m68k_op_sne_8_pi7, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd, m68k_op_sne_8_pd7, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_di, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_ix, m68k_op_sne_8_aw, m68k_op_sne_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_seq_8_d, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_dbeq_16, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_ai, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi, m68k_op_seq_8_pi7, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd, m68k_op_seq_8_pd7, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_di, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_ix, m68k_op_seq_8_aw, m68k_op_seq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_svc_8_d, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_dbvc_16, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_ai, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi, m68k_op_svc_8_pi7, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd, m68k_op_svc_8_pd7, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_di, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_ix, m68k_op_svc_8_aw, m68k_op_svc_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_svs_8_d, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_dbvs_16, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_ai, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi, m68k_op_svs_8_pi7, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd, m68k_op_svs_8_pd7, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_di, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_ix, m68k_op_svs_8_aw, m68k_op_svs_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_spl_8_d, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_dbpl_16, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_ai, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi, m68k_op_spl_8_pi7, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd, m68k_op_spl_8_pd7, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_di, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_ix, m68k_op_spl_8_aw, m68k_op_spl_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_smi_8_d, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_dbmi_16, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_ai, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi, m68k_op_smi_8_pi7, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd, m68k_op_smi_8_pd7, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_di, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_ix, m68k_op_smi_8_aw, m68k_op_smi_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_sge_8_d, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_dbge_16, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_ai, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi, m68k_op_sge_8_pi7, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd, m68k_op_sge_8_pd7, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_di, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_ix, m68k_op_sge_8_aw, m68k_op_sge_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_slt_8_d, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_dblt_16, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_ai, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi, m68k_op_slt_8_pi7, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd, m68k_op_slt_8_pd7, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_di, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_ix, m68k_op_slt_8_aw, m68k_op_slt_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_addq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_ai, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi, m68k_op_addq_8_pi7, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd, m68k_op_addq_8_pd7, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_di, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_ix, m68k_op_addq_8_aw, m68k_op_addq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_d, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_a, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_ai, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pi, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_pd, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_di, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_ix, m68k_op_addq_16_aw, m68k_op_addq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_d, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_a, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_ai, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pi, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_pd, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_di, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_ix, m68k_op_addq_32_aw, m68k_op_addq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_sgt_8_d, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_dbgt_16, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_ai, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi, m68k_op_sgt_8_pi7, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd, m68k_op_sgt_8_pd7, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_di, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_ix, m68k_op_sgt_8_aw, m68k_op_sgt_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_subq_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_ai, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi, m68k_op_subq_8_pi7, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd, m68k_op_subq_8_pd7, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_di, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_ix, m68k_op_subq_8_aw, m68k_op_subq_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_d, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_a, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_ai, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pi, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_pd, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_di, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_ix, m68k_op_subq_16_aw, m68k_op_subq_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_d, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_a, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_ai, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pi, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_pd, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_di, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_ix, m68k_op_subq_32_aw, m68k_op_subq_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_sle_8_d, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_dble_16, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_ai, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi, m68k_op_sle_8_pi7, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd, m68k_op_sle_8_pd7, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_di, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_ix, m68k_op_sle_8_aw, m68k_op_sle_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_bra_16, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_8, m68k_op_bra_32, m68k_op_bsr_16, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_8, m68k_op_bsr_32, m68k_op_bhi_16, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_8, m68k_op_bhi_32, m68k_op_bls_16, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_8, m68k_op_bls_32, m68k_op_bcc_16, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_8, m68k_op_bcc_32, m68k_op_bcs_16, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_8, m68k_op_bcs_32, m68k_op_bne_16, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_8, m68k_op_bne_32, m68k_op_beq_16, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_8, m68k_op_beq_32, m68k_op_bvc_16, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_8, m68k_op_bvc_32, m68k_op_bvs_16, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_8, m68k_op_bvs_32, m68k_op_bpl_16, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_8, m68k_op_bpl_32, m68k_op_bmi_16, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_8, m68k_op_bmi_32, m68k_op_bge_16, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_8, m68k_op_bge_32, m68k_op_blt_16, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_8, m68k_op_blt_32, m68k_op_bgt_16, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_8, m68k_op_bgt_32, m68k_op_ble_16, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_8, m68k_op_ble_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_moveq_32, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm, m68k_op_sbcd_8_mm_ay7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_or_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_ai, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi, m68k_op_or_8_er_pi7, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd, m68k_op_or_8_er_pd7, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_di, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_ix, m68k_op_or_8_er_aw, m68k_op_or_8_er_al, m68k_op_or_8_er_pcdi, m68k_op_or_8_er_pcix, m68k_op_or_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_or_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_ai, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pi, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_pd, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_di, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_ix, m68k_op_or_16_er_aw, m68k_op_or_16_er_al, m68k_op_or_16_er_pcdi, m68k_op_or_16_er_pcix, m68k_op_or_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_or_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_ai, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pi, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_pd, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_di, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_ix, m68k_op_or_32_er_aw, m68k_op_or_32_er_al, m68k_op_or_32_er_pcdi, m68k_op_or_32_er_pcix, m68k_op_or_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_divu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_ai, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pi, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_pd, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_di, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_ix, m68k_op_divu_16_aw, m68k_op_divu_16_al, m68k_op_divu_16_pcdi, m68k_op_divu_16_pcix, m68k_op_divu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_rr, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_ax7, m68k_op_sbcd_8_mm_axy7, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_ai, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi, m68k_op_or_8_re_pi7, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd, m68k_op_or_8_re_pd7, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_di, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_ix, m68k_op_or_8_re_aw, m68k_op_or_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_ai, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pi, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_pd, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_di, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_ix, m68k_op_or_16_re_aw, m68k_op_or_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_ai, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pi, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_pd, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_di, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_ix, m68k_op_or_32_re_aw, m68k_op_or_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_divs_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_ai, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pi, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_pd, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_di, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_ix, m68k_op_divs_16_aw, m68k_op_divs_16_al, m68k_op_divs_16_pcdi, m68k_op_divs_16_pcix, m68k_op_divs_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm, m68k_op_subx_8_mm_ay7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_sub_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_ai, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi, m68k_op_sub_8_er_pi7, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd, m68k_op_sub_8_er_pd7, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_di, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_ix, m68k_op_sub_8_er_aw, m68k_op_sub_8_er_al, m68k_op_sub_8_er_pcdi, m68k_op_sub_8_er_pcix, m68k_op_sub_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_d, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_a, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_ai, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pi, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_pd, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_di, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_ix, m68k_op_sub_16_er_aw, m68k_op_sub_16_er_al, m68k_op_sub_16_er_pcdi, m68k_op_sub_16_er_pcix, m68k_op_sub_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_d, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_a, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_ai, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pi, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_pd, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_di, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_ix, m68k_op_sub_32_er_aw, m68k_op_sub_32_er_al, m68k_op_sub_32_er_pcdi, m68k_op_sub_32_er_pcix, m68k_op_sub_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_d, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_a, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_ai, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pi, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_pd, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_di, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_ix, m68k_op_suba_16_aw, m68k_op_suba_16_al, m68k_op_suba_16_pcdi, m68k_op_suba_16_pcix, m68k_op_suba_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_rr, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_ax7, m68k_op_subx_8_mm_axy7, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_ai, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi, m68k_op_sub_8_re_pi7, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd, m68k_op_sub_8_re_pd7, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_di, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_ix, m68k_op_sub_8_re_aw, m68k_op_sub_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_rr, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_subx_16_mm, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_ai, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pi, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_pd, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_di, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_ix, m68k_op_sub_16_re_aw, m68k_op_sub_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_rr, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_subx_32_mm, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_ai, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pi, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_pd, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_di, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_ix, m68k_op_sub_32_re_aw, m68k_op_sub_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_d, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_a, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_ai, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pi, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_pd, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_di, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_ix, m68k_op_suba_32_aw, m68k_op_suba_32_al, m68k_op_suba_32_pcdi, m68k_op_suba_32_pcix, m68k_op_suba_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_1010, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8, m68k_op_cmpm_8_ay7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_cmp_8_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_ai, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi, m68k_op_cmp_8_pi7, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd, m68k_op_cmp_8_pd7, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_di, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_ix, m68k_op_cmp_8_aw, m68k_op_cmp_8_al, m68k_op_cmp_8_pcdi, m68k_op_cmp_8_pcix, m68k_op_cmp_8_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_d, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_a, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_ai, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pi, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_pd, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_di, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_ix, m68k_op_cmp_16_aw, m68k_op_cmp_16_al, m68k_op_cmp_16_pcdi, m68k_op_cmp_16_pcix, m68k_op_cmp_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_d, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_a, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_ai, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pi, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_pd, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_di, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_ix, m68k_op_cmp_32_aw, m68k_op_cmp_32_al, m68k_op_cmp_32_pcdi, m68k_op_cmp_32_pcix, m68k_op_cmp_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_d, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_a, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_ai, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pi, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_pd, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_di, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_ix, m68k_op_cmpa_16_aw, m68k_op_cmpa_16_al, m68k_op_cmpa_16_pcdi, m68k_op_cmpa_16_pcix, m68k_op_cmpa_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_eor_8_d, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_ax7, m68k_op_cmpm_8_axy7, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_ai, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi, m68k_op_eor_8_pi7, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd, m68k_op_eor_8_pd7, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_di, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_ix, m68k_op_eor_8_aw, m68k_op_eor_8_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_eor_16_d, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_cmpm_16, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_ai, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pi, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_pd, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_di, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_ix, m68k_op_eor_16_aw, m68k_op_eor_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_eor_32_d, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_cmpm_32, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_ai, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pi, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_pd, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_di, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_ix, m68k_op_eor_32_aw, m68k_op_eor_32_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_d, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_a, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_ai, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pi, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_pd, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_di, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_ix, m68k_op_cmpa_32_aw, m68k_op_cmpa_32_al, m68k_op_cmpa_32_pcdi, m68k_op_cmpa_32_pcix, m68k_op_cmpa_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm, m68k_op_abcd_8_mm_ay7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_and_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_ai, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi, m68k_op_and_8_er_pi7, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd, m68k_op_and_8_er_pd7, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_di, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_ix, m68k_op_and_8_er_aw, m68k_op_and_8_er_al, m68k_op_and_8_er_pcdi, m68k_op_and_8_er_pcix, m68k_op_and_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_and_16_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_ai, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pi, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_pd, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_di, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_ix, m68k_op_and_16_er_aw, m68k_op_and_16_er_al, m68k_op_and_16_er_pcdi, m68k_op_and_16_er_pcix, m68k_op_and_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_and_32_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_ai, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pi, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_pd, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_di, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_ix, m68k_op_and_32_er_aw, m68k_op_and_32_er_al, m68k_op_and_32_er_pcdi, m68k_op_and_32_er_pcix, m68k_op_and_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_mulu_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_ai, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pi, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_pd, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_di, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_ix, m68k_op_mulu_16_aw, m68k_op_mulu_16_al, m68k_op_mulu_16_pcdi, m68k_op_mulu_16_pcix, m68k_op_mulu_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_rr, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_ax7, m68k_op_abcd_8_mm_axy7, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_ai, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi, m68k_op_and_8_re_pi7, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd, m68k_op_and_8_re_pd7, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_di, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_ix, m68k_op_and_8_re_aw, m68k_op_and_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_dd, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_exg_32_aa, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_ai, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pi, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_pd, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_di, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_ix, m68k_op_and_16_re_aw, m68k_op_and_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_exg_32_da, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_ai, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pi, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_pd, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_di, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_ix, m68k_op_and_32_re_aw, m68k_op_and_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_muls_16_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_ai, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pi, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_pd, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_di, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_ix, m68k_op_muls_16_aw, m68k_op_muls_16_al, m68k_op_muls_16_pcdi, m68k_op_muls_16_pcix, m68k_op_muls_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm, m68k_op_addx_8_mm_ay7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_add_8_er_d, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_ai, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi, m68k_op_add_8_er_pi7, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd, m68k_op_add_8_er_pd7, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_di, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_ix, m68k_op_add_8_er_aw, m68k_op_add_8_er_al, m68k_op_add_8_er_pcdi, m68k_op_add_8_er_pcix, m68k_op_add_8_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_d, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_a, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_ai, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pi, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_pd, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_di, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_ix, m68k_op_add_16_er_aw, m68k_op_add_16_er_al, m68k_op_add_16_er_pcdi, m68k_op_add_16_er_pcix, m68k_op_add_16_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_d, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_a, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_ai, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pi, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_pd, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_di, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_ix, m68k_op_add_32_er_aw, m68k_op_add_32_er_al, m68k_op_add_32_er_pcdi, m68k_op_add_32_er_pcix, m68k_op_add_32_er_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_d, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_a, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_ai, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pi, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_pd, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_di, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_ix, m68k_op_adda_16_aw, m68k_op_adda_16_al, m68k_op_adda_16_pcdi, m68k_op_adda_16_pcix, m68k_op_adda_16_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_rr, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_ax7, m68k_op_addx_8_mm_axy7, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_ai, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi, m68k_op_add_8_re_pi7, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd, m68k_op_add_8_re_pd7, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_di, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_ix, m68k_op_add_8_re_aw, m68k_op_add_8_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_rr, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_addx_16_mm, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_ai, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pi, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_pd, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_di, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_ix, m68k_op_add_16_re_aw, m68k_op_add_16_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_rr, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_addx_32_mm, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_ai, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pi, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_pd, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_di, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_ix, m68k_op_add_32_re_aw, m68k_op_add_32_re_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_d, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_a, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_ai, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pi, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_pd, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_di, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_ix, m68k_op_adda_32_aw, m68k_op_adda_32_al, m68k_op_adda_32_pcdi, m68k_op_adda_32_pcix, m68k_op_adda_32_i, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_ai, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pi, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_pd, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_di, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_ix, m68k_op_asr_16_aw, m68k_op_asr_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_ai, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pi, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_pd, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_di, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_ix, m68k_op_asl_16_aw, m68k_op_asl_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_ai, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pi, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_pd, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_di, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_ix, m68k_op_lsr_16_aw, m68k_op_lsr_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_ai, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pi, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_pd, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_di, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_ix, m68k_op_lsl_16_aw, m68k_op_lsl_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_ai, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pi, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_pd, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_di, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_ix, m68k_op_roxr_16_aw, m68k_op_roxr_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_ai, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pi, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_pd, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_di, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_ix, m68k_op_roxl_16_aw, m68k_op_roxl_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_ai, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pi, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_pd, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_di, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_ix, m68k_op_ror_16_aw, m68k_op_ror_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_ai, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pi, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_pd, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_di, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_ix, m68k_op_rol_16_aw, m68k_op_rol_16_al, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_asr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_lsr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_roxr_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_ror_8_s, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_asr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_lsr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_roxr_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_ror_8_r, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_asr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_lsr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_roxr_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_ror_16_s, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_asr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_lsr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_roxr_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_ror_16_r, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_asr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_lsr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_roxr_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_ror_32_s, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_asr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_lsr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_roxr_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_ror_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_asl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_lsl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_roxl_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_rol_8_s, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_asl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_lsl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_roxl_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_rol_8_r, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_asl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_lsl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_roxl_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_rol_16_s, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_asl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_lsl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_roxl_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_rol_16_r, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_asl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_lsl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_roxl_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_rol_32_s, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_asl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_lsl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_roxl_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_rol_32_r, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_illegal, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, m68k_op_1111, }; gx/images/Button_arrow.png000664 001750 001750 00000006472 12702465756 017007 0ustar00sergiosergio000000 000000 PNG  IHDR,,ZsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09? IDATxՙ}py?{+Ǜ$l]H_j]b"6baJvhڞv& ;cOp3$`ڄqIxA`$@zA/w!z$aǴo=oO,OMUU-J\@$^W>SSVU56}; \`U6a%L@ < 'LfޜJkFI^8BQk?t pӈ-%V2fϙE0M_> u7"ePR9ߙtS9`[Q W?ݱ}39a63R=ޤ)  3Nߥrbm(^~J<(J Zl:p|J w@n 'r?z!~?x<4mXqOCȿ^>Gˇ$uy}REQZO7n~-yȯA=t|Ȳ$Ix<$IB$DQ$H` or5orz]\e~++va+aFU%~ҿ'hYAїpY,kۀ ( 8>'u ai$Q 3DnyiY!O6~F(c§2kh<AN6UUU<裬Y3g:,u]'FbHF;xd?Sy 1`+#Gbfl9OHuC]`,[ QQUu<'9:@EäW7=o}$UU-f49JK\*(&Zo?xŊ:3@AAiIi(pV-M ܮj[%#{ڇEсL555,ZAp]FhWie\|xM~ ֩ BzA%O[QA@E|A/_> ?g}qχԩS߿0N,#:RfF6r E@Ǚ/XKxH$IoAA`ԩ TVVg'u@> !=PV8{*~<Ϩ$pB~ag^-Uf4- D>( ̛Ng[@HiEvVsYti"nfx P`}T+e Dz[1MQeQ]]DZbfY'19{^a^7pG=)j6;X*g> GCŴf0P #m޽qt]Gu}v{ץNnD" >p w+ldLך48x ===֒2n_*Q u=IMH$ ŵiCn֣dM"MrIZE'{:{Ο-4-L% _ݛy ?b⭋HޤkʦMhnnvjIM(z9HP #]8w08SR9LVlsC[[ni# 67SSR1NQvXQ xfI]z"]1kHYdYlٲcǎiCCCI^3Zin=oO[K0_nٰaEEE#==sYqCʫ|鴟Nj4M]ikkڳ@<g¼Ǒ9T:?.**.aX w6sw"<F9|0uuucT4M4R{U֮1*2 M(ʫA;Kkpωp+>rÎVfOu( L^pgu/v ANu7)ュyRlG/8̸NФº!Fzclh9^ABgzsmE1 (Y'-s &s~GXߝ]z V'^fp#;qfzƍ/uˮ)IG"_oڲ=W?OzA%ʧo*`ͻz&[r"xdN ]C1H^^^f~7qr'gJf˓uOS]@5uM廷oL1Ai=O^!|3@=o ̛*ͮpF5WNrYRw۴+ EQˀ]e"nT6 BsV1dk`΄6@tPw#ŷڕ5ff놀]ˁZ;'~}~ٓ(Is!Ǒ0hD{/l yfd%sYRu9 CP%U俽>_< |BtN{̂iddSļ93~#Eݯ  Y SQfx٥a8 R>/MyIENDB`core/cart_hw/svp/ssp16.h000664 001750 001750 00000004141 12702465756 016234 0ustar00sergiosergio000000 000000 /* basic, incomplete SSP160x (SSP1601?) interpreter with SVP memory controller emu (c) Copyright 2008, Grazvydas "notaz" Ignotas Free for non-commercial use. For commercial use, separate licencing terms must be obtained. Modified for Genesis Plus GX (Eke-Eke): added BIG ENDIAN support, fixed addr/code inversion */ #ifndef _SSP16_H_ #define _SSP16_H_ /* emulation event logging (from Picodrive) */ #ifdef LOG_SVP #define EL_SVP 0x00004000 /* SVP stuff */ #define EL_ANOMALY 0x80000000 /* some unexpected conditions (during emulation) */ #define elprintf(w,f,...) error("%d(%d): " f "\n",frame_count,v_counter,##__VA_ARGS__); #endif /* register names */ enum { SSP_GR0, SSP_X, SSP_Y, SSP_A, SSP_ST, SSP_STACK, SSP_PC, SSP_P, SSP_PM0, SSP_PM1, SSP_PM2, SSP_XST, SSP_PM4, SSP_gr13, SSP_PMC, SSP_AL }; typedef union { unsigned int v; struct { #ifdef LSB_FIRST unsigned short l; unsigned short h; #else unsigned short h; unsigned short l; #endif } byte; } ssp_reg_t; typedef struct { union { unsigned short RAM[256*2]; /* 2 internal RAM banks */ struct { unsigned short RAM0[256]; unsigned short RAM1[256]; } bank; } mem; ssp_reg_t gr[16]; /* general registers */ union { unsigned char r[8]; /* BANK pointers */ struct { unsigned char r0[4]; unsigned char r1[4]; } bank; } ptr; unsigned short stack[6]; unsigned int pmac[2][6]; /* read/write modes/addrs for PM0-PM5 */ #define SSP_PMC_HAVE_ADDR 0x0001 /* address written to PMAC, waiting for mode */ #define SSP_PMC_SET 0x0002 /* PMAC is set */ #define SSP_HANG 0x1000 /* 68000 hangs SVP */ #define SSP_WAIT_PM0 0x2000 /* bit1 in PM0 */ #define SSP_WAIT_30FE06 0x4000 /* ssp tight loops on 30FE08 to become non-zero */ #define SSP_WAIT_30FE08 0x8000 /* same for 30FE06 */ #define SSP_WAIT_MASK 0xf000 unsigned int emu_status; unsigned int pad[30]; } ssp1601_t; void ssp1601_reset(ssp1601_t *ssp); void ssp1601_run(int cycles); #endif core/cd_hw/pcm.h000664 001750 001750 00000006477 12702465756 014702 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * PCM sound chip (315-5476A) (RF5C164 compatible) * * Copyright (C) 2012-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _CD_PCM_ #define _CD_PCM_ #include "blip_buf.h" /* PCM channel */ typedef struct { uint32 addr; /* current Wave RAM address (16.11 fixed point) */ uint32 st; /* Wave RAM start address (16.11 fixed point) */ reg16_t ls; /* Wave RAM loop address ($0000-$ffff) */ reg16_t fd; /* Wave RAM address increment (5.11 fixed point) */ uint8 env; /* enveloppe multiplier */ uint8 pan; /* stereo panning */ } chan_t; /* PCM sound chip */ typedef struct { chan_t chan[8]; /* PCM channels 1-8 */ int16 out[2]; /* previous PCM stereo output */ uint8 *bank; /* external RAM bank pointer */ uint8 enabled; /* PCM chip ON/OFF status */ uint8 status; /* channels ON/OFF status */ uint8 index; /* current channel index */ uint8 ram[0x10000]; /* 64k external RAM */ uint32 cycles; } pcm_t; /* Function prototypes */ extern void pcm_init(double clock, int rate); extern void pcm_reset(void); extern int pcm_context_save(uint8 *state); extern int pcm_context_load(uint8 *state); extern void pcm_update(unsigned int samples); extern void pcm_write(unsigned int address, unsigned char data); extern unsigned char pcm_read(unsigned int address); extern void pcm_ram_dma_w(unsigned int words); #endif gx/images/Frame_throbber.png000664 001750 001750 00000004436 12702465756 017241 0ustar00sergiosergio000000 000000 PNG  IHDR$$sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/20/09O#rIDATx͘ml>>rA 4#MI4PUQV! mHڴ@-HQPR@RH**QKMm޾N?s &˝V<3(%4jMl%)9P>g7ܽ;JTW.id23+Drh;BD];Xj]ԁ7R.0LdZiԻv]JݒbylDžEL'Z0iB4VjJD#<>4M^|^\Ag>\iR e9hd 1qlVmmo?Ƶ6JUUU︮~syyy x~dI Ԇ4i"QP,X79eىOGζ_8!ڹyKj,˱ 91#G,*1_Ca V(Hqܖak֝hi?>3p_Ga(ȬYr˖%F<躎l6+UWW׀n`KRYqqw_%mDv" JH[ ,D l׵R*֮< %4)u1s:My8\@^.хw+PUU9!x(zv```v]]]|lLX N9|̟;+0c[R*++?eyFљcH4JVx<݁lNEA7z<~Sl92>˲zd`m$I ViX>DxB @B1u8>:8)P ͩA 86c>l[i `sJ)zQ@xP():w(MӔ|E<̙9Im"<>B ]%MӠ:dВ%KA(RPۆe2݃uw|g]]P<!77aQo?~D" Ck׮ݳlٲ98kJB6$pPz=L=ek;dyq_;=+7dnooc.v}W08x54VR1r[ ,0*D+g'Ou =}}WSsE4ɴ_}7E^:@IENDB`core/cart_hw/svp/ssp16.c000664 001750 001750 00000115372 12702465756 016240 0ustar00sergiosergio000000 000000 /* basic, incomplete SSP160x (SSP1601?) interpreter with SVP memory controller emu (c) Copyright 2008, Grazvydas "notaz" Ignotas Free for non-commercial use. For commercial use, separate licencing terms must be obtained. Modified for Genesis Plus GX (Eke-Eke), added big endian support, fixed mode & addr */ /* * Register info * * 0. "-" * size: 16 * desc: Constant register with all bits set (0xffff). * * 1. "X" * size: 16 * desc: Generic register. When set, updates P (P = X * Y * 2) * * 2. "Y" * size: 16 * desc: Generic register. When set, updates P (P = X * Y * 2) * * 3. "A" * size: 32 * desc: Accumulator. * * 4. "ST" * size: 16 * desc: Status register. From MAME: bits 0-9 are CONTROL, other FLAG * fedc ba98 7654 3210 * 210 - RPL (?) "Loop size". If non-zero, makes (rX+) and (rX-) respectively * modulo-increment and modulo-decrement. The value shows which * power of 2 to use, i.e. 4 means modulo by 16. * (e: fir16_32.sc, IIR_4B.SC, DECIM.SC) * 43 - RB (?) * 5 - GP0_0 (ST5?) Changed before acessing PM0 (affects banking?). * 6 - GP0_1 (ST6?) Cleared before acessing PM0 (affects banking?). Set after. * datasheet says these (5,6) bits correspond to hardware pins. * 7 - IE (?) Not directly used by SVP code (never set, but preserved)? * 8 - OP (?) Not used by SVP code (only cleared)? (MAME: saturated value * (probably means clamping? i.e. 0x7ffc + 9 -> 0x7fff)) * 9 - MACS (?) Not used by SVP code (only cleared)? (e: "mac shift") * a - GPI_0 Interrupt 0 enable/status? * b - GPI_1 Interrupt 1 enable/status? * c - L L flag. Carry? * d - Z Zero flag. * e - OV Overflow flag. * f - N Negative flag. * seen directly changing code sequences: * ldi ST, 0 ld A, ST ld A, ST ld A, ST ldi st, 20h * ldi ST, 60h ori A, 60h and A, E8h and A, E8h * ld ST, A ld ST, A ori 3 * ld ST, A * * 5. "STACK" * size: 16 * desc: hw stack of 6 levels (according to datasheet) * * 6. "PC" * size: 16 * desc: Program counter. * * 7. "P" * size: 32 * desc: multiply result register. P = X * Y * 2 * probably affected by MACS bit in ST. * * 8. "PM0" (PM from PMAR name from Tasco's docs) * size: 16? * desc: Programmable Memory access register. * On reset, or when one (both?) GP0 bits are clear, * acts as status for XST, mapped at 015004 at 68k side: * bit0: ssp has written something to XST (cleared when 015004 is read) * bit1: 68k has written something through a1500{0|2} (cleared on PM0 read) * * 9. "PM1" * size: 16? * desc: Programmable Memory access register. * This reg. is only used as PMAR. * * 10. "PM2" * size: 16? * desc: Programmable Memory access register. * This reg. is only used as PMAR. * * 11. "XST" * size: 16? * desc: eXternal STate. Mapped to a15000 and a15002 at 68k side. * Can be programmed as PMAR? (only seen in test mode code) * Affects PM0 when written to? * * 12. "PM4" * size: 16? * desc: Programmable Memory access register. * This reg. is only used as PMAR. The most used PMAR by VR. * * 13. (unused by VR) * * 14. "PMC" (PMC from PMAC name from Tasco's docs) * size: 32? * desc: Programmable Memory access Control. Set using 2 16bit writes, * first address, then mode word. After setting PMAC, PMAR sould * be blind accessed (ld -, PMx or ld PMx, -) to program it for * reading and writing respectively. * Reading the register also shifts it's state (from "waiting for * address" to "waiting for mode" and back). Reads always return * address related to last PMx register accressed. * (note: addresses do not wrap). * * 15. "AL" * size: 16 * desc: Accumulator Low. 16 least significant bits of accumulator. * (normally reading acc (ld X, A) you get 16 most significant bits). * * * There are 8 8-bit pointer registers rX. r0-r3 (ri) point to RAM0, r4-r7 (rj) point to RAM1. * They can be accessed directly, or 2 indirection levels can be used [ (rX), ((rX)) ], * which work similar to * and ** operators in C, only they use different memory banks and * ((rX)) also does post-increment. First indirection level (rX) accesses RAMx, second accesses * program memory at address read from (rX), and increments value in (rX). * * r0,r1,r2,r4,r5,r6 can be modified [ex: ldi r0, 5]. * 3 modifiers can be applied (optional): * + : post-increment [ex: ld a, (r0+) ]. Can be made modulo-increment by setting RPL bits in ST. * - : post-decrement. Can be made modulo-decrement by setting RPL bits in ST (not sure). * +!: post-increment, unaffected by RPL (probably). * These are only used on 1st indirection level, so things like [ld a, ((r0+))] and [ld X, r6-] * ar probably invalid. * * r3 and r7 are special and can not be changed (at least Samsung samples and SVP code never do). * They are fixed to the start of their RAM banks. (They are probably changeable for ssp1605+, * Samsung's old DSP page claims that). * 1 of these 4 modifiers must be used (short form direct addressing?): * |00: RAMx[0] [ex: (r3|00), 0] (based on sample code) * |01: RAMx[1] * |10: RAMx[2] ? maybe 10h? accortding to Div_c_dp.sc, 2 * |11: RAMx[3] * * * Instruction notes * * ld a, * doesn't affect flags! (e: A_LAW.SC, Div_c_dp.sc) * * mld (rj), (ri) [, b] * operation: A = 0; P = (rj) * (ri) * notes: based on IIR_4B.SC sample. flags? what is b??? * * mpya (rj), (ri) [, b] * name: multiply and add? * operation: A += P; P = (rj) * (ri) * * mpys (rj), (ri), b * name: multiply and subtract? * notes: not used by VR code. * * mod cond, op * mod cond, shr does arithmetic shift * * 'ld -, AL' and probably 'ld AL, -' are for dummy assigns * * memory map: * 000000 - 1fffff ROM, accessable by both * 200000 - 2fffff unused? * 300000 - 31ffff DRAM, both * 320000 - 38ffff unused? * 390000 - 3907ff IRAM. can only be accessed by ssp? * 390000 - 39ffff similar mapping to "cell arrange" in Sega CD, 68k only? * 3a0000 - 3affff similar mapping to "cell arrange" in Sega CD, a bit different * * 30fe02 - 0 if SVP busy, 1 if done (set by SVP, checked and cleared by 68k) * 30fe06 - also sync related. * 30fe08 - job number [1-12] for SVP. 0 means no job. Set by 68k, read-cleared by SVP. * * + figure out if 'op A, P' is 32bit (nearly sure it is) * * does mld, mpya load their operands into X and Y? * * OP simm * * Assumptions in this code * P is not directly writeable * flags correspond to full 32bit accumulator * only Z and N status flags are emulated (others unused by SVP) * modifiers for 'OP a, ri' are ignored (invalid?/not used by SVP) * 'ld d, (a)' loads from program ROM */ #include "shared.h" #define u32 unsigned int /*#define USE_DEBUGGER*/ /* 0 */ #define rX ssp->gr[SSP_X].byte.h #define rY ssp->gr[SSP_Y].byte.h #define rA ssp->gr[SSP_A].byte.h #define rST ssp->gr[SSP_ST].byte.h /* 4 */ #define rSTACK ssp->gr[SSP_STACK].byte.h #define rPC ssp->gr[SSP_PC].byte.h #define rP ssp->gr[SSP_P] #define rPM0 ssp->gr[SSP_PM0].byte.h /* 8 */ #define rPM1 ssp->gr[SSP_PM1].byte.h #define rPM2 ssp->gr[SSP_PM2].byte.h #define rXST ssp->gr[SSP_XST].byte.h #define rPM4 ssp->gr[SSP_PM4].byte.h /* 12 */ /* 13 */ #define rPMC ssp->gr[SSP_PMC] /* will keep addr in .h, mode in .l */ #define rAL ssp->gr[SSP_A].byte.l #define rA32 ssp->gr[SSP_A].v #define rIJ ssp->ptr.r #define IJind (((op>>6)&4)|(op&3)) #define GET_PC() (PC - (unsigned short *)svp->iram_rom) #define GET_PPC_OFFS() ((unsigned int)PC - (unsigned int)svp->iram_rom - 2) #define SET_PC(d) PC = (unsigned short *)svp->iram_rom + d #define REG_READ(r) (((r) <= 4) ? ssp->gr[r].byte.h : read_handlers[r]()) #define REG_WRITE(r,d) { \ int r1 = r; \ if (r1 >= 4) write_handlers[r1](d); \ else if (r1 > 0) ssp->gr[r1].byte.h = d; \ } /* flags */ #define SSP_FLAG_L (1<<0xc) #define SSP_FLAG_Z (1<<0xd) #define SSP_FLAG_V (1<<0xe) #define SSP_FLAG_N (1<<0xf) /* update ZN according to 32bit ACC. */ #define UPD_ACC_ZN \ rST &= ~(SSP_FLAG_Z|SSP_FLAG_N); \ if (!rA32) rST |= SSP_FLAG_Z; \ else rST |= (rA32>>16)&SSP_FLAG_N; /* it seems SVP code never checks for L and OV, so we leave them out. */ /* rST |= (t>>4)&SSP_FLAG_L; */ #define UPD_LZVN \ rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ if (!rA32) rST |= SSP_FLAG_Z; \ else rST |= (rA32>>16)&SSP_FLAG_N; /* standard cond processing. */ /* again, only Z and N is checked, as SVP doesn't seem to use any other conds. */ #define COND_CHECK \ switch (op&0xf0) { \ case 0x00: cond = 1; break; /* always true */ \ case 0x50: cond = !((rST ^ (op<<5)) & SSP_FLAG_Z); break; /* Z matches f(?) bit */ \ case 0x70: cond = !((rST ^ (op<<7)) & SSP_FLAG_N); break; /* N matches f(?) bit */ \ default: break; \ } /* ops with accumulator. */ /* how is low word really affected by these? */ /* nearly sure 'ld A' doesn't affect flags */ #define OP_LDA(x) \ rA = x #define OP_LDA32(x) \ rA32 = x #define OP_SUBA(x) { \ rA32 -= (x) << 16; \ UPD_LZVN \ } #define OP_SUBA32(x) { \ rA32 -= (x); \ UPD_LZVN \ } #define OP_CMPA(x) { \ u32 t = rA32 - ((x) << 16); \ rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ if (!t) rST |= SSP_FLAG_Z; \ else rST |= (t>>16)&SSP_FLAG_N; \ } #define OP_CMPA32(x) { \ u32 t = rA32 - (x); \ rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ if (!t) rST |= SSP_FLAG_Z; \ else rST |= (t>>16)&SSP_FLAG_N; \ } #define OP_ADDA(x) { \ rA32 += (x) << 16; \ UPD_LZVN \ } #define OP_ADDA32(x) { \ rA32 += (x); \ UPD_LZVN \ } #define OP_ANDA(x) \ rA32 &= (x) << 16; \ UPD_ACC_ZN #define OP_ANDA32(x) \ rA32 &= (x); \ UPD_ACC_ZN #define OP_ORA(x) \ rA32 |= (x) << 16; \ UPD_ACC_ZN #define OP_ORA32(x) \ rA32 |= (x); \ UPD_ACC_ZN #define OP_EORA(x) \ rA32 ^= (x) << 16; \ UPD_ACC_ZN #define OP_EORA32(x) \ rA32 ^= (x); \ UPD_ACC_ZN #define OP_CHECK32(OP) { \ if ((op & 0x0f) == SSP_P) { /* A <- P */ \ read_P(); /* update P */ \ OP(rP.v); \ break; \ } \ if ((op & 0x0f) == SSP_A) { /* A <- A */ \ OP(rA32); \ break; \ } \ } static ssp1601_t *ssp = NULL; static unsigned short *PC; static int g_cycles; #ifdef USE_DEBUGGER static int running = 0; static int last_iram = 0; #endif /* ----------------------------------------------------- */ /* register i/o handlers */ /* 0-4, 13 */ static u32 read_unknown(void) { #ifdef LOG_SVP elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown read @ %04x", GET_PPC_OFFS()); #endif return 0; } static void write_unknown(u32 d) { #ifdef LOG_SVP elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown write @ %04x", GET_PPC_OFFS()); #endif } /* 4 */ static void write_ST(u32 d) { /* if ((rST ^ d) & 0x0007) elprintf(EL_SVP, "ssp RPL %i -> %i @ %04x", rST&7, d&7, GET_PPC_OFFS()); */ #ifdef LOG_SVP if ((rST ^ d) & 0x0f98) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME ST %04x -> %04x @ %04x", rST, d, GET_PPC_OFFS()); #endif rST = d; } /* 5 */ static u32 read_STACK(void) { --rSTACK; if ((short)rSTACK < 0) { rSTACK = 5; #ifdef LOG_SVP elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack underflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); #endif } return ssp->stack[rSTACK]; } static void write_STACK(u32 d) { if (rSTACK >= 6) { #ifdef LOG_SVP elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack overflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); #endif rSTACK = 0; } ssp->stack[rSTACK++] = d; } /* 6 */ static u32 read_PC(void) { /* g_cycles--; */ return GET_PC(); } static void write_PC(u32 d) { SET_PC(d); g_cycles--; } /* 7 */ static u32 read_P(void) { int m1 = (signed short)rX; int m2 = (signed short)rY; rP.v = (m1 * m2 * 2); return rP.byte.h; } /* ----------------------------------------------------- */ static int get_inc(int mode) { int inc = (mode >> 11) & 7; if (inc != 0) { if (inc != 7) inc--; /* inc = (1<<16) << inc; */ inc = 1 << inc; /* 0 1 2 4 8 16 32 128 */ if (mode & 0x8000) inc = -inc; /* decrement mode */ } return inc; } #define overwite_write(dst, d) \ { \ if (d & 0xf000) { dst &= ~0xf000; dst |= d & 0xf000; } \ if (d & 0x0f00) { dst &= ~0x0f00; dst |= d & 0x0f00; } \ if (d & 0x00f0) { dst &= ~0x00f0; dst |= d & 0x00f0; } \ if (d & 0x000f) { dst &= ~0x000f; dst |= d & 0x000f; } \ } static u32 pm_io(int reg, int write, u32 d) { if (ssp->emu_status & SSP_PMC_SET) { /* this MUST be blind r or w */ if ((*(PC-1) & 0xff0f) && (*(PC-1) & 0xfff0)) { #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: tried to set PM%i (%c) with non-blind i/o %08x @ %04x", reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); #endif ssp->emu_status &= ~SSP_PMC_SET; return 0; } #ifdef LOG_SVP elprintf(EL_SVP, "PM%i (%c) set to %08x @ %04x", reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); #endif ssp->pmac[write][reg] = rPMC.v; ssp->emu_status &= ~SSP_PMC_SET; #ifdef LOG_SVP if ((rPMC.v & 0x7f) == 0x1c && (rPMC.v & 0x7fff0000) == 0) { elprintf(EL_SVP, "ssp IRAM copy from %06x", (ssp->mem.bank.RAM1[0]-1)<<1); #ifdef USE_DEBUGGER last_iram = (ssp->mem.bank.RAM1[0]-1)<<1; #endif } #endif return 0; } /* just in case */ if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i (%c) with only addr set @ %04x", reg, write ? 'w' : 'r', GET_PPC_OFFS()); #endif ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; } if (reg == 4 || (rST & 0x60)) { #ifdef LOG_SVP #define CADDR ((((mode<<16)&0x7f0000)|addr)<<1) #endif unsigned short *dram = (unsigned short *)svp->dram; if (write) { /*int mode = ssp->pmac_write[reg]&0xffff; int addr = ssp->pmac_write[reg]>>16;*/ int addr = ssp->pmac[1][reg]&0xffff; int mode = ssp->pmac[1][reg]>>16; #ifdef LOG_SVP if ((mode & 0xb800) == 0xb800) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: mode %04x", mode); #endif if ((mode & 0x43ff) == 0x0018) /* DRAM */ { int inc = get_inc(mode); #ifdef LOG_SVP elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (inc %i, ovrw %i)", reg, CADDR, d, inc >> 16, (mode>>10)&1); #endif if (mode & 0x0400) { overwite_write(dram[addr], d); } else dram[addr] = d; ssp->pmac[1][reg] += inc; } else if ((mode & 0xfbff) == 0x4018) /* DRAM, cell inc */ { #ifdef LOG_SVP elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (cell inc, ovrw %i) @ %04x", reg, CADDR, d, (mode>>10)&1, GET_PPC_OFFS()); #endif if (mode & 0x0400) { overwite_write(dram[addr], d); } else dram[addr] = d; /* ssp->pmac_write[reg] += (addr&1) ? (31<<16) : (1<<16); */ ssp->pmac[1][reg] += (addr&1) ? 31 : 1; } else if ((mode & 0x47ff) == 0x001c) /* IRAM */ { int inc = get_inc(mode); #ifdef LOG_SVP if ((addr&0xfc00) != 0x8000) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid IRAM addr: %04x", addr<<1); elprintf(EL_SVP, "ssp IRAM w [%06x] %04x (inc %i)", (addr<<1)&0x7ff, d, inc >> 16); #endif ((unsigned short *)svp->iram_rom)[addr&0x3ff] = d; ssp->pmac[1][reg] += inc; } #ifdef LOG_SVP else { elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled write mode %04x, [%06x] %04x @ %04x", reg, mode, CADDR, d, GET_PPC_OFFS()); } #endif } else { /*int mode = ssp->pmac_read[reg]&0xffff; int addr = ssp->pmac_read[reg]>>16;*/ int addr = ssp->pmac[0][reg]&0xffff; int mode = ssp->pmac[0][reg]>>16; if ((mode & 0xfff0) == 0x0800) /* ROM, inc 1, verified to be correct */ { #ifdef LOG_SVP elprintf(EL_SVP, "ssp ROM r [%06x] %04x", CADDR, ((unsigned short *)cart.rom)[addr|((mode&0xf)<<16)]); #endif /*if ((signed int)ssp->pmac_read[reg] >> 16 == -1) ssp->pmac_read[reg]++; ssp->pmac_read[reg] += 1<<16;*/ if ((signed int)(ssp->pmac[0][reg] & 0xffff) == -1) ssp->pmac[0][reg] += 1<<16; ssp->pmac[0][reg] ++; d = ((unsigned short *)cart.rom)[addr|((mode&0xf)<<16)]; } else if ((mode & 0x47ff) == 0x0018) /* DRAM */ { int inc = get_inc(mode); #ifdef LOG_SVP elprintf(EL_SVP, "ssp PM%i DRAM r [%06x] %04x (inc %i)", reg, CADDR, dram[addr], inc >> 16); #endif d = dram[addr]; ssp->pmac[0][reg] += inc; } else { #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled read mode %04x, [%06x] @ %04x", reg, mode, CADDR, GET_PPC_OFFS()); #endif d = 0; } } /* PMC value corresponds to last PMR accessed (not sure). */ rPMC.v = ssp->pmac[write][reg]; return d; } return (u32)-1; } /* 8 */ static u32 read_PM0(void) { u32 d = pm_io(0, 0, 0); if (d != (u32)-1) return d; #ifdef LOG_SVP elprintf(EL_SVP, "PM0 raw r %04x @ %04x", rPM0, GET_PPC_OFFS()); #endif d = rPM0; if (!(d & 2) && (GET_PPC_OFFS() == 0x800 || GET_PPC_OFFS() == 0x1851E)) { ssp->emu_status |= SSP_WAIT_PM0; #ifdef LOG_SVP elprintf(EL_SVP, "det TIGHT loop: PM0"); #endif } rPM0 &= ~2; /* ? */ return d; } static void write_PM0(u32 d) { u32 r = pm_io(0, 1, d); if (r != (u32)-1) return; #ifdef LOG_SVP elprintf(EL_SVP, "PM0 raw w %04x @ %04x", d, GET_PPC_OFFS()); #endif rPM0 = d; } /* 9 */ static u32 read_PM1(void) { u32 d = pm_io(1, 0, 0); if (d != (u32)-1) return d; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM1 raw r %04x @ %04x", rPM1, GET_PPC_OFFS()); #endif return rPM1; } static void write_PM1(u32 d) { u32 r = pm_io(1, 1, d); if (r != (u32)-1) return; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM1 raw w %04x @ %04x", d, GET_PPC_OFFS()); #endif rPM1 = d; } /* 10 */ static u32 read_PM2(void) { u32 d = pm_io(2, 0, 0); if (d != (u32)-1) return d; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM2 raw r %04x @ %04x", rPM2, GET_PPC_OFFS()); #endif return rPM2; } static void write_PM2(u32 d) { u32 r = pm_io(2, 1, d); if (r != (u32)-1) return; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM2 raw w %04x @ %04x", d, GET_PPC_OFFS()); #endif rPM2 = d; } /* 11 */ static u32 read_XST(void) { /* can be removed? */ u32 d = pm_io(3, 0, 0); if (d != (u32)-1) return d; #ifdef LOG_SVP elprintf(EL_SVP, "XST raw r %04x @ %04x", rXST, GET_PPC_OFFS()); #endif return rXST; } static void write_XST(u32 d) { /* can be removed? */ u32 r = pm_io(3, 1, d); if (r != (u32)-1) return; #ifdef LOG_SVP elprintf(EL_SVP, "XST raw w %04x @ %04x", d, GET_PPC_OFFS()); #endif rPM0 |= 1; rXST = d; } /* 12 */ static u32 read_PM4(void) { u32 d = pm_io(4, 0, 0); if (d == 0) { switch (GET_PPC_OFFS()) { case 0x0854: ssp->emu_status |= SSP_WAIT_30FE08; #ifdef LOG_SVP elprintf(EL_SVP, "det TIGHT loop: [30fe08]"); #endif break; case 0x4f12: ssp->emu_status |= SSP_WAIT_30FE06; #ifdef LOG_SVP elprintf(EL_SVP, "det TIGHT loop: [30fe06]"); #endif break; } } if (d != (u32)-1) return d; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM4 raw r %04x @ %04x", rPM4, GET_PPC_OFFS()); #endif return rPM4; } static void write_PM4(u32 d) { u32 r = pm_io(4, 1, d); if (r != (u32)-1) return; /* can be removed? */ #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "PM4 raw w %04x @ %04x", d, GET_PPC_OFFS()); #endif rPM4 = d; } /* 14 */ static u32 read_PMC(void) { #ifdef LOG_SVP elprintf(EL_SVP, "PMC r a %04x (st %c) @ %04x", rPMC.byte.h, (ssp->emu_status & SSP_PMC_HAVE_ADDR) ? 'm' : 'a', GET_PPC_OFFS()); #endif if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { /* if (ssp->emu_status & SSP_PMC_SET) */ /* elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); */ ssp->emu_status |= SSP_PMC_SET; ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; /* return ((rPMC.h << 4) & 0xfff0) | ((rPMC.h >> 4) & 0xf); */ return ((rPMC.byte.l << 4) & 0xfff0) | ((rPMC.byte.l >> 4) & 0xf); } else { ssp->emu_status |= SSP_PMC_HAVE_ADDR; /* return rPMC.h; */ return rPMC.byte.l; } } static void write_PMC(u32 d) { if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { /* if (ssp->emu_status & SSP_PMC_SET) */ /* elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); */ ssp->emu_status |= SSP_PMC_SET; ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; /* rPMC.l = d; */ rPMC.byte.h = d; #ifdef LOG_SVP elprintf(EL_SVP, "PMC w m %04x @ %04x", rPMC.byte.l, GET_PPC_OFFS()); #endif } else { ssp->emu_status |= SSP_PMC_HAVE_ADDR; /* rPMC.h = d; */ rPMC.byte.l = d; #ifdef LOG_SVP elprintf(EL_SVP, "PMC w a %04x @ %04x", rPMC.byte.h, GET_PPC_OFFS()); #endif } } /* 15 */ static u32 read_AL(void) { if (*(PC-1) == 0x000f) { #ifdef LOG_SVP elprintf(EL_SVP, "ssp dummy PM assign %08x @ %04x", rPMC.v, GET_PPC_OFFS()); #endif ssp->emu_status &= ~(SSP_PMC_SET|SSP_PMC_HAVE_ADDR); /* ? */ } return rAL; } static void write_AL(u32 d) { rAL = d; } typedef u32 (*read_func_t)(void); typedef void (*write_func_t)(u32 d); static read_func_t read_handlers[16] = { read_unknown, read_unknown, read_unknown, read_unknown, /* -, X, Y, A */ read_unknown, /* 4 ST */ read_STACK, read_PC, read_P, read_PM0, /* 8 */ read_PM1, read_PM2, read_XST, read_PM4, /* 12 */ read_unknown, /* 13 gr13 */ read_PMC, read_AL }; static write_func_t write_handlers[16] = { write_unknown, write_unknown, write_unknown, write_unknown, /* -, X, Y, A */ /* write_unknown, */ /* 4 ST */ write_ST, /* 4 ST (debug hook) */ write_STACK, write_PC, write_unknown, /* 7 P */ write_PM0, /* 8 */ write_PM1, write_PM2, write_XST, write_PM4, /* 12 */ write_unknown, /* 13 gr13 */ write_PMC, write_AL }; /* ----------------------------------------------------- */ /* pointer register handlers */ #define ptr1_read(op) ptr1_read_(op&3,(op>>6)&4,(op<<1)&0x18) static u32 ptr1_read_(int ri, int isj2, int modi3) { /* int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); */ u32 mask, add = 0, t = ri | isj2 | modi3; unsigned char *rp = NULL; switch (t) { /* mod=0 (00) */ case 0x00: case 0x01: case 0x02: return ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]]; case 0x03: return ssp->mem.bank.RAM0[0]; case 0x04: case 0x05: case 0x06: return ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]]; case 0x07: return ssp->mem.bank.RAM1[0]; /* mod=1 (01), "+!" */ case 0x08: case 0x09: case 0x0a: return ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]++]; case 0x0b: return ssp->mem.bank.RAM0[1]; case 0x0c: case 0x0d: case 0x0e: return ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]++]; case 0x0f: return ssp->mem.bank.RAM1[1]; /* mod=2 (10), "-" */ case 0x10: case 0x11: case 0x12: rp = &ssp->ptr.bank.r0[t&3]; t = ssp->mem.bank.RAM0[*rp]; if (!(rST&7)) { (*rp)--; return t; } add = -1; goto modulo; case 0x13: return ssp->mem.bank.RAM0[2]; case 0x14: case 0x15: case 0x16: rp = &ssp->ptr.bank.r1[t&3]; t = ssp->mem.bank.RAM1[*rp]; if (!(rST&7)) { (*rp)--; return t; } add = -1; goto modulo; case 0x17: return ssp->mem.bank.RAM1[2]; /* mod=3 (11), "+" */ case 0x18: case 0x19: case 0x1a: rp = &ssp->ptr.bank.r0[t&3]; t = ssp->mem.bank.RAM0[*rp]; if (!(rST&7)) { (*rp)++; return t; } add = 1; goto modulo; case 0x1b: return ssp->mem.bank.RAM0[3]; case 0x1c: case 0x1d: case 0x1e: rp = &ssp->ptr.bank.r1[t&3]; t = ssp->mem.bank.RAM1[*rp]; if (!(rST&7)) { (*rp)++; return t; } add = 1; goto modulo; case 0x1f: return ssp->mem.bank.RAM1[3]; } return 0; modulo: mask = (1 << (rST&7)) - 1; *rp = (*rp & ~mask) | ((*rp + add) & mask); return t; } static void ptr1_write(int op, u32 d) { int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); switch (t) { /* mod=0 (00) */ case 0x00: case 0x01: case 0x02: ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]] = d; return; case 0x03: ssp->mem.bank.RAM0[0] = d; return; case 0x04: case 0x05: case 0x06: ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]] = d; return; case 0x07: ssp->mem.bank.RAM1[0] = d; return; /* mod=1 (01), "+!" */ /* mod=3, "+" */ case 0x08: case 0x18: case 0x09: case 0x19: case 0x0a: case 0x1a: ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]++] = d; return; case 0x0b: ssp->mem.bank.RAM0[1] = d; return; case 0x0c: case 0x1c: case 0x0d: case 0x1d: case 0x0e: case 0x1e: ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]++] = d; return; case 0x0f: ssp->mem.bank.RAM1[1] = d; return; /* mod=2 (10), "-" */ case 0x10: case 0x11: case 0x12: ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]--] = d; return; case 0x13: ssp->mem.bank.RAM0[2] = d; return; case 0x14: case 0x15: case 0x16: ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]--] = d; return; case 0x17: ssp->mem.bank.RAM1[2] = d; return; /* mod=3 (11) */ case 0x1b: ssp->mem.bank.RAM0[3] = d; return; case 0x1f: ssp->mem.bank.RAM1[3] = d; return; } } static u32 ptr2_read(int op) { int mv = 0, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); switch (t) { /* mod=0 (00) */ case 0x00: case 0x01: case 0x02: mv = ssp->mem.bank.RAM0[ssp->ptr.bank.r0[t&3]]++; break; case 0x03: mv = ssp->mem.bank.RAM0[0]++; break; case 0x04: case 0x05: case 0x06: mv = ssp->mem.bank.RAM1[ssp->ptr.bank.r1[t&3]]++; break; case 0x07: mv = ssp->mem.bank.RAM1[0]++; break; /* mod=1 (01) */ case 0x0b: mv = ssp->mem.bank.RAM0[1]++; break; case 0x0f: mv = ssp->mem.bank.RAM1[1]++; break; /* mod=2 (10) */ case 0x13: mv = ssp->mem.bank.RAM0[2]++; break; case 0x17: mv = ssp->mem.bank.RAM1[2]++; break; /* mod=3 (11) */ case 0x1b: mv = ssp->mem.bank.RAM0[3]++; break; case 0x1f: mv = ssp->mem.bank.RAM1[3]++; break; default: #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid mod in ((rX))? @ %04x", GET_PPC_OFFS()); #endif return 0; } return ((unsigned short *)svp->iram_rom)[mv]; } /* ----------------------------------------------------- */ void ssp1601_reset(ssp1601_t *l_ssp) { ssp = l_ssp; ssp->emu_status = 0; ssp->gr[SSP_GR0].v = 0xffff0000; rPC = 0x400; rSTACK = 0; /* ? using ascending stack */ rST = 0; } #ifdef USE_DEBUGGER static void debug_dump(void) { printf("GR0: %04x X: %04x Y: %04x A: %08x\n", ssp->gr[SSP_GR0].byte.h, rX, rY, ssp->gr[SSP_A].v); printf("PC: %04x (%04x) P: %08x\n", GET_PC(), GET_PC() << 1, ssp->gr[SSP_P].v); printf("PM0: %04x PM1: %04x PM2: %04x\n", rPM0, rPM1, rPM2); printf("XST: %04x PM4: %04x PMC: %08x\n", rXST, rPM4, ssp->gr[SSP_PMC].v); printf(" ST: %04x %c%c%c%c, GP0_0 %i, GP0_1 %i\n", rST, rST&SSP_FLAG_N?'N':'n', rST&SSP_FLAG_V?'V':'v', rST&SSP_FLAG_Z?'Z':'z', rST&SSP_FLAG_L?'L':'l', (rST>>5)&1, (rST>>6)&1); printf("STACK: %i %04x %04x %04x %04x %04x %04x\n", rSTACK, ssp->stack[0], ssp->stack[1], ssp->stack[2], ssp->stack[3], ssp->stack[4], ssp->stack[5]); printf("r0-r2: %02x %02x %02x r4-r6: %02x %02x %02x\n", rIJ[0], rIJ[1], rIJ[2], rIJ[4], rIJ[5], rIJ[6]); elprintf(EL_SVP, "cycles: %i, emu_status: %x", g_cycles, ssp->emu_status); } static void debug_dump_mem(void) { int h, i; printf("RAM0\n"); for (h = 0; h < 32; h++) { if (h == 16) printf("RAM1\n"); printf("%03x:", h*16); for (i = 0; i < 16; i++) printf(" %04x", ssp->mem.RAM[h*16+i]); printf("\n"); } } static void debug_dump2file(const char *fname, void *mem, int len) { FILE *f = fopen(fname, "wb"); unsigned short *p = mem; int i; if (f) { for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); fwrite(mem, 1, len, f); fclose(f); for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); printf("dumped to %s\n", fname); } else printf("dump failed\n"); } static int bpts[10] = { 0, }; static void debug(unsigned int pc, unsigned int op) { static char buffo[64] = {0,}; char buff[64] = {0,}; int i; if (running) { for (i = 0; i < 10; i++) if (pc != 0 && bpts[i] == pc) { printf("breakpoint %i\n", i); running = 0; break; } } if (running) return; printf("%04x (%02x) @ %04x\n", op, op >> 9, pc<<1); while (1) { printf("dbg> "); fflush(stdout); fgets(buff, sizeof(buff), stdin); if (buff[0] == '\n') strcpy(buff, buffo); else strcpy(buffo, buff); switch (buff[0]) { case 0: exit(0); case 'c': case 'r': running = 1; return; case 's': case 'n': return; case 'x': debug_dump(); break; case 'm': debug_dump_mem(); break; case 'b': { char *baddr = buff + 2; i = 0; if (buff[3] == ' ') { i = buff[2] - '0'; baddr = buff + 4; } bpts[i] = strtol(baddr, NULL, 16) >> 1; printf("breakpoint %i set @ %04x\n", i, bpts[i]<<1); break; } case 'd': sprintf(buff, "iramrom_%04x.bin", last_iram); debug_dump2file(buff, svp->iram_rom, sizeof(svp->iram_rom)); debug_dump2file("dram.bin", svp->dram, sizeof(svp->dram)); break; default: printf("unknown command\n"); break; } } } #endif /* USE_DEBUGGER */ void ssp1601_run(int cycles) { SET_PC(rPC); g_cycles = cycles; do { int op; u32 tmpv; op = *PC++; #ifdef USE_DEBUGGER debug(GET_PC()-1, op); #endif switch (op >> 9) { /* ld d, s */ case 0x00: if (op == 0) break; /* nop */ if (op == ((SSP_A<<4)|SSP_P)) { /* A <- P */ /* not sure. MAME claims that only hi word is transfered. */ read_P(); /* update P */ rA32 = rP.v; } else { tmpv = REG_READ(op & 0x0f); REG_WRITE((op & 0xf0) >> 4, tmpv); } break; /* ld d, (ri) */ case 0x01: tmpv = ptr1_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break; /* ld (ri), s */ case 0x02: tmpv = REG_READ((op & 0xf0) >> 4); ptr1_write(op, tmpv); break; /* ldi d, imm */ case 0x04: tmpv = *PC++; REG_WRITE((op & 0xf0) >> 4, tmpv); break; /* ld d, ((ri)) */ case 0x05: tmpv = ptr2_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break; /* ldi (ri), imm */ case 0x06: tmpv = *PC++; ptr1_write(op, tmpv); break; /* ld adr, a */ case 0x07: ssp->mem.RAM[op & 0x1ff] = rA; break; /* ld d, ri */ case 0x09: tmpv = rIJ[(op&3)|((op>>6)&4)]; REG_WRITE((op & 0xf0) >> 4, tmpv); break; /* ld ri, s */ case 0x0a: rIJ[(op&3)|((op>>6)&4)] = REG_READ((op & 0xf0) >> 4); break; /* ldi ri, simm */ case 0x0c: case 0x0d: case 0x0e: case 0x0f: rIJ[(op>>8)&7] = op; break; /* call cond, addr */ case 0x24: { int cond = 0; COND_CHECK if (cond) { int new_PC = *PC++; write_STACK(GET_PC()); write_PC(new_PC); } else PC++; break; } /* ld d, (a) */ case 0x25: tmpv = ((unsigned short *)svp->iram_rom)[rA]; REG_WRITE((op & 0xf0) >> 4, tmpv); break; /* bra cond, addr */ case 0x26: { int cond = 0; COND_CHECK if (cond) { int new_PC = *PC++; write_PC(new_PC); } else PC++; break; } /* mod cond, op */ case 0x48: { int cond = 0; COND_CHECK if (cond) { switch (op & 7) { case 2: rA32 = (signed int)rA32 >> 1; break; /* shr (arithmetic) */ case 3: rA32 <<= 1; break; /* shl */ case 6: rA32 = -(signed int)rA32; break; /* neg */ case 7: if ((int)rA32 < 0) rA32 = -(signed int)rA32; break; /* abs */ default: #ifdef LOG_SVP elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: unhandled mod %i @ %04x", op&7, GET_PPC_OFFS()); #endif break; } UPD_ACC_ZN /* ? */ } break; } /* mpys? */ case 0x1b: #ifdef LOG_SVP if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); #endif read_P(); /* update P */ rA32 -= rP.v; /* maybe only upper word? */ UPD_ACC_ZN /* there checking flags after this */ rX = ptr1_read_(op&3, 0, (op<<1)&0x18); /* ri (maybe rj?) */ rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); /* rj */ break; /* mpya (rj), (ri), b */ case 0x4b: #ifdef LOG_SVP if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); #endif read_P(); /* update P */ rA32 += rP.v; /* confirmed to be 32bit */ UPD_ACC_ZN /* ? */ rX = ptr1_read_(op&3, 0, (op<<1)&0x18); /* ri (maybe rj?) */ rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); /* rj */ break; /* mld (rj), (ri), b */ case 0x5b: #ifdef LOG_SVP if (!(op&0x100)) elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: no b bit @ %04x", GET_PPC_OFFS()); #endif rA32 = 0; rST &= 0x0fff; /* ? */ rX = ptr1_read_(op&3, 0, (op<<1)&0x18); /* ri (maybe rj?) */ rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); /* rj */ break; /* OP a, s */ case 0x10: OP_CHECK32(OP_SUBA32); tmpv = REG_READ(op & 0x0f); OP_SUBA(tmpv); break; case 0x30: OP_CHECK32(OP_CMPA32); tmpv = REG_READ(op & 0x0f); OP_CMPA(tmpv); break; case 0x40: OP_CHECK32(OP_ADDA32); tmpv = REG_READ(op & 0x0f); OP_ADDA(tmpv); break; case 0x50: OP_CHECK32(OP_ANDA32); tmpv = REG_READ(op & 0x0f); OP_ANDA(tmpv); break; case 0x60: OP_CHECK32(OP_ORA32 ); tmpv = REG_READ(op & 0x0f); OP_ORA (tmpv); break; case 0x70: OP_CHECK32(OP_EORA32); tmpv = REG_READ(op & 0x0f); OP_EORA(tmpv); break; /* OP a, (ri) */ case 0x11: tmpv = ptr1_read(op); OP_SUBA(tmpv); break; case 0x31: tmpv = ptr1_read(op); OP_CMPA(tmpv); break; case 0x41: tmpv = ptr1_read(op); OP_ADDA(tmpv); break; case 0x51: tmpv = ptr1_read(op); OP_ANDA(tmpv); break; case 0x61: tmpv = ptr1_read(op); OP_ORA (tmpv); break; case 0x71: tmpv = ptr1_read(op); OP_EORA(tmpv); break; /* OP a, adr */ case 0x03: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_LDA (tmpv); break; case 0x13: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_SUBA(tmpv); break; case 0x33: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_CMPA(tmpv); break; case 0x43: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_ADDA(tmpv); break; case 0x53: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_ANDA(tmpv); break; case 0x63: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_ORA (tmpv); break; case 0x73: tmpv = ssp->mem.RAM[op & 0x1ff]; OP_EORA(tmpv); break; /* OP a, imm */ case 0x14: tmpv = *PC++; OP_SUBA(tmpv); break; case 0x34: tmpv = *PC++; OP_CMPA(tmpv); break; case 0x44: tmpv = *PC++; OP_ADDA(tmpv); break; case 0x54: tmpv = *PC++; OP_ANDA(tmpv); break; case 0x64: tmpv = *PC++; OP_ORA (tmpv); break; case 0x74: tmpv = *PC++; OP_EORA(tmpv); break; /* OP a, ((ri)) */ case 0x15: tmpv = ptr2_read(op); OP_SUBA(tmpv); break; case 0x35: tmpv = ptr2_read(op); OP_CMPA(tmpv); break; case 0x45: tmpv = ptr2_read(op); OP_ADDA(tmpv); break; case 0x55: tmpv = ptr2_read(op); OP_ANDA(tmpv); break; case 0x65: tmpv = ptr2_read(op); OP_ORA (tmpv); break; case 0x75: tmpv = ptr2_read(op); OP_EORA(tmpv); break; /* OP a, ri */ case 0x19: tmpv = rIJ[IJind]; OP_SUBA(tmpv); break; case 0x39: tmpv = rIJ[IJind]; OP_CMPA(tmpv); break; case 0x49: tmpv = rIJ[IJind]; OP_ADDA(tmpv); break; case 0x59: tmpv = rIJ[IJind]; OP_ANDA(tmpv); break; case 0x69: tmpv = rIJ[IJind]; OP_ORA (tmpv); break; case 0x79: tmpv = rIJ[IJind]; OP_EORA(tmpv); break; /* OP simm */ case 0x1c: OP_SUBA(op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; case 0x3c: OP_CMPA(op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; case 0x4c: OP_ADDA(op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; /* MAME code only does LSB of top word, but this looks wrong to me. */ case 0x5c: OP_ANDA(op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; case 0x6c: OP_ORA (op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; case 0x7c: OP_EORA(op & 0xff); #ifdef LOG_SVP if (op&0x100) elprintf(EL_SVP|EL_ANOMALY, "FIXME: simm with upper bit set"); #endif break; default: #ifdef LOG_SVP elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME unhandled op %04x @ %04x", op, GET_PPC_OFFS()); #endif break; } } while (--g_cycles > 0 && !(ssp->emu_status & SSP_WAIT_MASK)); read_P(); /* update P */ rPC = GET_PC(); #ifdef LOG_SVP if (ssp->gr[SSP_GR0].v != 0xffff0000) elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: REG 0 corruption! %08x", ssp->gr[SSP_GR0].v); #endif } core/m68k/s68kconf.h000664 001750 001750 00000007111 12702465756 015247 0ustar00sergiosergio000000 000000 #ifndef M68KCONF__HEADER #define M68KCONF__HEADER /* ======================================================================== */ /* ======================== SUB 68K CONFIGURATION ========================= */ /* ======================================================================== */ /* Configuration switches. * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks. * OPT_SPECIFY_HANDLER causes the core to link directly to the function * or macro you specify, rather than using callback functions whose pointer * must be passed in using m68k_set_xxx_callback(). */ #define OPT_OFF 0 #define OPT_ON 1 #define OPT_SPECIFY_HANDLER 2 /* If ON, the CPU will call m68k_write_32_pd() when it executes move.l with a * predecrement destination EA mode instead of m68k_write_32(). * To simulate real 68k behavior, m68k_write_32_pd() must first write the high * word to [address+2], and then write the low word to [address]. */ #define M68K_SIMULATE_PD_WRITES OPT_OFF /* If ON, CPU will call the interrupt acknowledge callback when it services an * interrupt. * If off, all interrupts will be autovectored and all interrupt requests will * auto-clear when the interrupt is serviced. */ #define M68K_EMULATE_INT_ACK OPT_SPECIFY_HANDLER #define M68K_INT_ACK_CALLBACK(A) scd_68k_irq_ack(A) /* If ON, CPU will call the output reset callback when it encounters a reset * instruction. */ #define M68K_EMULATE_RESET OPT_OFF #define M68K_RESET_CALLBACK() your_reset_handler_function() /* If ON, CPU will call the callback when it encounters a tas * instruction. */ #define M68K_TAS_HAS_CALLBACK OPT_SPECIFY_HANDLER #define M68K_TAS_CALLBACK() 1 /* If ON, CPU will call the set fc callback on every memory access to * differentiate between user/supervisor, program/data access like a real * 68000 would. This should be enabled and the callback should be set if you * want to properly emulate the m68010 or higher. (moves uses function codes * to read/write data from different address spaces) */ #define M68K_EMULATE_FC OPT_OFF #define M68K_SET_FC_CALLBACK(A) your_set_fc_handler_function(A) /* If ON, the CPU will monitor the trace flags and take trace exceptions */ #define M68K_EMULATE_TRACE OPT_OFF /* If ON, the CPU will emulate the 4-byte prefetch queue of a real 68000 */ #define M68K_EMULATE_PREFETCH OPT_OFF /* If ON, the CPU will generate address error exceptions if it tries to * access a word or longword at an odd address. * NOTE: This is only emulated properly for 68000 mode. */ #define M68K_EMULATE_ADDRESS_ERROR OPT_OFF /* If ON and previous option is also ON, address error exceptions will also be checked when fetching instructions. Disabling this can help speeding up emulation while still emulating address error exceptions on other memory access if needed. * NOTE: This is only emulated properly for 68000 mode. */ #define M68K_CHECK_PC_ADDRESS_ERROR OPT_OFF /* ----------------------------- COMPATIBILITY ---------------------------- */ /* The following options set optimizations that violate the current ANSI * standard, but will be compliant under the forthcoming C9X standard. */ /* If ON, the enulation core will use 64-bit integers to speed up some * operations. */ #define M68K_USE_64_BIT OPT_OFF /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ #endif /* M68KCONF__HEADER */ core/cd_hw/pcm.c000664 001750 001750 00000027135 12702465756 014667 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * PCM sound chip (315-5476A) (RF5C164 compatible) * * Copyright (C) 2012-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #define PCM_SCYCLES_RATIO (384 * 4) #define pcm scd.pcm_hw void pcm_init(double clock, int samplerate) { /* PCM chip is running at original rate and is synchronized with SUB-CPU */ /* Chip output is resampled to desired rate using Blip Buffer. */ blip_set_rates(snd.blips[1][0], clock / PCM_SCYCLES_RATIO, samplerate); blip_set_rates(snd.blips[1][1], clock / PCM_SCYCLES_RATIO, samplerate); } void pcm_reset(void) { /* reset chip & clear external RAM */ memset(&pcm, 0, sizeof(pcm_t)); /* reset default bank */ pcm.bank = pcm.ram; /* reset channels stereo panning */ pcm.chan[0].pan = 0xff; pcm.chan[1].pan = 0xff; pcm.chan[2].pan = 0xff; pcm.chan[3].pan = 0xff; pcm.chan[4].pan = 0xff; pcm.chan[5].pan = 0xff; pcm.chan[6].pan = 0xff; pcm.chan[7].pan = 0xff; /* reset master clocks counter */ pcm.cycles = 0; /* clear blip buffers */ blip_clear(snd.blips[1][0]); blip_clear(snd.blips[1][1]); } int pcm_context_save(uint8 *state) { uint8 tmp8; int bufferptr = 0; tmp8 = (pcm.bank - pcm.ram) >> 12; save_param(pcm.chan, sizeof(pcm.chan)); save_param(pcm.out, sizeof(pcm.out)); save_param(&tmp8, 1); save_param(&pcm.enabled, sizeof(pcm.enabled)); save_param(&pcm.status, sizeof(pcm.status)); save_param(&pcm.index, sizeof(pcm.index)); save_param(pcm.ram, sizeof(pcm.ram)); return bufferptr; } int pcm_context_load(uint8 *state) { uint8 tmp8; int bufferptr = 0; load_param(pcm.chan, sizeof(pcm.chan)); load_param(pcm.out, sizeof(pcm.out)); load_param(&tmp8, 1); pcm.bank = &pcm.ram[(tmp8 & 0x0f) << 12]; load_param(&pcm.enabled, sizeof(pcm.enabled)); load_param(&pcm.status, sizeof(pcm.status)); load_param(&pcm.index, sizeof(pcm.index)); load_param(pcm.ram, sizeof(pcm.ram)); return bufferptr; } void pcm_run(unsigned int length) { #ifdef LOG_PCM error("[%d][%d]run %d PCM samples (from %d)\n", v_counter, s68k.cycles, length, pcm.cycles); #endif /* check if PCM chip is running */ if (pcm.enabled) { int i, j, l, r; /* generate PCM samples */ for (i=0; i> 11) & 0xffff]; /* loop data ? */ if (data == 0xff) { /* reset WAVE RAM address */ pcm.chan[j].addr = pcm.chan[j].ls.w << 11; /* read again from WAVE RAM address */ data = pcm.ram[pcm.chan[j].ls.w]; } else { /* increment WAVE RAM address */ pcm.chan[j].addr += pcm.chan[j].fd.w; } /* infinite loop should not output any data */ if (data != 0xff) { /* check sign bit (output centered around 0) */ if (data & 0x80) { /* PCM data is positive */ data = data & 0x7f; } else { /* PCM data is negative */ data = -(data & 0x7f); } /* multiply PCM data with ENV & stereo PAN data then add to L/R outputs (14.5 fixed point) */ l += ((data * pcm.chan[j].env * (pcm.chan[j].pan & 0x0F)) >> 5); r += ((data * pcm.chan[j].env * (pcm.chan[j].pan >> 4)) >> 5); } } } /* limiter */ if (l < -32768) l = -32768; else if (l > 32767) l = 32767; if (r < -32768) r = -32768; else if (r > 32767) r = 32767; /* check if PCM left output changed */ if (pcm.out[0] != l) { blip_add_delta_fast(snd.blips[1][0], i, l-pcm.out[0]); pcm.out[0] = l; } /* check if PCM right output changed */ if (pcm.out[1] != r) { blip_add_delta_fast(snd.blips[1][1], i, r-pcm.out[1]); pcm.out[1] = r; } } } else { /* check if PCM left output changed */ if (pcm.out[0]) { blip_add_delta_fast(snd.blips[1][0], 0, -pcm.out[0]); pcm.out[0] = 0; } /* check if PCM right output changed */ if (pcm.out[1]) { blip_add_delta_fast(snd.blips[1][1], 0, -pcm.out[1]); pcm.out[1] = 0; } } /* end of blip buffer frame */ blip_end_frame(snd.blips[1][0], length); blip_end_frame(snd.blips[1][1], length); /* update PCM master clock counter */ pcm.cycles += length * PCM_SCYCLES_RATIO; } void pcm_update(unsigned int samples) { /* get number of internal clocks (samples) needed */ unsigned int clocks = blip_clocks_needed(snd.blips[1][0], samples); /* run PCM chip */ if (clocks > 0) { pcm_run(clocks); } /* reset PCM master clocks counter */ pcm.cycles = 0; } void pcm_write(unsigned int address, unsigned char data) { /* synchronize PCM chip with SUB-CPU */ int clocks = s68k.cycles - pcm.cycles; if (clocks > 0) { /* number of internal clocks (samples) to run */ clocks = (clocks + PCM_SCYCLES_RATIO - 1) / PCM_SCYCLES_RATIO; pcm_run(clocks); } #ifdef LOG_PCM error("[%d][%d]PCM write %x -> 0x%02x (%X)\n", v_counter, s68k.cycles, address, data, s68k.pc); #endif /* external RAM is mapped to $1000-$1FFF */ if (address >= 0x1000) { /* 4K bank access */ pcm.bank[address & 0xfff] = data; return; } /* internal area si mapped to $0000-$0FFF */ switch (address) { case 0x00: /* ENV register */ { /* update channel ENV multiplier */ pcm.chan[pcm.index].env = data; return; } case 0x01: /* PAN register */ { /* update channel stereo panning value */ pcm.chan[pcm.index].pan = data; return; } case 0x02: /* FD register (LSB) */ { /* update channel WAVE RAM address increment LSB */ pcm.chan[pcm.index].fd.byte.l = data; return; } case 0x03: /* FD register (MSB) */ { /* update channel WAVE RAM address increment MSB */ pcm.chan[pcm.index].fd.byte.h = data; return; } case 0x04: /* LS register (LSB) */ { /* update channel WAVE RAM loop address LSB */ pcm.chan[pcm.index].ls.byte.l = data; return; } case 0x05: /* LS register (MSB) */ { /* update channel WAVE RAM loop address MSB */ pcm.chan[pcm.index].ls.byte.h = data; return; } case 0x06: /* ST register */ { /* update channel WAVE RAM start address (16.11 fixed point) */ pcm.chan[pcm.index].st = data << (8 + 11); /* reload WAVE RAM address if channel is OFF */ if (!(pcm.status & (1 << pcm.index))) { pcm.chan[pcm.index].addr = pcm.chan[pcm.index].st; } return; } case 0x07: /* CTRL register */ { if (data & 0x40) { /* channel selection (0-7) */ pcm.index = data & 0x07; } else { /* external RAM bank selection (16 x 4K) */ pcm.bank = &pcm.ram[(data & 0x0f) << 12]; } /* update PCM chip status (bit 7) */ pcm.enabled = data & 0x80; return; } case 0x08: /* ON/OFF register */ { /* update PCM channels status */ pcm.status = ~data; /* reload WAVE RAM address pointers when channels are OFF */ if (data & 0x01) pcm.chan[0].addr = pcm.chan[0].st; if (data & 0x02) pcm.chan[1].addr = pcm.chan[1].st; if (data & 0x04) pcm.chan[2].addr = pcm.chan[2].st; if (data & 0x08) pcm.chan[3].addr = pcm.chan[3].st; if (data & 0x10) pcm.chan[4].addr = pcm.chan[4].st; if (data & 0x20) pcm.chan[5].addr = pcm.chan[5].st; if (data & 0x40) pcm.chan[6].addr = pcm.chan[6].st; if (data & 0x80) pcm.chan[7].addr = pcm.chan[7].st; return; } default: { /* illegal access */ return; } } } unsigned char pcm_read(unsigned int address) { /* synchronize PCM chip with SUB-CPU */ int clocks = s68k.cycles - pcm.cycles; if (clocks > 0) { /* number of internal clocks (samples) to run */ clocks = (clocks + PCM_SCYCLES_RATIO - 1) / PCM_SCYCLES_RATIO; pcm_run(clocks); } #ifdef LOG_PCM error("[%d][%d]PCM read (%X)\n", v_counter, s68k.cycles, address, s68k.pc); #endif /* external RAM (TODO: verify if possible to read, some docs claim it's not !) */ if (address >= 0x1000) { /* 4K bank access */ return pcm.bank[address & 0xfff]; } /* read WAVE RAM address pointers */ if ((address >= 0x10) && (address < 0x20)) { int index = (address >> 1) & 0x07; if (address & 1) { return (pcm.chan[index].addr >> (11 + 8)) & 0xff; } else { return (pcm.chan[index].addr >> 11) & 0xff; } } /* illegal access */ return 0xff; } void pcm_ram_dma_w(unsigned int words) { uint16 data; /* CDC buffer source address */ uint16 src_index = cdc.dac.w & 0x3ffe; /* PCM-RAM destination address*/ uint16 dst_index = (scd.regs[0x0a>>1].w << 2) & 0xffe; /* update DMA destination address */ scd.regs[0x0a>>1].w += (words >> 1); /* update DMA source address */ cdc.dac.w += (words << 1); /* DMA transfer */ while (words--) { /* read 16-bit word from CDC buffer */ data = *(uint16 *)(cdc.ram + src_index); /* write 16-bit word to PCM RAM (endianness does not matter since PCM RAM is always accessed as byte)*/ *(uint16 *)(pcm.bank + dst_index) = data ; /* increment CDC buffer source address */ src_index = (src_index + 2) & 0x3ffe; /* increment PCM-RAM destination address */ dst_index = (dst_index + 2) & 0xffe; } } core/tremor/floor1.c000664 001750 001750 00000033576 12702465756 015544 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: floor backend 1 implementation ********************************************************************/ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "registry.h" #include "codebook.h" #include "misc.h" #include "block.h" #define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ typedef struct { int forward_index[VIF_POSIT+2]; int hineighbor[VIF_POSIT]; int loneighbor[VIF_POSIT]; int posts; int n; int quant_q; vorbis_info_floor1 *vi; } vorbis_look_floor1; /***********************************************/ static void floor1_free_info(vorbis_info_floor *i){ vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; if(info){ memset(info,0,sizeof(*info)); _ogg_free(info); } } static void floor1_free_look(vorbis_look_floor *i){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; if(look){ memset(look,0,sizeof(*look)); _ogg_free(look); } } static int ilog(unsigned int v){ int ret=0; while(v){ ret++; v>>=1; } return(ret); } static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; int j,k,count=0,maxclass=-1,rangebits; vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info)); /* read partitions */ info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ for(j=0;jpartitions;j++){ info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; } /* read partition classes */ for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ if(info->class_subs[j]<0) goto err_out; if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); if(info->class_book[j]<0 || info->class_book[j]>=ci->books) goto err_out; for(k=0;k<(1<class_subs[j]);k++){ info->class_subbook[j][k]=oggpack_read(opb,8)-1; if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) goto err_out; } } /* read the post list */ info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ rangebits=oggpack_read(opb,4); for(j=0,k=0;jpartitions;j++){ count+=info->class_dim[info->partitionclass[j]]; for(;kpostlist[k+2]=oggpack_read(opb,rangebits); if(t<0 || t>=(1<postlist[0]=0; info->postlist[1]=1<vi=info; look->n=info->postlist[1]; /* we drop each position value in-between already decoded values, and use linear interpolation to predict each new value past the edges. The positions are read in the order of the position list... we precompute the bounding positions in the lookup. Of course, the neighbors can change (if a position is declined), but this is an initial mapping */ for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; n+=2; look->posts=n; /* also store a sorted position index */ for(i=0;ipostlist+i; qsort(sortpointer,n,sizeof(*sortpointer),icomp); /* points from sort order back to range number */ for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; /* quantize values to multiplier spec */ switch(info->mult){ case 1: /* 1024 -> 256 */ look->quant_q=256; break; case 2: /* 1024 -> 128 */ look->quant_q=128; break; case 3: /* 1024 -> 86 */ look->quant_q=86; break; case 4: /* 1024 -> 64 */ look->quant_q=64; break; } /* discover our neighbors for decode where we don't use fit flags (that would push the neighbors outward) */ for(i=0;in; int currentx=info->postlist[i+2]; for(j=0;jpostlist[j]; if(x>lx && xcurrentx){ hi=j; hx=x; } } look->loneighbor[i]=lo; look->hineighbor[i]=hi; } return(look); } static int render_point(int x0,int x1,int y0,int y1,int x){ y0&=0x7fff; /* mask off flag */ y1&=0x7fff; { int dy=y1-y0; int adx=x1-x0; int ady=abs(dy); int err=ady*(x-x0); int off=err/adx; if(dy<0)return(y0-off); return(y0+off); } } #ifdef _LOW_ACCURACY_ # define XdB(n) ((((n)>>8)+1)>>1) #else # define XdB(n) (n) #endif static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={ XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c), XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4), XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd), XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4), XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a), XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818), XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69), XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64), XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a), XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629), XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82), XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac), XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c), XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf), XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10), XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b), XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e), XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d), XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4), XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd), XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf), XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e), XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962), XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109), XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4), XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23), XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306), XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20), XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6), XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471), XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1), XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7), XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d), XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1), XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc), XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2), XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488), XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0), XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f), XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41), XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17), XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e), XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7), XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf), XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea), XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793), XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2), XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013), XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204), XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299), XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e), XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca), XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea), XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1), XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1), XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870), XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6), XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44), XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e), XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), }; static void render_line(int n, int x0,int x1,int y0,int y1,ogg_int32_t *d){ int dy=y1-y0; int adx=x1-x0; int ady=abs(dy); int base=dy/adx; int sy=(dy<0?base-1:base+1); int x=x0; int y=y0; int err=0; if(n>x1)n=x1; ady-=abs(base*adx); if(x=adx){ err-=adx; y+=sy; }else{ y+=base; } d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); } } static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; vorbis_info_floor1 *info=look->vi; codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; int i,j,k; codebook *books=ci->fullbooks; /* unpack wrapped/predicted values from stream */ if(oggpack_read(&vb->opb,1)==1){ int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); /* partition by partition */ /* partition by partition */ for(i=0,j=2;ipartitions;i++){ int classv=info->partitionclass[i]; int cdim=info->class_dim[classv]; int csubbits=info->class_subs[classv]; int csub=1<class_book[classv],&vb->opb); if(cval==-1)goto eop; } for(k=0;kclass_subbook[classv][cval&(csub-1)]; cval>>=csubbits; if(book>=0){ if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) goto eop; }else{ fit_value[j+k]=0; } } j+=cdim; } /* unwrap positive values and reconsitute via linear interpolation */ for(i=2;iposts;i++){ int predicted=render_point(info->postlist[look->loneighbor[i-2]], info->postlist[look->hineighbor[i-2]], fit_value[look->loneighbor[i-2]], fit_value[look->hineighbor[i-2]], info->postlist[i]); int hiroom=look->quant_q-predicted; int loroom=predicted; int room=(hiroom=room){ if(hiroom>loroom){ val = val-loroom; }else{ val = -1-(val-hiroom); } }else{ if(val&1){ val= -((val+1)>>1); }else{ val>>=1; } } fit_value[i]=val+predicted; fit_value[look->loneighbor[i-2]]&=0x7fff; fit_value[look->hineighbor[i-2]]&=0x7fff; }else{ fit_value[i]=predicted|0x8000; } } return(fit_value); } eop: return(NULL); } static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, ogg_int32_t *out){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; vorbis_info_floor1 *info=look->vi; codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; int n=ci->blocksizes[vb->W]/2; int j; if(memo){ /* render the lines */ int *fit_value=(int *)memo; int hx=0; int lx=0; int ly=fit_value[0]*info->mult; for(j=1;jposts;j++){ int current=look->forward_index[j]; int hy=fit_value[current]&0x7fff; if(hy==fit_value[current]){ hy*=info->mult; hx=info->postlist[current]; render_line(n,lx,hx,ly,hy,out); lx=hx; ly=hy; } } for(j=hx;j #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "registry.h" #include "misc.h" #include "block.h" int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep){ vorbis_dsp_state *vd=vb->vd; private_state *b=(private_state *)vd->backend_state; vorbis_info *vi=vd->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; oggpack_buffer *opb=&vb->opb; int type,mode,i; /* first things first. Make sure decode is ready */ _vorbis_block_ripcord(vb); oggpack_readinit(opb,op->packet); /* Check the packet type */ if(oggpack_read(opb,1)!=0){ /* Oops. This is not an audio data packet */ return(OV_ENOTAUDIO); } /* read our mode and pre/post windowsize */ mode=oggpack_read(opb,b->modebits); if(mode==-1)return(OV_EBADPACKET); vb->mode=mode; vb->W=ci->mode_param[mode]->blockflag; if(vb->W){ vb->lW=oggpack_read(opb,1); vb->nW=oggpack_read(opb,1); if(vb->nW==-1) return(OV_EBADPACKET); }else{ vb->lW=0; vb->nW=0; } /* more setup */ vb->granulepos=op->granulepos; vb->sequence=op->packetno-3; /* first block is third packet */ vb->eofflag=op->e_o_s; if(decodep){ /* alloc pcm passback storage */ vb->pcmend=ci->blocksizes[vb->W]; vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); for(i=0;ichannels;i++) vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); /* unpack_header enforces range checking */ type=ci->map_type[ci->mode_param[mode]->mapping]; return(_mapping_P[type]->inverse(vb,b->mode[mode])); }else{ /* no pcm */ vb->pcmend=0; vb->pcm=NULL; return(0); } } long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; oggpack_buffer opb; int mode; oggpack_readinit(&opb,op->packet); /* Check the packet type */ if(oggpack_read(&opb,1)!=0){ /* Oops. This is not an audio data packet */ return(OV_ENOTAUDIO); } { int modebits=0; int v=ci->modes; while(v>1){ modebits++; v>>=1; } /* read our mode and pre/post windowsize */ mode=oggpack_read(&opb,modebits); } if(mode==-1)return(OV_EBADPACKET); return(ci->blocksizes[ci->mode_param[mode]->blockflag]); } gx/images/CD_access_on.png000664 001750 001750 00000003424 12702465756 016617 0ustar00sergiosergio000000 000000 PNG  IHDR0P pHYs  ~ cHRMz%u0`:o_FIDATxLeU?ߵ9{fa # b&Z!ƄH PXXhc !R( A A7y{9g,΃X]쳳:_z8nŏU0l傸S7D֒Z[Gj~ІnYdUJs-S#2l")HeĘֆ MĺdFn] lrAO>?mïn*Da-q:餒ֱsǬp6G]*Cs(J./ǔqP/F!pZY4v4`b 'G>]A#P&Js(1F$!CtKLVYH62cEV0 201p*N 1ՠ)deR$Vۿ}&C&(WgI!FЙ(F\,rL*P聅 BtU.҉&&coBL$"(ʤOHS#y !BͤKѩ Q"XZva4,ljPS$&KL Vؗ >X4&Q`VM(W8{c&OwJ|0y \4P#i@o-VUcfNrFmϥᄂW 1 }faBoSƕHܡ!'5JHz%N= Jk3P\<h,Ght >*h1 "AFJp@\ 1 0/9\&%!q@f'J3#BA|VI}$@"q@2g=lw63Z6Sۢ|(Bʜe1( #lJuZ&- s,9d2Hrn#!Id!ï 6鵺70-/KCPX;<<쓶C"ِuShc&T❼[ddt" ˔1tᭅo:ZړI 06dhy6,V+%IENDB`gx/images/Frame_s1_title.png000664 001750 001750 00000006666 12702465756 017165 0ustar00sergiosergio000000 000000 PNG  IHDRt@ \sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09 IDATx}pr$@im;K3h:ڪeӎNֶe B*t(`6 yqo{wٽry9n~<{t]źo֓֓H^JOxMmP @ K$ Q"TQw|-qL3+@J~&gb|nckSJ.G5YE@7Dx;،0wb`Q~Ax%!Qs1O->eU}2DP{ؘ<n "1i "2Cvq?+a t"FS軷oT B{&D@   l7X? s "lTd̓!HQkZM^ZSڠ@f 9yRO0Df lG!Ug6LCj,υ\jŞ1b4l@/dS fh!pǞ'zҎ_N?QSF=.`>GLLXv\ǟLl?Yޟ}g궗y0O}WIɲ ]jLM;w󢝝g/ɲr;aeƭy0p$' D+|1r:""HmI_R oy8~1M!$])4MC8ꇷ=~"\ۣ|=̓uh%_-++ v3o^36@/P Q* 2J$Q;os 54t6ߥKx=YY)yWOt8\x+eee~7O S0F4RalU"ЫTBW̙===lgt57[!ɴtH?W"K.1ge?ƒCYrKF?~ u;*=v7Ms=;k]<))Z₨}>|oj>a_Sh= عPz+'z4D,s۶ $P3u B[[[+ 꼟]ڳ4"lHDW@0x%z{*7G`7zAk!z8htHD~Ǥq""}X=={oH0 B;nݺK=c=itc rK\ `!ĨO`$:p2Q;7{SM4/|֯]w@$,DD Bx;gϮڻzR$>,-T`ĠJCh4?p g΃PDD6λlK-'xV nLI)@Y g=zfEQ_}qB0S(--|]>,TY ""Cy[xc룰Ń=[%ɆmR<.Z0z{.},DDW1wnͯ֬Y3ۘm^{G,$zö epk .43g=i"јe0288!-ZV`"@wCЋaUUJK6%i&e""<aYunX}IGebzD>E40QܹVzqcVb-="OjBޝ='"$Ө]xD>"]dXa4NDDw..fV'C xL,]Yn!"N~ qR.$ 22E4mmmP 1K.X,ֶ-@ u%GOYit`RwFwUUU7º9^K gmGht]< rG}2`i 4EQ/ywh$]]p:Nb1,!vcf @$ٽxBJ ]QD!9j(AEX]=R0_%""R83uX'E!t!a@P.DDW! /Y~qh+v F#"" $IBYi #include "ivorbiscodec.h" #define CHUNKSIZE 1024 /* The function prototypes for the callbacks are basically the same as for * the stdio functions fread, fseek, fclose, ftell. * The one difference is that the FILE * arguments have been replaced with * a void * - this is to be used as a pointer to whatever internal data these * functions might need. In the stdio case, it's just a FILE * cast to a void * * * If you use other functions, check the docs for these functions and return * the right values. For seek_func(), you *MUST* return -1 if the stream is * unseekable */ typedef struct { size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); int (*close_func) (void *datasource); long (*tell_func) (void *datasource); } ov_callbacks; #define NOTOPEN 0 #define PARTOPEN 1 #define OPENED 2 #define STREAMSET 3 #define INITSET 4 typedef struct OggVorbis_File { void *datasource; /* Pointer to a FILE *, etc. */ int seekable; ogg_int64_t offset; ogg_int64_t end; ogg_sync_state *oy; /* If the FILE handle isn't seekable (eg, a pipe), only the current stream appears */ int links; ogg_int64_t *offsets; ogg_int64_t *dataoffsets; ogg_uint32_t *serialnos; ogg_int64_t *pcmlengths; vorbis_info *vi; vorbis_comment *vc; /* Decoding working state local storage */ ogg_int64_t pcm_offset; int ready_state; ogg_uint32_t current_serialno; int current_link; ogg_int64_t bittrack; ogg_int64_t samptrack; ogg_stream_state *os; /* take physical pages, weld into a logical stream of packets */ vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ vorbis_block vb; /* local working space for packet->PCM decode */ ov_callbacks callbacks; } OggVorbis_File; extern int ov_clear(OggVorbis_File *vf); extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks); extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks); extern int ov_test_open(OggVorbis_File *vf); extern long ov_bitrate(OggVorbis_File *vf,int i); extern long ov_bitrate_instant(OggVorbis_File *vf); extern long ov_streams(OggVorbis_File *vf); extern long ov_seekable(OggVorbis_File *vf); extern long ov_serialnumber(OggVorbis_File *vf,int i); extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); extern ogg_int64_t ov_time_total(OggVorbis_File *vf,int i); extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); extern int ov_time_seek(OggVorbis_File *vf,ogg_int64_t pos); extern int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t pos); extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); extern ogg_int64_t ov_time_tell(OggVorbis_File *vf); extern vorbis_info *ov_info(OggVorbis_File *vf,int link); extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); extern long ov_read(OggVorbis_File *vf,char *buffer,int length, int *bitstream); #ifdef __cplusplus } #endif /* __cplusplus */ #endif gcw0/opk-data/ProggyTiny.ttf000664 001750 001750 00000105510 12702465756 017114 0ustar00sergiosergio000000 000000  @OS/2sHNcmap#uRcvt glyf`|headh6hhea$hmtxXLlocaEdmaxp( namenposttprepi_<gw3p@ v2 Alts@ L0 Pf~2hzB~"t&f2L| Z  d  x R  x ,N2,NrTFJx@&ZdB|~~\z  ddd|@^ 0 !0!0!Z!!"X""#J#\#$ $L$v$v$% %(%v%%%&>&&&'('R'((n()$)l)**Z**+h+, ,,-J--..X./2//020011x122n233`34 4z45>556N667T788H8|889B99:H:;;R;~;<.<<=2=>>j #'+/37;?CGKOSW[_cgko5315315315315315353!5353!5353!5353!5353!5353!5353!5353!5353153153153153153 535353535353 533535335353353 #'+/37;?CG533535315315315315353353533535315315315315353353 #'+/37;?C53531531531535335353153153533535315315315353 #'+/3753!535335335353353533535335335353!53 #'+/37;?C5315353!5353!535315353!5335353!5353153153353 535353  #535353535353535353  #535353535353535353  #'+5353353353531531535335335353  #5353531531531531535353!5353 53153153153153!53  #535353535353535353 #'+/37;?C5315315353!5353!535335335353!5353!5353153153  #'53531535353535353153153 #'+/37;5315315353!535353153535353153153153153 #'+/375315315353!5353531535353!5353153153 #'+/3753531535335353!53531531531531535353 #'+/37;?C531531531531535353531531531535353!5353153153 #'+/37;5315353535315315315353!5353!5353153153  #'+53153153153153535353535353 #'+/37;?C5315315353!5353!535315315353!5353!5353153153 #'+/37;5315315353!5353!53531531531535353531535353 535353 5353153531535315353  #'5315315315315353153153153153 5353153531535315353  #5315315353!5353535353 #'+/37;?CGKOSW[_c5315315315353!535335315335353353153353533531531531535353153153153153  #'+/3535353353533535315315353!5353!53 #'+/37;?CGKO5315315315353!5353!535315315315353!5353!5353153153153  #'+/35315315353!5353535353!5353153153 #'+/37;?5315315353!5353!5353!5353!5353!5353153153 #'+/37;?CG53153153153153535353153153153535353153153153153 #'+/3753153153153153535353153153153535353 #'+/37;?C5315315353!535353!5315353!5353!5353153153153 #'+/37;?C53!5353!5353!535315315315315353!5353!5353!53  #'+53153153535353535353153153  #'+/53153153535353535353153153153 #'+/3753!5353!5353353531535335353!5353!53  #'+53535353535353153153153153 #'+/37;?CGKO53!5353!535315335315353153353153533533535335335353!53 #'+/37;?CGKOS53153!5353153!5353353353533533535335335353!5315353!53153 #'+/37;?5315315353!5353!5353!5353!5353!5353153153 #'+/37;5315315315353!5353!5353153153153535353 #'+/37;?CG5315315353!5353!5353!5353!5353!5315353153153153 #'+/37;?CG5315315315353!5353!535315315315353!5353!5353!53 #'+/37;5315315353!5353531531535353!5353153153  #'+53153153153153535353535353 #'+/37;53!5353!5353!5353!5353!5353!5353153153  #'+/53!5353!5353!5353353533535353 #'+/37;?C53!53533533535335335353353353533535335353353  #'+/353!5353!5353353535335353!5353!53  #'+/53!5353!5353!5353153153535353 #'+/37;53153153153153535353535353153153153153  #'+/3531531535353535353535353153153  #535353535353535353  #'+/3531531535353535353535353153153 535335353!53 531531531531531535353 #'+/3753153153535315315315353!5353153153153 #'+/37;?C5353535315315315353!5353!5353!5353153153153  #'+5315315315353535353153153153 #'+/37;?C5353535315315315353!5353!5353!5353153153153 #'+/37;5315315353!53531531531531535353153153153  #'+/35315315353535315315315353535353 #'+/37;?C5315315353!5353!5353!53531531531535353153153 #'+/37;5353535315315315353!5353!5353!5353!53 535315353535353  #'+5353153535353535353153153  #'+/353535353!5353353531535335353!53  #5315353535353535353 #'+/37;5315335353353353533533535335335353353353  #'+/5315315315353!5353!5353!5353!53  #'+/5315315353!5353!5353!5353153153 #'+/37;?5315315315353!5353!5353!53531531531535353 #'+/37;?5315315315353!5353!5353!53531531531535353  #5335315353153!53535353  #'+/35315315315353531531535353153153153  #'+53535315315353535353153153  #'+/53!5353!5353!5353!5353153153153  #53!5353!53533535335353  #'+/53!5353353353533533535335353353  #53!5353353535335353!53 #'+/37;?53!5353!5353!5353!53531531531535353153153  #'+/35315315315315353535353153153153153  #535353535353535353  #535353535353535353  #535353535353535353 53153!5353!53153 #'+/37;?CGK5315315353!5353153153153535315315315353!5353153153!5353  #'+/353153535353153153535353535353 35335353353 153353353  #'+/3535353153153153153535353535353 #'+/37;?C535353153153153153535315315315315353535353 5353353  #'+53!5353353535335335353!53353 #'+/37;?CG53353535315315315353531531531531535353153153153 5353535353 #'+/37;?CGK5315335315353!5353!5353!5315353!5353!5353153353153 #'+/37;?53353535315315315315353535353153153153153 535353 535353 533535335353353 533535335353353 5315353153 53153153153153 53153153153153153 5335353353 #'+/37;?53153153153153153533531531535335335353353353 #'+/37;?53353535315315315353531531535353153153153 5353535353 #'+/37;5315335315353!5353!5315353!5353153353153 #'+/37;?53353535315315315315353535353153153153153  #'+/35335353!5353!5353!53531531535353 535353535353  #'+/535315315353353533535315315353 #'+/37;?5315353535315315315353535353153153153153 #'+/37;?53!535315315315353!5353!535315315315353!53 #'+/37;53!5353!535315315353531531531531535353 5353535353535353 #'+/37;?CG5315353535315315353!5353!535315315353535315353353 #'+/37;?CGKOSW[5315315315353!535335315335353353!535335315335353!5353153153153 5353531535335353153  #'53!5353!5353!5353!5353!53 53153153153535353 #'+/37;?CGKOS5315315315353!5353!5335353353!5353353!5353!5353153153153 53153153153153 535335353 #'+/37535353153153153153535353153153153153 5315353535353153153 53153535315353531535353 #'+/3753!5353!5353!5353!53531531533535353 #'+/37;?CGKOSW[_cg53153153153153531531533535315315335353153353533535335353353533535335353 !531535353 5353153535353153153 53533535335353  #'53!5353!5353!5353!5353!53 #'+/37;?CGK5353!5353!5353!5353!53533531535335315315353!5353 #'+/37;?CG5353!5353!5353!535335315353!5353!5353!5315353 #'+/37;?CGKOSW53!5353!53531533535335353353!53533531535335315315353!5353  #5353535353!5353153153  #'+/535353533535315315353!5353!53  #'+/535353533535315315353!5353!53  #'+/3535335353533535315315353!5353!53 #'+/37533535335353533535315315353!5353!53  #'+/5335353533535315315353!5353!53 #'+/3753533535353533535315315353!5353!53 #'+/37;?CGKO5315315315353353533535315315315353!5353!5353!53153153 #'+/37;5315315353!5353535353!53531531535353 #'+/37;?CG53535315315315315353531531531535353153153153153 #'+/37;?CG53535315315315315353531531531535353153153153153 #'+/37;?CGK53533535315315315315353531531531535353153153153153 #'+/37;?CG533535315315315315353531531531535353153153153153  #'+53535315315353535353153153  #'+53535315315353535353153153  #'+/53533535315315353535353153153  #'+533535315315353535353153153 #'+/37;?CGK5315315353!5353!535315315315335353!5353!5353153153 #'+/37;?CGK533535335353153!53533533535335335353!5315353!53153 #'+/3753535315315353!5353!5353!5353153153 #'+/3753535315315353!5353!5353!5353153153 #'+/37;53533535315315353!5353!5353!5353153153 #'+/37;?53353533535315315353!5353!5353!5353153153 #'+/37533535315315353!5353!5353!5353153153  #53!5353353535335353!53 #'+/37;?5315335353!53533531535315335353!5353353153  #'+/3535353!5353!5353!5353!5353153153  #'+/3535353!5353!5353!5353!5353153153 #'+/37535335353!5353!5353!5353!5353153153  #'+/35335353!5353!5353!5353!5353153153  #'+/3535353!5353!5353!53531531535353 #'+/3753535315315353!5353!53531531535353 #'+/37;?CG5315315353!5353!535315315353!5353!535315315353 #'+/37;?535353153153535315315315353!5353153153153 #'+/37;?535353153153535315315315353!5353153153153 #'+/37;?C535335353153153535315315315353!5353153153153 #'+/37;?CG533535335353153153535315315315353!5353153153153 #'+/37;?5335353153153535315315315353!5353153153153 #'+/37;?CG53533535353153153535315315315353!5353153153153 #'+/37;53153353533535315315315353!5353153353153  #'+/353153153153535353531531531535353 #'+/37;?C53535315315353!53531531531531535353153153153 #'+/37;?C53535315315353!53531531531531535353153153153 #'+/37;?CG53533535315315353!53531531531531535353153153153 #'+/37;?C533535315315353!53531531531531535353153153153 53535315353535353 53535315353535353  #53533535315353535353 533535315353535353 #'+/37;?5315335353535315315315353!5353!5353153153 #'+/37;?53353533535315315315353!5353!5353!5353!53 #'+/3753535315315353!5353!5353!5353153153 #'+/3753535315315353!5353!5353!5353153153 #'+/37;53533535315315353!5353!5353!5353153153 #'+/37;?53353533535315315353!5353!5353!5353153153 #'+/37533535315315353!5353!5353!5353153153 535315315315315353 #'+/37;?5315335353!53533531535315335353!5353353153 #'+/37535353!5353!5353!5353!5353153153153 #'+/37535353!5353!5353!5353!5353153153153 #'+/37;535335353!5353!5353!5353!5353153153153 #'+/375335353!5353!5353!5353!5353153153153 #'+/37;?CG535353!5353!5353!5353!53531531531535353153153 #'+/37;?CG53535315315315353!5353!5353!53531531531535353 #'+/37;?CG5335353!5353!5353!5353!53531531531535353153153$Gk 1&- 1 = 1 $G  k  y   2004/04/15by Tristan GrimmerRegularTTX ProggyTinyTT2004/04/15by Tristan GrimmerRegularTTX ProggyTinyTT        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a!"#$%&'()*+,-./0123456789:;<=>?@Abcdefghjikmlnoqprsutvwxzy{}|~unicode#0x0001unicode#0x0002unicode#0x0003unicode#0x0004unicode#0x0005unicode#0x0006unicode#0x0007unicode#0x0008unicode#0x0009unicode#0x000aunicode#0x000bunicode#0x000cunicode#0x000dunicode#0x000eunicode#0x000funicode#0x0010unicode#0x0011unicode#0x0012unicode#0x0013unicode#0x0014unicode#0x0015unicode#0x0016unicode#0x0017unicode#0x0018unicode#0x0019unicode#0x001aunicode#0x001bunicode#0x001cunicode#0x001dunicode#0x001eunicode#0x001fdeleteEurounicode#0x0081unicode#0x0082unicode#0x0083unicode#0x0084unicode#0x0085unicode#0x0086unicode#0x0087unicode#0x0088unicode#0x0089unicode#0x008aunicode#0x008bunicode#0x008cunicode#0x008dunicode#0x008eunicode#0x008funicode#0x0090unicode#0x0091unicode#0x0092unicode#0x0093unicode#0x0094unicode#0x0095unicode#0x0096unicode#0x0097unicode#0x0098unicode#0x0099unicode#0x009aunicode#0x009bunicode#0x009cunicode#0x009dunicode#0x009eunicode#0x009fgx/images/Button_text.png000664 001750 001750 00000005333 12702465756 016634 0ustar00sergiosergio000000 000000 PNG  IHDR0:sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09 /IDATxMl|쇽1o $)F**z@*5qIzQzi)DSq T@ixgwz0dvni5y~ҫُٙgUQQ qz> i) YAlۦvZ[[,$@cT8Z,{ϝ;Ǚ3gu]WIPwC=ɰj*vf@>?VRP9 {1== Y!QJ)zP#C#($ } vΝ;aVT#bAqSSS=ŋerI/y {nLE4~ DA 0a޽r#|E+(:11qʕ+Dݶֵ?H-zȷ#B<& ؼy3gɒ%|pB;o^ލk#BQ~yУN ˗/_tȬIGD(&bDŋvZ;8qZ 4?:Ӭܤ0>R*} ÐzSς ,<("|gͺ.ږmd&Bey'>sxyW,DQDPvޤx{WGYs6,!G… p V oqYPMfy7wNpu^kbb @)] ;lL}HG ~_Ð0 !!£i۶m駟fpp~F>+;DdۻEJJuՖÒ6vM*MEVz+%(AE\^{_~•{% 0ÐbUO^7\ ,|1!硔}R۷_#لT$---LNN=pIƮ bHXdzzBE(n=W]A}L&au/@JBAXxTǴR*m8amۍNS_P2---IHnAXX Ð <, 0{f(cccqRK,jTO 47uģQ %t|zRQl꺉ya'a4yB+(Q՝i , !S.QJŝ8(ٞߎiije% 4/ɸ rL\NXu]\ץT*6!PP2̜5TO М ibYme4Q J4 AXXNl4͸^ضeY߬n7Ah.ťxۚr<絶CԪ"^oFleF)U1,˺?g ͍C۞RmۤR)\׍='3IڝrָgNYAȦ mq_,O=|P0yH&řI2Y.ڶZj|Z̊Bsc6=Oen}uUt:x?B2gǘ{(ϼ߿e˖iJO5 4/ɘ3@!:u ôYm|LMC E6jmmŲnNc3or볣N:==(7nڵk~SU_F-5kz^J؋7ٿ Tܓ/q8'}E@[šu]ͦm_W]zOlڴ `ٳq3dUqѲ_ A݊ L)- àٺuTOOJAs# | 4#QS>9R>^YUJ} PG( !н&abE'{azqޏ>'O244 Alܸ]v3 0+&ط8> FQ8nݺW/BS"A6Yqc|dcjfSueIENDB`gx/images/Bg_overlay.png000664 001750 001750 00000000324 12702465756 016401 0ustar00sergiosergio000000 000000 PNG  IHDRsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/13/09(IDATxcw`*`'R__WAAI'IENDB`gx/images/Key_B_wii.png000664 001750 001750 00000003112 12702465756 016147 0ustar00sergiosergio000000 000000 PNG  IHDR ^8sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/12/09'IDATxV]hTLT+^BMCᦢX !m, R|͇7| >K*"bZvLmRGc&39ga6NF/7w{׷"f<GŋBR q=>bfLNN!uff۷6Uy7ƠT*ɩjT:Eɓ߻w;vt``@Ǔ(x||ܞ={ܴi_JҖRI)jRJj5ׇ۷or/_2S/0 QV' T!hjKKKjd"@EƘJas- ֚-;,ɿVBN*ƞ={B dP7o/\۷ ݗ;D@ZD)ruge|ߟ{[~~ u6eBJO Rjرc4::~ԩ_ܼyswM+$#-2 Xu"_Z3 VxWw' 'W.]z g׮]+s"GJJQkPJ9kmѣGygqk>}sCuK|F󼘙2Rjf<˭AvL&Y]z֭r\&c+T윳Z @“[n }ߤٓ'O1;ku$LhQz BKE[[[3Ƙd3|;L&A 8 TLDĎ EDLb1>so͆ zht:0}md2Jhol7nLZ3[ qĉX,c@۷ݻwhMN|5tuu8Ο?U6 ^K4oM]Z TFܻy5qc 0TI_R\.Gz]qmRJ!Т}0 QPTP.QTZb<EVUslH)%'mtZbhsNm۶z:9yʕ,jCRT]JiJ:r<=555)PT{LJih8~x\nF)U|򀵶7ci:ly͛7f3w= Dd^~-_zӧ}cVt&!ZH)7|f߃(T*o]y~T*y>1`aaaqrrrٳgCdŋ|ߘgUu/y?nQ?X(?Do\8CVIENDB`README.md000664 001750 001750 00000006331 12702465756 013202 0ustar00sergiosergio000000 000000 Genesis Plus GX is an open-source Sega 8/16 bit emulator focused on accuracy and portability. Initially ported and developped on Gamecube / Wii consoles through [libogc / devkitPPC](http://sourceforge.net/projects/devkitpro/), this emulator is now available on many other platforms through various frontends such as: * [Retroarch (libretro)](http://www.libretro.com) * [Bizhawk](http://tasvideos.org/Bizhawk.html) * [OpenEmu](http://openemu.org/) ---- The source code, initially based on Genesis Plus 1.2a by [Charles MacDonald](http://www.techno-junk.org/ ) has been heavily modified & enhanced, with respect to original goals and design, in order to improve emulation accuracy as well as adding support for new peripherals, cartridge or console hardware and many other exciting [features](https://bitbucket.org/eke/genesis-plus-gx/src/master/wiki/Features.md). The result is that Genesis Plus GX is now more a continuation of the original project than a simple port, providing very accurate emulation and [100% compatibility](https://bitbucket.org/eke/genesis-plus-gx/src/master/wiki/Compatibility.md) with Genesis / Mega Drive, Sega/Mega CD, Master System, Game Gear & SG-1000 released software (including all unlicensed or pirate known dumps), also emulating backwards compatibility modes when available. All the people who contributed (directly or indirectly) to this project are listed on the [Credits](https://bitbucket.org/eke/genesis-plus-gx/src/master/wiki/Credits.md) page. ---- Multi-platform sourcecode (core), which is made available for use under a specific non-commercial [license](https://bitbucket.org/eke/genesis-plus-gx/src/master/LICENSE.txt), is maintained on [Bitbucket](https://bitbucket.org/eke/genesis-plus-gx/src/) / [Github](https://github.com/ekeeke/Genesis-Plus-GX) so that other Genesis Plus ports can benefit of it, as I really wish this emulator becomes a reference for _portable_ and _accurate_ Sega 8/16-bit emulation. If you ported this emulator to other platforms or need help porting it, feel free to contact me. ---- Latest official Gamecube / Wii standalone port (screenshots below) is available [here](https://bitbucket.org/eke/genesis-plus-gx/downloads). Be sure to check the included user manual first. A [startup guide](https://bitbucket.org/eke/genesis-plus-gx/src/master/wiki/Getting%20Started.md) and a [FAQ](https://bitbucket.org/eke/genesis-plus-gx/src/master/wiki/Frequently%20Asked%20Questions.md) are also available. ![MainMenu.png](https://bitbucket.org/repo/7AjE6M/images/3565283297-MainMenu.png) ![menu_load.png](https://bitbucket.org/repo/7AjE6M/images/164055790-menu_load.png) ![RomBrowser.png](https://bitbucket.org/repo/7AjE6M/images/1972035547-RomBrowser.png) ![CtrlMenu.png](https://bitbucket.org/repo/7AjE6M/images/2283464354-CtrlMenu.png) ---- You can also test latest compiled builds for Gamecube / Wii and Retroarch (Windows 32-bit version only) by downloading them from [here](https://bitbucket.org/eke/genesis-plus-gx/src/master/builds/). ---- [![btn_donate_LG.gif](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2966212) If you like this project and want to show your appreciation, Paypal donations are always welcomed.gx/images/Ctrl_pad2b.png000664 001750 001750 00000002261 12702465756 016266 0ustar00sergiosergio000000 000000 PNG  IHDR,]sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time02/09/140~ӹ:=o^Εp|R7u)%pD_fm)|Ut'=f5>>> xWRp]̭^+s…PlϘQ8\xmR (.KKJkY Ic);$)堷ў06󠫗ZkWە` n3֚]cwl߆²ɈSj_Pw>n 0]#l}=za3 |}6>LX.v1š#(=KܡV.i-=ݟ࿒1=js;?9RJ=jT<._KZÈIENDB`gx/images/Key_Minus_wii.png000664 001750 001750 00000002331 12702465756 017063 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/10/10 -IDATxMH+WZuV.t`-}ƍ`} R(uS7+\ت[TҴREQAg5H9Cùps=@Doxܼ,IeEB S^^i.--=NDH$Hu$.//) Q0>r\ߤTU%I(9:88'{5Msio&8%8 cUUU~NL$ v~VTTTp8 AR-a έ^ 3 6* ocp:_Usx<JKK]>qF"wDUUi Ș:::u999S4sBvv6_k U2\uqp8AEQr=;;;\w9cbPUs;Sˮoe]"rI3n&t]c̾ ]ס( bEsz}}1fwaw1M 2($I$Ie@QDQ ِL`UUm$IB4,|/?V3H8캯ą^|p uzsVl7+4oG4 vLo߈1XP-\Ck?!Qބf~hCq p7ex+; ! pvv=|dqt1m^-ނf $N` C!1>B7#ޏ&5m`)4QV;ۀ{w ̂m_%l *F$*63hP)4]Cc͠\&N!7?%tq4 l2j#~4c|ڪ>P @sIX8b+m"=og1$܈䇞 k :$Vhc|D~dO1mw A + >Vc7^[x(z$8@__@%4fX8s b $0l!mȬCq\Eg8 g\g5_ ;2W͑r7"pv"]x#H'^X9 ϢecD^*= !GN)M3I$}d-7!O q !ߌ@o> B 1Wr?8dN.LjA0WvH'/ Kxގ ruڻD .f=HGGd eWA{CFi;`7p w  cv gTVhvgc>4a!v"?cX_C>{w.PCu(r )>/B AЋ*=<Cڃv^8q)ܕ{ pi4'u(x ~ V~=&kMfdoEF~$|U<-_Z#/"jE\Mr-IΠPjL"lv= ǭ9kLY,.HvX8¹fҤ1vωBV8M(k z6j3v!i$n&!=z܎Shf`֏q'ޞ0Pwo3HO](?8K `eĒnGMKwxd =Rg LVf꩷R{9cʮ){g]{C+u naP Jq$0P<8x AA h#R$_k gZ<#6X:_g'S!*IFZԺ@=!c`.T>l1}u88O荻Am$؋8͈F"綉dhBviZ+sʜF kiwZTZL(WecE,p-67*S$qbQr4!5nuCSQ$~.tpnꬭYG=!3qaBњ0V[fH'΁rCߵf>v4Qܗ7"]7@J$Lٻkw_$qV܈##H?Y-dn 4w0_Cea5(+Ӏڍռ5$B7RkH3v>g'@K祅t` 7Dй֮3s\Z.zD7iϻw]~c{:Ed\"dx|Dy;&>_uhJjnηZ.$r̹slMH=jFiB\2Mr_eO{=if Ytf 4םgIl8'`Z؂RLH붝(F[p 瑈ȁ[$ 9VZ;@O:lCeX.rb=2XC"KVQہ_D+]#/s{GQ:p=22;P0žF3]&1t{wmY_^\5%_n; fhA";EeY.ga$Vȁ%LVҢFh+]6"բǁ@i^:J㜻`2OJ1 `mDu(-^f v>f$7fG)7R? !|(c?!\̀q5ID朑sc% !/ ^<|q!e6ڲ&0UH]@6AnHZZ;>o{GB Kˁ: ֝II, t`6$Bu>sš"E|ct۽qh f47 .y(I dN.v|)tmA7- #V5!cV:ϱ[(28ێ9RrvvMV[yJM}#IQ#n#E7 ޒφAn$ݷZq4 .p'}.= &;"k#lw]*yWKZq}G[HAs4/Ac|$,w ъfֱY (ca_˝@ޭ{i O 5HW&K+=u_G uMcVIk \^Ʉco៑3{ rUFlmP9A#h7Y}c ɲ^ ,h[GVZ>ȣ!˺ǹ.5H׭Y2Ur`ɧ*٪p.;Ia6HQaAu+>J kI5 Yh*+UWHV\!BZp i*+UWHV\!BZp i*+UWHV\!۷FG*i,#EQD{>(ѧeYvgK峲Gʲ(bOzB^GY]TMڼ^IeYvg'۩=\N]܅\ϝ>j' N^o EQʲo"p,Ay~`o{Vp7sp_spwYkVࠕ=s<߇(*jلh%>:G]eYZEq/@Y/d8VZ?P[SVDYTADkHuN^ﭨj(_yyDu/O'EQ]@YEq?(ַeY>1ت=/>vei?3>Z\"Eq$p v\ .ʲV LE䴧.oxKp?nx'┧8@R"tBzo[sϣu> @o]I{*+ !S-0, DuyK@+a]Hj9U%㬝h`wQwemUӹh"@Q#*,EQT^;N<;BQh]Kh7}EQ!}x9(6l{fhNGp*r((n"!T_Wj,M #Q۫vNЍ8p.6HmutUq=>|7Hwy$IENDB`core/m68k/s68kcpu.c000664 001750 001750 00000024660 12702465756 015114 0ustar00sergiosergio000000 000000 /* ======================================================================== */ /* SUB 68K CORE */ /* ======================================================================== */ extern int scd_68k_irq_ack(int level); #define m68ki_cpu s68k #define MUL (4) /* ======================================================================== */ /* ================================ INCLUDES ============================== */ /* ======================================================================== */ #ifndef BUILD_TABLES #include "s68ki_cycles.h" #endif #include "s68kconf.h" #include "m68kcpu.h" #include "m68kops.h" /* ======================================================================== */ /* ================================= DATA ================================= */ /* ======================================================================== */ #ifdef BUILD_TABLES static unsigned char s68ki_cycles[0x10000]; #endif static int irq_latency; /* IRQ priority */ static const uint8 irq_level[0x40] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }; m68ki_cpu_core s68k; /* ======================================================================== */ /* =============================== CALLBACKS ============================== */ /* ======================================================================== */ /* Default callbacks used if the callback hasn't been set yet, or if the * callback is set to NULL */ #if M68K_EMULATE_INT_ACK == OPT_ON /* Interrupt acknowledge */ static int default_int_ack_callback(int int_level) { CPU_INT_LEVEL = 0; return M68K_INT_ACK_AUTOVECTOR; } #endif #if M68K_EMULATE_RESET == OPT_ON /* Called when a reset instruction is executed */ static void default_reset_instr_callback(void) { } #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON /* Called when a tas instruction is executed */ static int default_tas_instr_callback(void) { return 1; // allow writeback } #endif #if M68K_EMULATE_FC == OPT_ON /* Called every time there's bus activity (read/write to/from memory */ static void default_set_fc_callback(unsigned int new_fc) { } #endif /* ======================================================================== */ /* ================================= API ================================== */ /* ======================================================================== */ /* Access the internals of the CPU */ unsigned int s68k_get_reg(m68k_register_t regnum) { switch(regnum) { case M68K_REG_D0: return m68ki_cpu.dar[0]; case M68K_REG_D1: return m68ki_cpu.dar[1]; case M68K_REG_D2: return m68ki_cpu.dar[2]; case M68K_REG_D3: return m68ki_cpu.dar[3]; case M68K_REG_D4: return m68ki_cpu.dar[4]; case M68K_REG_D5: return m68ki_cpu.dar[5]; case M68K_REG_D6: return m68ki_cpu.dar[6]; case M68K_REG_D7: return m68ki_cpu.dar[7]; case M68K_REG_A0: return m68ki_cpu.dar[8]; case M68K_REG_A1: return m68ki_cpu.dar[9]; case M68K_REG_A2: return m68ki_cpu.dar[10]; case M68K_REG_A3: return m68ki_cpu.dar[11]; case M68K_REG_A4: return m68ki_cpu.dar[12]; case M68K_REG_A5: return m68ki_cpu.dar[13]; case M68K_REG_A6: return m68ki_cpu.dar[14]; case M68K_REG_A7: return m68ki_cpu.dar[15]; case M68K_REG_PC: return MASK_OUT_ABOVE_32(m68ki_cpu.pc); case M68K_REG_SR: return m68ki_cpu.t1_flag | (m68ki_cpu.s_flag << 11) | m68ki_cpu.int_mask | ((m68ki_cpu.x_flag & XFLAG_SET) >> 4) | ((m68ki_cpu.n_flag & NFLAG_SET) >> 4) | ((!m68ki_cpu.not_z_flag) << 2) | ((m68ki_cpu.v_flag & VFLAG_SET) >> 6) | ((m68ki_cpu.c_flag & CFLAG_SET) >> 8); case M68K_REG_SP: return m68ki_cpu.dar[15]; case M68K_REG_USP: return m68ki_cpu.s_flag ? m68ki_cpu.sp[0] : m68ki_cpu.dar[15]; case M68K_REG_ISP: return m68ki_cpu.s_flag ? m68ki_cpu.dar[15] : m68ki_cpu.sp[4]; #if M68K_EMULATE_PREFETCH case M68K_REG_PREF_ADDR: return m68ki_cpu.pref_addr; case M68K_REG_PREF_DATA: return m68ki_cpu.pref_data; #endif case M68K_REG_IR: return m68ki_cpu.ir; default: return 0; } } void s68k_set_reg(m68k_register_t regnum, unsigned int value) { switch(regnum) { case M68K_REG_D0: REG_D[0] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D1: REG_D[1] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D2: REG_D[2] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D3: REG_D[3] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D4: REG_D[4] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D5: REG_D[5] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D6: REG_D[6] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_D7: REG_D[7] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A0: REG_A[0] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A1: REG_A[1] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A2: REG_A[2] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A3: REG_A[3] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A4: REG_A[4] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A5: REG_A[5] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A6: REG_A[6] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_A7: REG_A[7] = MASK_OUT_ABOVE_32(value); return; case M68K_REG_PC: m68ki_jump(MASK_OUT_ABOVE_32(value)); return; case M68K_REG_SR: m68ki_set_sr(value); return; case M68K_REG_SP: REG_SP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_USP: if(FLAG_S) REG_USP = MASK_OUT_ABOVE_32(value); else REG_SP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_ISP: if(FLAG_S) REG_SP = MASK_OUT_ABOVE_32(value); else REG_ISP = MASK_OUT_ABOVE_32(value); return; case M68K_REG_IR: REG_IR = MASK_OUT_ABOVE_16(value); return; #if M68K_EMULATE_PREFETCH case M68K_REG_PREF_ADDR: CPU_PREF_ADDR = MASK_OUT_ABOVE_32(value); return; #endif default: return; } } /* Set the callbacks */ #if M68K_EMULATE_INT_ACK == OPT_ON void s68k_set_int_ack_callback(int (*callback)(int int_level)) { CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback; } #endif #if M68K_EMULATE_RESET == OPT_ON void s68k_set_reset_instr_callback(void (*callback)(void)) { CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback; } #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON void s68k_set_tas_instr_callback(int (*callback)(void)) { CALLBACK_TAS_INSTR = callback ? callback : default_tas_instr_callback; } #endif #if M68K_EMULATE_FC == OPT_ON void s68k_set_fc_callback(void (*callback)(unsigned int new_fc)) { CALLBACK_SET_FC = callback ? callback : default_set_fc_callback; } #endif extern void error(char *format, ...); extern uint16 v_counter; /* update IRQ level according to triggered interrupts */ void s68k_update_irq(unsigned int mask) { /* Get IRQ level (6 interrupt lines) */ mask = irq_level[mask]; /* Set IRQ level */ CPU_INT_LEVEL = mask << 8; #ifdef LOG_SCD error("[%d][%d] IRQ Level = %d(0x%02x) (%x)\n", v_counter, s68k.cycles, CPU_INT_LEVEL>>8,FLAG_INT_MASK,s68k.pc); #endif } void s68k_run(unsigned int cycles) { /* Make sure CPU is not already ahead */ if (s68k.cycles >= cycles) { return; } /* Check interrupt mask to process IRQ if needed */ m68ki_check_interrupts(); /* Make sure we're not stopped */ if (CPU_STOPPED) { s68k.cycles = cycles; return; } /* Save end cycles count for when CPU is stopped */ s68k.cycle_end = cycles; /* Return point for when we have an address error (TODO: use goto) */ m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */ #ifdef LOG_SCD error("[%d][%d] s68k run to %d cycles (%x), irq mask = %x (%x)\n", v_counter, s68k.cycles, cycles, s68k.pc,FLAG_INT_MASK, CPU_INT_LEVEL); #endif while (s68k.cycles < cycles) { /* Set tracing accodring to T1. */ m68ki_trace_t1() /* auto-disable (see m68kcpu.h) */ /* Set the address space for reads */ m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */ /* Decode next instruction */ REG_IR = m68ki_read_imm_16(); /* Execute instruction */ m68ki_instruction_jump_table[REG_IR](); USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* Trace m68k_exception, if necessary */ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ } } void s68k_init(void) { #ifdef BUILD_TABLES static uint emulation_initialized = 0; /* The first call to this function initializes the opcode handler jump table */ if(!emulation_initialized) { m68ki_build_opcode_table(); emulation_initialized = 1; } #endif #if M68K_EMULATE_INT_ACK == OPT_ON s68k_set_int_ack_callback(NULL); #endif #if M68K_EMULATE_RESET == OPT_ON s68k_set_reset_instr_callback(NULL); #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON s68k_set_tas_instr_callback(NULL); #endif #if M68K_EMULATE_FC == OPT_ON s68k_set_fc_callback(NULL); #endif } /* Pulse the RESET line on the CPU */ void s68k_pulse_reset(void) { /* Clear all stop levels */ CPU_STOPPED = 0; #if M68K_EMULATE_ADDRESS_ERROR CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET; #endif /* Turn off tracing */ FLAG_T1 = 0; m68ki_clear_trace() /* Interrupt mask to level 7 */ FLAG_INT_MASK = 0x0700; CPU_INT_LEVEL = 0; irq_latency = 0; /* Go to supervisor mode */ m68ki_set_s_flag(SFLAG_SET); /* Invalidate the prefetch queue */ #if M68K_EMULATE_PREFETCH /* Set to arbitrary number since our first fetch is from 0 */ CPU_PREF_ADDR = 0x1000; #endif /* M68K_EMULATE_PREFETCH */ /* Read the initial stack pointer and program counter */ m68ki_jump(0); REG_SP = m68ki_read_imm_32(); REG_PC = m68ki_read_imm_32(); m68ki_jump(REG_PC); #if M68K_EMULATE_ADDRESS_ERROR CPU_RUN_MODE = RUN_MODE_NORMAL; #endif USE_CYCLES(CYC_EXCEPTION[EXCEPTION_RESET]); } void s68k_pulse_halt(void) { /* Pulse the HALT line on the CPU */ CPU_STOPPED |= STOP_LEVEL_HALT; } void s68k_clear_halt() { /* Clear the HALT line on the CPU */ CPU_STOPPED &= ~STOP_LEVEL_HALT; } /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ libretro/msvc/msvc-2003-xbox1.sln000664 001750 001750 00000002716 12702465756 017627 0ustar00sergiosergio000000 000000 Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc-2003-xbox1", "msvc-2003-xbox1/msvc-2003-xbox1.vcproj", "{C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug Profile = Profile Profile_FastCap = Profile_FastCap Release = Release Release_LTCG = Release_LTCG EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Debug.ActiveCfg = Debug|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Debug.Build.0 = Debug|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Profile.ActiveCfg = Profile|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Profile.Build.0 = Profile|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Profile_FastCap.ActiveCfg = Profile_FastCap|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Profile_FastCap.Build.0 = Profile_FastCap|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Release.ActiveCfg = Release|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Release.Build.0 = Release|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Release_LTCG.ActiveCfg = Release_LTCG|Xbox {C0C3EF9B-2D9B-44D1-A83F-3617D8BA3421}.Release_LTCG.Build.0 = Release_LTCG|Xbox EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal gx/images/Option_system.png000664 001750 001750 00000022755 12702465756 017200 0ustar00sergiosergio000000 000000 PNG  IHDRP\2sBIT|d pHYs  ~tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$ IDATx}y\Te90,"KjtfY[[]i)+Դrž,57dal8fO~?>39u﹮v~>>wwk~gk׫!л p $$jFtsrrrk!˲6:K/weB`YYYo@+<σeYlX HA( j5g9R^^~E*6_@g߂A`ev8q" Hf@ T*ZfAkKKKKXXXVm8$6h{@໺AhveY-EQT&`Ft+*^ZZlٲf;}a7Ý&ڸq}&$ ljD Xtܤ:V$n C0 C$霍… ) hĵ>|֬YnbT*UBvʕ+%2ǧpʕѽ8({}>##|P >}`ot:]^1LJ2PPhjjjMMM") pǫT*GXXXn4 (]TTTGܹsMo֯_j R t5660hР_G]|f͚߿_';wݻw+++g)ͩAe<(@ ]G$! +)7n܅smڴidUUU:$$6 ]jZBQviĈe~7"0`_ܹ~PqƕϘ1KvZyzK׃ibaݓiPR ___NԚLyj^{S[[;(Rk6VL:Wt/?Qm۶k׮\SV}>sUUU R<ϣZt8i2 Z$+66ٳUnٲe_+--\UUX @PJBJ*,,fϛ7A\ jرc1k֬Y=Py~)**lJ IߤA`Yv @"@RA,7GDD3l8p`֭[g6P(p8`Y À(T*$ Zml~~~K,|8P.y@JDYYӥ|Ν;uGёh6H$ic$ \ooLVlgc2pfffI_k׮Q'Nxd2ͭvqPTi.###gnNOOO|o߾I)&iPGG @$bMۿ]r3i!tvvB*b„ uQQQx ]?~tsssIJF477eYPճ(D"eivb !!hРAƏozg3 ^NhZNj}sĈ%&&}nݺG]8y6 FZj:ORtңvxK!EjژZ_"ɄB1?3777h4Z>ժU>x`cvfgg'[,D"$<+W/mhhH2eJ)S~!i9Ǐ<</6f3bbbd"""ޘ1cu{7(z!7fl@4Mˋ&H$677@ ξE<M77}nO \ggxl6/_^xbbb@ďa':wd]:ƍ툉i]jͶy9I`#KKKGWTT khhr3;͒ΝnGHHr[h齬̥b퍄mqqq߭_˗/ 6L֕xl̘1(--rH$N+))1 RAv@g i!DDD4%$$^~>>>*wwۜwH厲, Vۼ|_VZuqq㥥p=W_kLLL鈈WGe|C444 qy^̲,<[`Y2  bȐ!իWOjooM8)())Q8qՊFZnAlw}ǵknjj%)HD455 ^^4M J2Uvss;ɋ/hVlANJ[[[(n y'IGΙzc8N< w;w!o9<ŋyύF p: W6nܸX,0r0A iF eRiT*'U*թ t(JN<9l޽;::t:H$r7bgH &s'Յŋ\|ɓ'9&999a…7; Z]_ ,Ξ=`eٝ_| @_|w̙paivZjE]]t:(]]]xE Tէۿ-$Iy)..޸q`sU/T, ܸUłe tƏ`…xΝ;_7mڴ1###ݽOAg4l6yۛjž,KְaÊ'L @ħ~:ŋÚìVk(Mrz]$IՕ.i:KPy_nD[RRaÆ(avtt4 Drˁ;}wy'O>yώ;vҥKezmʕ544{fsiЗ;I$KP*@@@T*%I0LR @v̨#m6[b X,B{ATrWYQ(g]]]ϯXBe˖7JKKV-?x03gΚ^xa[BB/>[ZZZرcxn޼;*OJJ͛9}Ugs }Q.ΐCaP(0$yT*]`AEhhhד'O?~<2$X0bͰl8'NHQ|||T*9__:R_ .|a'|EdB\\"_z饔ٳg1gΜw/^~MAM>}ʕ+x499K$Gif3{6ΝbNwȹjhիW]Iji...+z}j GEE-_B @{ z}jEcc#Auu5RvޝV YSS΀0{vo 0<233s2yOx Sdd|^DMMM)Cۅz';r#7~w$l6 :Ν1cQPP0E__ ^#E}eZ֭[mۇ'DJOٌF/}i%2l/acǎ~g*\y\r%?% "HLLW_}@ kAA6###e4GUWWz455A(DSA˾,ST*d2V,[^8| %Zt:tӦMab@OOS~0 cǎC}]Ah4bС 0aB￿eذaϼ˛D`NN,cr#0aaag-[v@EWWw^H1ҥKdG uyęU(K.-vss+Cw.wҥ>l]^^PVB_ Ԅ3gYn~  6s:Ç;T*ĉ%%%p8DkkB  1 C.]?*Jk###Kƌs~ѢEŒpV;`0z'%W,?]˝8 B$E qyyyf`4;(L&sUl6B$} aT77]3gά=>gkk,''g͗_~Bqq1JN漫"E hW(q]Z`iWWsGK.ta:N`0  !  o{=bi܊Bbb"F5p.++X0d2 ---P]]TWW'y8Ǜw.ya8FiNMM-8pQww\\*T__o߾(N²y ͹N:|I~~~K~~ UVV8p … MMM~---2@ ipcN t\~~~'%%vss;qٱc6j78d˖-iqeeeVU0 uuvΟۅSM6uL>e˖--T5J%ȢJˋjmm8NIӴi$ azݤR)ب+^^^G E0?8- =R7m4+S$m6ЙQ;,9k֬Yj>G}V.H駟F>}:,h4zYVMӤjIm@TZbcc):RN=裕GIȈtfjhb6vZOaz4@ >x|f͚iȑ1sΝ򇁃nx#<ϧ~ljCu:]0f٥Z=  ^նhkk;qvŭ\m߾=lHccc(EQfd2'8Mk # [#""xb8fݺuǕJ>[NoDpiii/^0Lh 4͂v8vPeRZ,#^^^ycƌ)LJJpt{.--t>RT#(S.IilljBP ::C xtoU]]qihј@?EQ5?p6;6oݚ،d;up~={'O#G`?q~={'O#G`?q~={'1_;~wdΒ"]څ@wfZp\{c.Mq{. 5L-y̵ߑ.ǏOٻwjwTy? LӦM{-55LVVm۶-?K\'FjGqyڵ/+o^p!(VuXV݅ycffYYYi7oE4%8NRjٳ/;xgΝxMX^ h _wP!p߾Dzj5IDAT}Addi@YxxxyMM:U(NMM=cǎ(O__ 4FDxU&4 CC111 ˲m\8q"mܠAET*]?S.Fuvڕz9YYY0 b@ѹsN<)HMM-ݾ}$Jeٳ7oذaCuuuG Cccc1jԨlS*++%? ^UUrȑ˗/(..~[Ӧ^zWY ڵkC%4'Ց񎈈ٳ>O? #FY,B=%o ŋ|ͧ)J\+SJRi%ߍ.\$q(..9sS3g\L&(J*[vtt[Wvx=MO?'_yWnذ{1i{'tuu۷oPdd䥕+Wp?qĥ/AR~esO>:77ydqBt+_jkkDd2[bxD"ɵ7ᴄtر9b8/RE A3fS&-X`BoƮ_~󘴴yݵȪ%K̜? |cZ{}~2B8kCOx(%%Ѱ@&i\]]1`]BB!,{WFjߕ]`|Mv '555UUUAxgtFJH$>eG`+++KiZn*ç;$IvL4 U(*(qƴ={FeYkSwUEG}3gμ-:;;QTT=|_|>#|X%='|~\.oeYV9r\~m9AtǭAN<9fE6M/h4v;f ٳg_TT%ZBZ\p;))) &tsscVXqGCءCdU̟?hǎz^I['~xxx\^=poa===˒I$$MV$IRVGFFm6&;; e[5nHLL8NP{}S?h"IENDB`core/vdp_ctrl.h000664 001750 001750 00000010310 12702465756 014631 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Video Display Processor (68k & Z80 CPU interface) * * Support for SG-1000 (TMS99xx & 315-5066), Master System (315-5124 & 315-5246), Game Gear & Mega Drive VDP * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _VDP_H_ #define _VDP_H_ /* VDP context */ extern uint8 reg[0x20]; extern uint8 sat[0x400]; extern uint8 vram[0x10000]; extern uint8 cram[0x80]; extern uint8 vsram[0x80]; extern uint8 hint_pending; extern uint8 vint_pending; extern uint16 status; extern uint32 dma_length; /* Global variables */ extern uint16 ntab; extern uint16 ntbb; extern uint16 ntwb; extern uint16 satb; extern uint16 hscb; extern uint8 bg_name_dirty[0x800]; extern uint16 bg_name_list[0x800]; extern uint16 bg_list_index; extern uint8 hscroll_mask; extern uint8 playfield_shift; extern uint8 playfield_col_mask; extern uint16 playfield_row_mask; extern uint8 odd_frame; extern uint8 im2_flag; extern uint8 interlaced; extern uint8 vdp_pal; extern uint8 h_counter; extern uint16 v_counter; extern uint16 vc_max; extern uint16 vscroll; extern uint16 lines_per_frame; extern uint16 max_sprite_pixels; extern int32 fifo_write_cnt; extern uint32 fifo_slots; extern uint32 hvc_latch; extern const uint8 *hctab; /* Function pointers */ extern void (*vdp_68k_data_w)(unsigned int data); extern void (*vdp_z80_data_w)(unsigned int data); extern unsigned int (*vdp_68k_data_r)(void); extern unsigned int (*vdp_z80_data_r)(void); /* Function prototypes */ extern void vdp_init(void); extern void vdp_reset(void); extern int vdp_context_save(uint8 *state); extern int vdp_context_load(uint8 *state); extern void vdp_dma_update(unsigned int cycles); extern void vdp_68k_ctrl_w(unsigned int data); extern void vdp_z80_ctrl_w(unsigned int data); extern void vdp_sms_ctrl_w(unsigned int data); extern void vdp_tms_ctrl_w(unsigned int data); extern unsigned int vdp_68k_ctrl_r(unsigned int cycles); extern unsigned int vdp_z80_ctrl_r(unsigned int cycles); extern unsigned int vdp_hvc_r(unsigned int cycles); extern void vdp_test_w(unsigned int data); extern int vdp_68k_irq_ack(int int_level); #endif /* _VDP_H_ */ core/tremor/mdct.h000664 001750 001750 00000002676 12702465756 015273 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: modified discrete cosine transform prototypes ********************************************************************/ #ifndef _OGG_mdct_H_ #define _OGG_mdct_H_ #include "ivorbiscodec.h" #include "misc.h" #define DATA_TYPE ogg_int32_t #define REG_TYPE register ogg_int32_t #ifdef _LOW_ACCURACY_ #define cPI3_8 (0x0062) #define cPI2_8 (0x00b5) #define cPI1_8 (0x00ed) #else #define cPI3_8 (0x30fbc54d) #define cPI2_8 (0x5a82799a) #define cPI1_8 (0x7641af3d) #endif extern void mdct_forward(int n, DATA_TYPE *in, DATA_TYPE *out); extern void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out); #endif gx/images/Key_R_gcn.png000664 001750 001750 00000004071 12702465756 016153 0ustar00sergiosergio000000 000000 PNG  IHDR,sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/19/10IDATx͖oW?sٝmsYY%;nĮ%>C! UJЇTJ&41Jqʵ>3g;;lS}HGGif>{hb|>޽{ٿ?333eC>Dz,t]' CضMdssS[]]Ο?tjzGSJa@X)u fbbؿ?vbxxd2i18T*{o… ڂL~;Ɍ LPH iahJ)|SVKmjZuf}{8.׀ͯǙȑ#8pݻwH$}XceeeٳO<͇\.S.g(! CH) j\~O]׹y֧v _faaYJ$X탋?zSv>p),!m. 8C %D$RJ:.+ }Νnmm W>|I BYk?,r10}lA D!T0 <] z8aH 00M4@JݻwY\\dqqf.SSS144aZkkkώQ,QJa6!*Y$I07/O K/177vy={@JP*~>̙3\?zX$`f8lmmn-<=Em$I$iH$0 L:i}i q8tzӧOSYYa(AFVDAYqj4M&J%^{U~W^y%N)eƍo9$z 0 41 i0MD0H$χ|SO?ͩS8z(ܻw{ cE ՖAt]RٮRe M!nZYY'NH8n躎aqQ-b:#Zf>{O}4/تV{9m"T*.4?:bqHR8K̙3,--αcǘ?rM\AmbV h0::)!2wի3?b&nzP)"iRT^9 F@#eu]'4 ]G>A۶wNBOR^OIwpbkBfgg,VMיC)EFFr@Q}6궱l\.W)|btt<'٠1 臿E)'>BkUU t=\. ||Dz,7mp?4T{hT`ǤR'N4Mf0 /^ٶMۍ c_Qm`ﴁLܽ{W4 o#J_g^wDIENDB`core/tremor/mdct.c000664 001750 001750 00000033065 12702465756 015262 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: normalized modified discrete cosine transform power of two length transform only [64 <= n ] last mod: $Id: mdct.c,v 1.9 2002/10/16 09:17:39 xiphmont Exp $ Original algorithm adapted long ago from _The use of multirate filter banks for coding of high quality digital audio_, by T. Sporer, K. Brandenburg and B. Edler, collection of the European Signal Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp 211-214 The below code implements an algorithm that no longer looks much like that presented in the paper, but the basic structure remains if you dig deep enough to see it. This module DOES NOT INCLUDE code to generate/apply the window function. Everybody has their own weird favorite including me... I happen to like the properties of y=sin(.5PI*sin^2(x)), but others may vehemently disagree. ********************************************************************/ #include "ivorbiscodec.h" #include "codebook.h" #include "misc.h" #include "mdct.h" #include "mdct_lookup.h" /* 8 point butterfly (in place) */ STIN void mdct_butterfly_8(DATA_TYPE *x){ REG_TYPE r0 = x[4] + x[0]; REG_TYPE r1 = x[4] - x[0]; REG_TYPE r2 = x[5] + x[1]; REG_TYPE r3 = x[5] - x[1]; REG_TYPE r4 = x[6] + x[2]; REG_TYPE r5 = x[6] - x[2]; REG_TYPE r6 = x[7] + x[3]; REG_TYPE r7 = x[7] - x[3]; x[0] = r5 + r3; x[1] = r7 - r1; x[2] = r5 - r3; x[3] = r7 + r1; x[4] = r4 - r0; x[5] = r6 - r2; x[6] = r4 + r0; x[7] = r6 + r2; MB(); } /* 16 point butterfly (in place, 4 register) */ STIN void mdct_butterfly_16(DATA_TYPE *x){ REG_TYPE r0, r1; r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0]; r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1]; x[ 0] = MULT31((r0 + r1) , cPI2_8); x[ 1] = MULT31((r1 - r0) , cPI2_8); MB(); r0 = x[10] - x[ 2]; x[10] += x[ 2]; r1 = x[ 3] - x[11]; x[11] += x[ 3]; x[ 2] = r1; x[ 3] = r0; MB(); r0 = x[12] - x[ 4]; x[12] += x[ 4]; r1 = x[13] - x[ 5]; x[13] += x[ 5]; x[ 4] = MULT31((r0 - r1) , cPI2_8); x[ 5] = MULT31((r0 + r1) , cPI2_8); MB(); r0 = x[14] - x[ 6]; x[14] += x[ 6]; r1 = x[15] - x[ 7]; x[15] += x[ 7]; x[ 6] = r0; x[ 7] = r1; MB(); mdct_butterfly_8(x); mdct_butterfly_8(x+8); } /* 32 point butterfly (in place, 4 register) */ STIN void mdct_butterfly_32(DATA_TYPE *x){ REG_TYPE r0, r1; r0 = x[30] - x[14]; x[30] += x[14]; r1 = x[31] - x[15]; x[31] += x[15]; x[14] = r0; x[15] = r1; MB(); r0 = x[28] - x[12]; x[28] += x[12]; r1 = x[29] - x[13]; x[29] += x[13]; XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] ); MB(); r0 = x[26] - x[10]; x[26] += x[10]; r1 = x[27] - x[11]; x[27] += x[11]; x[10] = MULT31((r0 - r1) , cPI2_8); x[11] = MULT31((r0 + r1) , cPI2_8); MB(); r0 = x[24] - x[ 8]; x[24] += x[ 8]; r1 = x[25] - x[ 9]; x[25] += x[ 9]; XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] ); MB(); r0 = x[22] - x[ 6]; x[22] += x[ 6]; r1 = x[ 7] - x[23]; x[23] += x[ 7]; x[ 6] = r1; x[ 7] = r0; MB(); r0 = x[ 4] - x[20]; x[20] += x[ 4]; r1 = x[ 5] - x[21]; x[21] += x[ 5]; XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] ); MB(); r0 = x[ 2] - x[18]; x[18] += x[ 2]; r1 = x[ 3] - x[19]; x[19] += x[ 3]; x[ 2] = MULT31((r1 + r0) , cPI2_8); x[ 3] = MULT31((r1 - r0) , cPI2_8); MB(); r0 = x[ 0] - x[16]; x[16] += x[ 0]; r1 = x[ 1] - x[17]; x[17] += x[ 1]; XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] ); MB(); mdct_butterfly_16(x); mdct_butterfly_16(x+16); } /* N/stage point generic N stage butterfly (in place, 2 register) */ STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ LOOKUP_T *T = sincos_lookup0; DATA_TYPE *x1 = x + points - 8; DATA_TYPE *x2 = x + (points>>1) - 8; REG_TYPE r0; REG_TYPE r1; do{ r0 = x1[6] - x2[6]; x1[6] += x2[6]; r1 = x2[7] - x1[7]; x1[7] += x2[7]; XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; r0 = x1[4] - x2[4]; x1[4] += x2[4]; r1 = x2[5] - x1[5]; x1[5] += x2[5]; XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step; r0 = x1[2] - x2[2]; x1[2] += x2[2]; r1 = x2[3] - x1[3]; x1[3] += x2[3]; XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; r0 = x1[0] - x2[0]; x1[0] += x2[0]; r1 = x2[1] - x1[1]; x1[1] += x2[1]; XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step; x1-=8; x2-=8; }while(Tsincos_lookup0); do{ r0 = x2[6] - x1[6]; x1[6] += x2[6]; r1 = x2[7] - x1[7]; x1[7] += x2[7]; XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; r0 = x2[4] - x1[4]; x1[4] += x2[4]; r1 = x2[5] - x1[5]; x1[5] += x2[5]; XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step; r0 = x2[2] - x1[2]; x1[2] += x2[2]; r1 = x2[3] - x1[3]; x1[3] += x2[3]; XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; r0 = x2[0] - x1[0]; x1[0] += x2[0]; r1 = x2[1] - x1[1]; x1[1] += x2[1]; XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step; x1-=8; x2-=8; }while(Tsincos_lookup0); } STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ int stages=8-shift; int i,j; for(i=0;--stages>0;i++){ for(j=0;j<(1<>i)*j,points>>i,4<<(i+shift)); } for(j=0;j>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); } STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ int bit = 0; DATA_TYPE *w0 = x; DATA_TYPE *w1 = x = w0+(n>>1); LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; LOOKUP_T *Ttop = T+1024; DATA_TYPE r2; do{ DATA_TYPE r3 = bitrev12(bit++); DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; DATA_TYPE *x1 = x + (r3>>shift); REG_TYPE r0 = x0[0] + x1[0]; REG_TYPE r1 = x1[1] - x0[1]; XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; w1 -= 4; r0 = (x0[1] + x1[1])>>1; r1 = (x0[0] - x1[0])>>1; w0[0] = r0 + r2; w0[1] = r1 + r3; w1[2] = r0 - r2; w1[3] = r3 - r1; r3 = bitrev12(bit++); x0 = x + ((r3 ^ 0xfff)>>shift) -1; x1 = x + (r3>>shift); r0 = x0[0] + x1[0]; r1 = x1[1] - x0[1]; XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; r0 = (x0[1] + x1[1])>>1; r1 = (x0[0] - x1[0])>>1; w0[2] = r0 + r2; w0[3] = r1 + r3; w1[0] = r0 - r2; w1[1] = r3 - r1; w0 += 4; }while(T>shift) -1; DATA_TYPE *x1 = x + (r3>>shift); REG_TYPE r0 = x0[0] + x1[0]; REG_TYPE r1 = x1[1] - x0[1]; T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); w1 -= 4; r0 = (x0[1] + x1[1])>>1; r1 = (x0[0] - x1[0])>>1; w0[0] = r0 + r2; w0[1] = r1 + r3; w1[2] = r0 - r2; w1[3] = r3 - r1; r3 = bitrev12(bit++); x0 = x + ((r3 ^ 0xfff)>>shift) -1; x1 = x + (r3>>shift); r0 = x0[0] + x1[0]; r1 = x1[1] - x0[1]; T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); r0 = (x0[1] + x1[1])>>1; r1 = (x0[0] - x1[0])>>1; w0[2] = r0 + r2; w0[3] = r1 + r3; w1[0] = r0 - r2; w1[1] = r3 - r1; w0 += 4; }while(w0>1; int n4=n>>2; DATA_TYPE *iX; DATA_TYPE *oX; LOOKUP_T *T; LOOKUP_T *V; int shift; int step; for (shift=6;!(n&(1<=in+n4); do{ oX-=4; XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step; XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step; iX-=8; }while(iX>=in); iX = in+n2-8; oX = out+n2+n4; T = sincos_lookup0; do{ T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] ); T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] ); iX-=8; oX+=4; }while(iX>=in+n4); do{ T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] ); T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] ); iX-=8; oX+=4; }while(iX>=in); mdct_butterflies(out+n2,n2,shift); mdct_bitreverse(out,n,step,shift); /* rotate + window */ step>>=2; { DATA_TYPE *oX1=out+n2+n4; DATA_TYPE *oX2=out+n2+n4; DATA_TYPE *iX =out; switch(step) { default: { T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; do{ oX1-=4; XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step; XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step; XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step; XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step; oX2+=4; iX+=8; }while(iX>1; t1 = (*T++)>>1; do{ oX1-=4; t0 += (v0 = (*V++)>>1); t1 += (v1 = (*V++)>>1); XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); v0 += (t0 = (*T++)>>1); v1 += (t1 = (*T++)>>1); XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] ); t0 += (v0 = (*V++)>>1); t1 += (v1 = (*V++)>>1); XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] ); v0 += (t0 = (*T++)>>1); v1 += (t1 = (*T++)>>1); XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); oX2+=4; iX+=8; }while(iX>2); t1 += (q1 = (v1-t1)>>2); XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); t0 = v0-q0; t1 = v1-q1; XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] ); t0 = *T++; t1 = *T++; v0 += (q0 = (t0-v0)>>2); v1 += (q1 = (t1-v1)>>2); XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] ); v0 = t0-q0; v1 = t1-q1; XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); oX2+=4; iX+=8; }while(iXoX2); } } core/vdp_ctrl.c000664 001750 001750 00000256217 12702465756 014646 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Video Display Processor (68k & Z80 CPU interface) * * Support for SG-1000 (TMS99xx & 315-5066), Master System (315-5124 & 315-5246), Game Gear & Mega Drive VDP * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "hvc.h" /* Mark a pattern as modified */ #define MARK_BG_DIRTY(addr) \ { \ name = (addr >> 5) & 0x7FF; \ if (bg_name_dirty[name] == 0) \ { \ bg_name_list[bg_list_index++] = name; \ } \ bg_name_dirty[name] |= (1 << ((addr >> 2) & 7)); \ } /* VDP context */ uint8 sat[0x400]; /* Internal copy of sprite attribute table */ uint8 vram[0x10000]; /* Video RAM (64K x 8-bit) */ uint8 cram[0x80]; /* On-chip color RAM (64 x 9-bit) */ uint8 vsram[0x80]; /* On-chip vertical scroll RAM (40 x 11-bit) */ uint8 reg[0x20]; /* Internal VDP registers (23 x 8-bit) */ uint8 hint_pending; /* 0= Line interrupt is pending */ uint8 vint_pending; /* 1= Frame interrupt is pending */ uint16 status; /* VDP status flags */ uint32 dma_length; /* DMA remaining length */ /* Global variables */ uint16 ntab; /* Name table A base address */ uint16 ntbb; /* Name table B base address */ uint16 ntwb; /* Name table W base address */ uint16 satb; /* Sprite attribute table base address */ uint16 hscb; /* Horizontal scroll table base address */ uint8 bg_name_dirty[0x800]; /* 1= This pattern is dirty */ uint16 bg_name_list[0x800]; /* List of modified pattern indices */ uint16 bg_list_index; /* # of modified patterns in list */ uint8 hscroll_mask; /* Horizontal Scrolling line mask */ uint8 playfield_shift; /* Width of planes A, B (in bits) */ uint8 playfield_col_mask; /* Playfield column mask */ uint16 playfield_row_mask; /* Playfield row mask */ uint16 vscroll; /* Latched vertical scroll value */ uint8 odd_frame; /* 1: odd field, 0: even field */ uint8 im2_flag; /* 1= Interlace mode 2 is being used */ uint8 interlaced; /* 1: Interlaced mode 1 or 2 */ uint8 vdp_pal; /* 1: PAL , 0: NTSC (default) */ uint8 h_counter; /* Horizontal counter */ uint16 v_counter; /* Vertical counter */ uint16 vc_max; /* Vertical counter overflow value */ uint16 lines_per_frame; /* PAL: 313 lines, NTSC: 262 lines */ uint16 max_sprite_pixels; /* Max. sprites pixels per line (parsing & rendering) */ int32 fifo_write_cnt; /* VDP FIFO write count */ uint32 fifo_slots; /* VDP FIFO access slot count */ uint32 hvc_latch; /* latched HV counter */ const uint8 *hctab; /* pointer to H Counter table */ /* Function pointers */ void (*vdp_68k_data_w)(unsigned int data); void (*vdp_z80_data_w)(unsigned int data); unsigned int (*vdp_68k_data_r)(void); unsigned int (*vdp_z80_data_r)(void); /* Function prototypes */ static void vdp_68k_data_w_m4(unsigned int data); static void vdp_68k_data_w_m5(unsigned int data); static unsigned int vdp_68k_data_r_m4(void); static unsigned int vdp_68k_data_r_m5(void); static void vdp_z80_data_w_m4(unsigned int data); static void vdp_z80_data_w_m5(unsigned int data); static unsigned int vdp_z80_data_r_m4(void); static unsigned int vdp_z80_data_r_m5(void); static void vdp_z80_data_w_ms(unsigned int data); static void vdp_z80_data_w_gg(unsigned int data); static void vdp_z80_data_w_sg(unsigned int data); static void vdp_bus_w(unsigned int data); static void vdp_fifo_update(unsigned int cycles); static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles); static void vdp_dma_68k_ext(unsigned int length); static void vdp_dma_68k_ram(unsigned int length); static void vdp_dma_68k_io(unsigned int length); static void vdp_dma_copy(unsigned int length); static void vdp_dma_fill(unsigned int length); /* Tables that define the playfield layout */ static const uint8 hscroll_mask_table[] = { 0x00, 0x07, 0xF8, 0xFF }; static const uint8 shift_table[] = { 6, 7, 0, 8 }; static const uint8 col_mask_table[] = { 0x0F, 0x1F, 0x0F, 0x3F }; static const uint16 row_mask_table[] = { 0x0FF, 0x1FF, 0x2FF, 0x3FF }; static uint8 border; /* Border color index */ static uint8 pending; /* Pending write flag */ static uint8 code; /* Code register */ static uint8 dma_type; /* DMA mode */ static uint16 addr; /* Address register */ static uint16 addr_latch; /* Latched A15, A14 of address */ static uint16 sat_base_mask; /* Base bits of SAT */ static uint16 sat_addr_mask; /* Index bits of SAT */ static uint16 dma_src; /* DMA source address */ static uint32 dma_endCycles; /* 68k cycles to DMA end */ static int dmafill; /* DMA Fill pending flag */ static int cached_write; /* 2nd part of 32-bit CTRL port write (Genesis mode) or LSB of CRAM data (Game Gear mode) */ static uint16 fifo[4]; /* FIFO ring-buffer */ static int fifo_idx; /* FIFO write index */ static int fifo_byte_access; /* FIFO byte access flag */ static uint32 fifo_cycles; /* FIFO next access cycle */ /* set Z80 or 68k interrupt lines */ static void (*set_irq_line)(unsigned int level); static void (*set_irq_line_delay)(unsigned int level); /* Vertical counter overflow values (see hvc.h) */ static const uint16 vc_table[4][2] = { /* NTSC, PAL */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0xEA , 0x102}, /* Mode 5 (224 lines) */ {0xDA , 0xF2}, /* Mode 4 (192 lines) */ {0x106, 0x10A} /* Mode 5 (240 lines) */ }; /* DMA Timings (number of access slots per line) */ static const uint8 dma_timing[2][2] = { /* H32, H40 */ {16 , 18}, /* active display */ {167, 205} /* blank display */ }; /* DMA processing functions (set by VDP register 23 high nibble) */ static void (*const dma_func[16])(unsigned int length) = { /* 0x0-0x3 : DMA from 68k bus $000000-$7FFFFF (external area) */ vdp_dma_68k_ext,vdp_dma_68k_ext,vdp_dma_68k_ext,vdp_dma_68k_ext, /* 0x4-0x7 : DMA from 68k bus $800000-$FFFFFF (internal RAM & I/O) */ vdp_dma_68k_ram, vdp_dma_68k_io,vdp_dma_68k_ram,vdp_dma_68k_ram, /* 0x8-0xB : DMA Fill */ vdp_dma_fill,vdp_dma_fill,vdp_dma_fill,vdp_dma_fill, /* 0xC-0xF : DMA Copy */ vdp_dma_copy,vdp_dma_copy,vdp_dma_copy,vdp_dma_copy }; /* BG rendering functions */ static void (*const render_bg_modes[16])(int line) = { render_bg_m0, /* Graphics I */ render_bg_m2, /* Graphics II */ render_bg_m4, /* Mode 4 */ render_bg_m4, /* Mode 4 */ render_bg_m3, /* Multicolor */ render_bg_m3x, /* Multicolor (Extended PG) */ render_bg_m4, /* Mode 4 */ render_bg_m4, /* Mode 4 */ render_bg_m1, /* Text */ render_bg_m1x, /* Text (Extended PG) */ render_bg_m4, /* Mode 4 */ render_bg_m4, /* Mode 4 */ render_bg_inv, /* Invalid (1+3) */ render_bg_inv, /* Invalid (1+2+3) */ render_bg_m4, /* Mode 4 */ render_bg_m4, /* Mode 4 */ }; /*--------------------------------------------------------------------------*/ /* Init, reset, context functions */ /*--------------------------------------------------------------------------*/ void vdp_init(void) { /* PAL/NTSC timings */ lines_per_frame = vdp_pal ? 313: 262; /* CPU interrupt line(s)*/ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 68k cpu */ set_irq_line = m68k_set_irq; set_irq_line_delay = m68k_set_irq_delay; } else { /* Z80 cpu */ set_irq_line = z80_set_irq_line; set_irq_line_delay = z80_set_irq_line; } } void vdp_reset(void) { int i; memset ((char *) sat, 0, sizeof (sat)); memset ((char *) vram, 0, sizeof (vram)); memset ((char *) cram, 0, sizeof (cram)); memset ((char *) vsram, 0, sizeof (vsram)); memset ((char *) reg, 0, sizeof (reg)); addr = 0; addr_latch = 0; code = 0; pending = 0; border = 0; hint_pending = 0; vint_pending = 0; dmafill = 0; dma_src = 0; dma_type = 0; dma_length = 0; dma_endCycles = 0; odd_frame = 0; im2_flag = 0; interlaced = 0; fifo_write_cnt = 0; fifo_cycles = 0; fifo_slots = 0; fifo_idx = 0; cached_write = -1; fifo_byte_access = 1; ntab = 0; ntbb = 0; ntwb = 0; satb = 0; hscb = 0; vscroll = 0; hscroll_mask = 0x00; playfield_shift = 6; playfield_col_mask = 0x0F; playfield_row_mask = 0x0FF; sat_base_mask = 0xFE00; sat_addr_mask = 0x01FF; /* reset pattern cache changes */ bg_list_index = 0; memset ((char *) bg_name_dirty, 0, sizeof (bg_name_dirty)); memset ((char *) bg_name_list, 0, sizeof (bg_name_list)); /* default Window clipping */ window_clip(0,0); /* reset VDP status (FIFO empty flag is set) */ if (system_hw & SYSTEM_MD) { status = vdp_pal | 0x200; } else { status = 0; } /* default display area */ bitmap.viewport.w = 256; bitmap.viewport.h = 192; bitmap.viewport.ow = 256; bitmap.viewport.oh = 192; /* default HVC */ hvc_latch = 0x10000; hctab = cycle2hc32; vc_max = vc_table[0][vdp_pal]; v_counter = bitmap.viewport.h; h_counter = 0xff; /* default sprite pixel width */ max_sprite_pixels = 256; /* default overscan area */ if ((system_hw == SYSTEM_GG) && !config.gg_extra) { /* Display area reduced to 160x144 if overscan is disabled */ bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; bitmap.viewport.y = (config.overscan & 1) ? (24 * (vdp_pal + 1)) : -24; } else { bitmap.viewport.x = (config.overscan & 2) * 7; bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } /* default rendering mode */ update_bg_pattern_cache = update_bg_pattern_cache_m4; if (system_hw < SYSTEM_MD) { /* Mode 0 */ render_bg = render_bg_m0; render_obj = render_obj_tms; parse_satb = parse_satb_tms; } else { /* Mode 4 */ render_bg = render_bg_m4; render_obj = render_obj_m4; parse_satb = parse_satb_m4; } /* default 68k bus interface (Mega Drive VDP only) */ vdp_68k_data_w = vdp_68k_data_w_m4; vdp_68k_data_r = vdp_68k_data_r_m4; /* default Z80 bus interface */ switch (system_hw) { case SYSTEM_SG: case SYSTEM_SGII: { /* SG-1000 (TMS99xx) or SG-1000 II (315-5066) VDP */ vdp_z80_data_w = vdp_z80_data_w_sg; vdp_z80_data_r = vdp_z80_data_r_m4; break; } case SYSTEM_GG: { /* Game Gear VDP */ vdp_z80_data_w = vdp_z80_data_w_gg; vdp_z80_data_r = vdp_z80_data_r_m4; break; } case SYSTEM_MARKIII: case SYSTEM_SMS: case SYSTEM_SMS2: case SYSTEM_GGMS: { /* Master System or Game Gear (in MS compatibility mode) VDP */ vdp_z80_data_w = vdp_z80_data_w_ms; vdp_z80_data_r = vdp_z80_data_r_m4; break; } default: { /* Mega Drive VDP (in MS compatibility mode) */ vdp_z80_data_w = vdp_z80_data_w_m4; vdp_z80_data_r = vdp_z80_data_r_m4; break; } } /* H-INT is disabled on startup (verified on VA4 MD1 with 315-5313 VDP) */ reg[10] = 0xFF; /* Master System specific */ if ((system_hw & SYSTEM_SMS) && (!(config.bios & 1) || !(system_bios & SYSTEM_SMS))) { /* force registers initialization (normally done by BOOT ROM on all Master System models) */ vdp_reg_w(0 , 0x36, 0); vdp_reg_w(1 , 0x80, 0); vdp_reg_w(2 , 0xFF, 0); vdp_reg_w(3 , 0xFF, 0); vdp_reg_w(4 , 0xFF, 0); vdp_reg_w(5 , 0xFF, 0); vdp_reg_w(6 , 0xFF, 0); /* Mode 4 */ render_bg = render_bg_m4; render_obj = render_obj_m4; parse_satb = parse_satb_m4; } /* Mega Drive specific */ else if (((system_hw == SYSTEM_MD) || (system_hw == SYSTEM_MCD)) && (config.bios & 1) && !(system_bios & SYSTEM_MD)) { /* force registers initialization (normally done by BOOT ROM, only on Mega Drive model with TMSS) */ vdp_reg_w(0 , 0x04, 0); vdp_reg_w(1 , 0x04, 0); vdp_reg_w(12, 0x81, 0); vdp_reg_w(15, 0x02, 0); } /* reset color palette */ for(i = 0; i < 0x20; i ++) { color_update_m4(i, 0x00); } color_update_m4(0x40, 0x00); } int vdp_context_save(uint8 *state) { int bufferptr = 0; save_param(sat, sizeof(sat)); save_param(vram, sizeof(vram)); save_param(cram, sizeof(cram)); save_param(vsram, sizeof(vsram)); save_param(reg, sizeof(reg)); save_param(&addr, sizeof(addr)); save_param(&addr_latch, sizeof(addr_latch)); save_param(&code, sizeof(code)); save_param(&pending, sizeof(pending)); save_param(&status, sizeof(status)); save_param(&dmafill, sizeof(dmafill)); save_param(&fifo_idx, sizeof(fifo_idx)); save_param(&fifo, sizeof(fifo)); save_param(&h_counter, sizeof(h_counter)); save_param(&hint_pending, sizeof(hint_pending)); save_param(&vint_pending, sizeof(vint_pending)); save_param(&dma_length, sizeof(dma_length)); save_param(&dma_type, sizeof(dma_type)); save_param(&dma_src, sizeof(dma_src)); save_param(&cached_write, sizeof(cached_write)); return bufferptr; } int vdp_context_load(uint8 *state) { int i, bufferptr = 0; uint8 temp_reg[0x20]; load_param(sat, sizeof(sat)); load_param(vram, sizeof(vram)); load_param(cram, sizeof(cram)); load_param(vsram, sizeof(vsram)); load_param(temp_reg, sizeof(temp_reg)); /* restore VDP registers */ if (system_hw < SYSTEM_MD) { if (system_hw >= SYSTEM_MARKIII) { for (i=0;i<0x10;i++) { pending = 1; addr_latch = temp_reg[i]; vdp_sms_ctrl_w(0x80 | i); } } else { /* TMS-99xx registers are updated directly to prevent spurious 4K->16K VRAM switching */ for (i=0;i<0x08;i++) { reg[i] = temp_reg[i]; } /* Rendering mode */ render_bg = render_bg_modes[((reg[0] & 0x02) | (reg[1] & 0x18)) >> 1]; } } else { for (i=0;i<0x20;i++) { vdp_reg_w(i, temp_reg[i], 0); } } load_param(&addr, sizeof(addr)); load_param(&addr_latch, sizeof(addr_latch)); load_param(&code, sizeof(code)); load_param(&pending, sizeof(pending)); load_param(&status, sizeof(status)); load_param(&dmafill, sizeof(dmafill)); load_param(&fifo_idx, sizeof(fifo_idx)); load_param(&fifo, sizeof(fifo)); load_param(&h_counter, sizeof(h_counter)); load_param(&hint_pending, sizeof(hint_pending)); load_param(&vint_pending, sizeof(vint_pending)); load_param(&dma_length, sizeof(dma_length)); load_param(&dma_type, sizeof(dma_type)); load_param(&dma_src, sizeof(dma_src)); load_param(&cached_write, sizeof(cached_write)); /* restore FIFO byte access flag */ fifo_byte_access = ((code & 0x0F) < 0x03); /* restore current NTSC/PAL mode */ if (system_hw & SYSTEM_MD) { status = (status & ~1) | vdp_pal; } if (reg[1] & 0x04) { /* Mode 5 */ bg_list_index = 0x800; /* reinitialize palette */ color_update_m5(0, *(uint16 *)&cram[border << 1]); for(i = 1; i < 0x40; i++) { color_update_m5(i, *(uint16 *)&cram[i << 1]); } } else { /* Modes 0,1,2,3,4 */ bg_list_index = 0x200; /* reinitialize palette */ for(i = 0; i < 0x20; i ++) { color_update_m4(i, *(uint16 *)&cram[i << 1]); } color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (border & 0x0F)) << 1]); } /* invalidate tile cache */ for (i=0;i VDP 32-cell Active 16 Blanking 167 40-cell Active 18 Blanking 205 VRAM Fill 32-cell Active 15 Blanking 166 40-cell Active 17 Blanking 204 VRAM Copy 32-cell Active 8 Blanking 83 40-cell Active 9 Blanking 102 'Active' is the active display period, 'Blanking' is either the vertical blanking period or when the display is forcibly blanked via register #1. The above transfer counts are all in bytes, unless the destination is CRAM or VSRAM for a 68K > VDP transfer, in which case it is in words. */ unsigned int rate = dma_timing[(status & 8) || !(reg[1] & 0x40)][reg[12] & 1]; /* Adjust for 68k bus DMA to VRAM (one word = 2 access) or DMA Copy (one read + one write = 2 access) */ rate = rate >> (dma_type & 1); /* Remaining DMA cycles */ if (status & 8) { /* Process DMA until the end of VBLANK */ /* NOTE: DMA timings can not change during VBLANK because active display width cannot be modified. */ /* Indeed, writing VDP registers during DMA is either impossible (when doing DMA from 68k bus, CPU */ /* is locked) or will abort DMA operation (in case of DMA Fill or Copy). */ dma_cycles = ((lines_per_frame - bitmap.viewport.h - 1) * MCYCLES_PER_LINE) - cycles; } else { /* Process DMA until the end of current line */ dma_cycles = (mcycles_vdp + MCYCLES_PER_LINE) - cycles; } /* Remaining DMA bytes for that line */ dma_bytes = (dma_cycles * rate) / MCYCLES_PER_LINE; #ifdef LOGVDP error("[%d(%d)][%d(%d)] DMA type %d (%d access/line)(%d cycles left)-> %d access (%d remaining) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE,dma_type, rate, dma_cycles, dma_bytes, dma_length, m68k_get_reg(M68K_REG_PC)); #endif /* Check if DMA can be finished before the end of current line */ if (dma_length < dma_bytes) { /* Adjust remaining DMA bytes */ dma_bytes = dma_length; dma_cycles = (dma_bytes * MCYCLES_PER_LINE) / rate; } /* Update DMA timings */ if (dma_type < 2) { /* 68K is frozen during DMA from 68k bus */ m68k.cycles = cycles + dma_cycles; #ifdef LOGVDP error("-->CPU frozen for %d cycles\n", dma_cycles); #endif } else { /* Set DMA Busy flag */ status |= 0x02; /* 68K is still running, set DMA end cycle */ dma_endCycles = cycles + dma_cycles; #ifdef LOGVDP error("-->DMA ends in %d cycles\n", dma_cycles); #endif } /* Process DMA */ if (dma_bytes) { /* Update DMA length */ dma_length -= dma_bytes; /* Process DMA operation */ dma_func[reg[23] >> 4](dma_bytes); /* Check if DMA is finished */ if (!dma_length) { /* DMA source address registers are incremented during DMA (even DMA Fill) */ uint16 end = reg[21] + (reg[22] << 8) + reg[19] + (reg[20] << 8); reg[21] = end & 0xff; reg[22] = end >> 8; /* DMA length registers are decremented during DMA */ reg[19] = reg[20] = 0; /* perform cached write, if any */ if (cached_write >= 0) { vdp_68k_ctrl_w(cached_write); cached_write = -1; } } } } /*--------------------------------------------------------------------------*/ /* Control port access functions */ /*--------------------------------------------------------------------------*/ void vdp_68k_ctrl_w(unsigned int data) { /* Check pending flag */ if (pending == 0) { /* A single long word write instruction could have started DMA with the first word */ if (dma_length) { /* 68k is frozen during 68k bus DMA */ /* Second word should be written after DMA completion */ /* See Formula One & Kawasaki Superbike Challenge */ if (dma_type < 2) { /* Latch second control word for later */ cached_write = data; return; } } /* Check CD0-CD1 bits */ if ((data & 0xC000) == 0x8000) { /* VDP register write */ vdp_reg_w((data >> 8) & 0x1F, data & 0xFF, m68k.cycles); } else { /* Set pending flag (Mode 5 only) */ pending = reg[1] & 4; } /* Update address and code registers */ addr = addr_latch | (data & 0x3FFF); code = ((code & 0x3C) | ((data >> 14) & 0x03)); } else { /* Clear pending flag */ pending = 0; /* Save address bits A15 and A14 */ addr_latch = (data & 3) << 14; /* Update address and code registers */ addr = addr_latch | (addr & 0x3FFF); code = ((code & 0x03) | ((data >> 2) & 0x3C)); /* Detect DMA operation (CD5 bit set) */ if (code & 0x20) { /* DMA must be enabled */ if (reg[1] & 0x10) { /* DMA type */ switch (reg[23] >> 6) { case 2: { /* DMA Fill */ dma_type = 2; /* DMA is pending until next DATA port write */ dmafill = 1; /* Set DMA Busy flag */ status |= 0x02; /* DMA end cycle is not initialized yet (this prevents DMA Busy flag from being cleared on VDP status read) */ dma_endCycles = 0xffffffff; break; } case 3: { /* DMA Copy */ dma_type = 3; /* DMA length */ dma_length = (reg[20] << 8) | reg[19]; /* Zero DMA length (pre-decrementing counter) */ if (!dma_length) { dma_length = 0x10000; } /* DMA source address */ dma_src = (reg[22] << 8) | reg[21]; /* Trigger DMA */ vdp_dma_update(m68k.cycles); break; } default: { /* DMA from 68k bus */ dma_type = (code & 0x06) ? 0 : 1; /* DMA length */ dma_length = (reg[20] << 8) | reg[19]; /* Zero DMA length (pre-decrementing counter) */ if (!dma_length) { dma_length = 0x10000; } /* DMA source address */ dma_src = (reg[22] << 8) | reg[21]; /* Transfer from SVP ROM/RAM ($000000-$3fffff) or CD Word-RAM ($200000-$3fffff/$600000-$7fffff) */ if (((system_hw == SYSTEM_MCD) && ((reg[23] & 0x70) == ((scd.cartridge.boot >> 1) + 0x10))) || (svp && !(reg[23] & 0x60))) { /* source data is available with one cycle delay, i.e first word written by VDP is */ /* previous data being held on 68k bus at that time, then source words are written */ /* normally to VDP RAM, with only last source word being ignored */ addr += reg[15]; dma_length--; } /* Trigger DMA */ vdp_dma_update(m68k.cycles); break; } } } } } /* FIFO emulation (Chaos Engine/Soldier of Fortune, Double Clutch, Sol Deace) -------------------------------------------------------------------------- Each VRAM access is byte wide, so one VRAM write (word) need two slot access. NOTE: Invalid code 0x02 (register write) should not behave the same as VRAM access, i.e data is ignored and only one access slot is used for each word, BUT a few games ("Clue", "Microcosm") which accidentally corrupt code value will have issues when emulating FIFO timings. They likely work fine on real hardware because of periodical 68k wait-states which have been observed and would naturaly add some delay between writes. Until those wait-states are accurately measured and emulated, delay is forced when invalid code value is being used. */ fifo_byte_access = ((code & 0x0F) <= 0x02); } /* Mega Drive VDP control port specific (MS compatibility mode) */ void vdp_z80_ctrl_w(unsigned int data) { switch (pending) { case 0: { /* Latch LSB */ addr_latch = data; /* Set LSB pending flag */ pending = 1; return; } case 1: { /* Update address and code registers */ addr = (addr & 0xC000) | ((data & 0x3F) << 8) | addr_latch ; code = ((code & 0x3C) | ((data >> 6) & 0x03)); if ((code & 0x03) == 0x02) { /* VDP register write */ vdp_reg_w(data & 0x1F, addr_latch, Z80.cycles); /* Clear pending flag */ pending = 0; return; } /* Set Mode 5 pending flag */ pending = (reg[1] & 4) >> 1; if (!pending && !(code & 0x03)) { /* Process VRAM read */ fifo[0] = vram[addr & 0x3FFF]; /* Increment address register */ addr += (reg[15] + 1); } return; } case 2: { /* Latch LSB */ addr_latch = data; /* Set LSB pending flag */ pending = 3; return; } case 3: { /* Clear pending flag */ pending = 0; /* Update address and code registers */ addr = ((addr_latch & 3) << 14) | (addr & 0x3FFF); code = ((code & 0x03) | ((addr_latch >> 2) & 0x3C)); /* Detect DMA operation (CD5 bit set) */ if (code & 0x20) { /* DMA should be enabled */ if (reg[1] & 0x10) { /* DMA type */ switch (reg[23] >> 6) { case 2: { /* DMA Fill will be triggered by next write to DATA port */ dmafill = 1; /* Set DMA Busy flag */ status |= 0x02; /* DMA end cycle is not initialized yet (this prevents DMA Busy flag from being cleared on VDP status read) */ dma_endCycles = 0xffffffff; break; } case 3: { /* DMA copy */ dma_type = 3; /* DMA length */ dma_length = (reg[20] << 8) | reg[19]; /* Zero DMA length (pre-decrementing counter) */ if (!dma_length) { dma_length = 0x10000; } /* DMA source address */ dma_src = (reg[22] << 8) | reg[21]; /* Trigger DMA */ vdp_dma_update(Z80.cycles); break; } default: { /* DMA from 68k bus does not work when Z80 is in control */ break; } } } } } return; } } /* Master System & Game Gear VDP control port specific */ void vdp_sms_ctrl_w(unsigned int data) { if (pending == 0) { /* Update address register LSB */ addr = (addr & 0x3F00) | (data & 0xFF); /* Latch LSB */ addr_latch = data; /* Set LSB pending flag */ pending = 1; } else { /* Update address and code registers */ code = (data >> 6) & 3; addr = (data << 8 | addr_latch) & 0x3FFF; /* Clear pending flag */ pending = 0; if (code == 0) { /* Process VRAM read */ fifo[0] = vram[addr & 0x3FFF]; /* Increment address register */ addr = (addr + 1) & 0x3FFF; return; } if (code == 2) { /* Save current VDP mode */ int mode, prev = (reg[0] & 0x06) | (reg[1] & 0x18); /* Write VDP register 0-15 */ vdp_reg_w(data & 0x0F, addr_latch, Z80.cycles); /* Check VDP mode changes */ mode = (reg[0] & 0x06) | (reg[1] & 0x18); prev ^= mode; if (prev) { /* Check for extended modes */ if (system_hw > SYSTEM_SMS) { int height; if (mode == 0x0E) /* M1=0,M2=1,M3=1,M4=1 */ { /* Mode 4 extended (240 lines) */ height = 240; /* Update vertical counter max value */ vc_max = vc_table[3][vdp_pal]; } else if (mode == 0x16) /* M1=1,M2=1,M3=0,M4=1 */ { /* Mode 4 extended (224 lines) */ height = 224; /* Update vertical counter max value */ vc_max = vc_table[1][vdp_pal]; } else { /* Mode 4 default (224 lines) */ height = 192; /* Default vertical counter max value */ vc_max = vc_table[0][vdp_pal]; } /* viewport changes should be applied on next frame */ if (height != bitmap.viewport.h) { bitmap.viewport.changed |= 2; } } /* Rendering mode */ render_bg = render_bg_modes[mode>>1]; /* Mode switching */ if (prev & 0x04) { int i; if (mode & 0x04) { /* Mode 4 sprites */ parse_satb = parse_satb_m4; render_obj = render_obj_m4; /* force BG cache update*/ bg_list_index = 0x200; } else { /* TMS-mode sprites */ parse_satb = parse_satb_tms; render_obj = render_obj_tms; /* BG cache is not used */ bg_list_index = 0; } /* reinitialize palette */ for(i = 0; i < 0x20; i ++) { color_update_m4(i, *(uint16 *)&cram[i << 1]); } color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (border & 0x0F)) << 1]); } } } } } /* SG-1000 VDP (TMS99xx) control port specific */ void vdp_tms_ctrl_w(unsigned int data) { if (pending == 0) { /* Latch LSB */ addr_latch = data; /* Set LSB pending flag */ pending = 1; } else { /* Update address and code registers */ code = (data >> 6) & 3; addr = (data << 8 | addr_latch) & 0x3FFF; /* Clear pending flag */ pending = 0; if (code == 0) { /* Process VRAM read */ fifo[0] = vram[addr & 0x3FFF]; /* Increment address register */ addr = (addr + 1) & 0x3FFF; return; } if (code & 2) { /* VDP register index (0-7) */ data &= 0x07; /* Write VDP register */ vdp_reg_w(data, addr_latch, Z80.cycles); /* Check VDP mode changes */ if (data < 2) { /* Rendering mode */ render_bg = render_bg_modes[((reg[0] & 0x02) | (reg[1] & 0x18)) >> 1]; } } } } /* * Status register * * Bits * 0 NTSC(0)/PAL(1) * 1 DMA Busy * 2 During HBlank * 3 During VBlank * 4 0:1 even:odd field (interlaced modes only) * 5 Sprite collision * 6 Too many sprites per line * 7 v interrupt occurred * 8 Write FIFO full * 9 Write FIFO empty * 10 - 15 Open Bus */ unsigned int vdp_68k_ctrl_r(unsigned int cycles) { unsigned int temp; /* Update FIFO status flags if not empty */ if (fifo_write_cnt) { vdp_fifo_update(cycles); } /* Check if DMA Busy flag is set */ if (status & 2) { /* Check if DMA is finished */ if (!dma_length && (cycles >= dma_endCycles)) { /* Clear DMA Busy flag */ status &= 0xFFFD; } } /* Return VDP status */ temp = status; /* Clear pending flag */ pending = 0; /* Clear SOVR & SCOL flags */ status &= 0xFF9F; /* Display OFF: VBLANK flag is set */ if (!(reg[1] & 0x40)) { temp |= 0x08; } /* HBLANK flag (Sonic 3 and Sonic 2 "VS Modes", Lemmings 2, Mega Turrican, V.R Troopers, Gouketsuji Ichizoku,...) */ /* NB: this is not 100% accurate and need to be verified on real hardware */ if ((cycles % MCYCLES_PER_LINE) < 588) { temp |= 0x04; } #ifdef LOGVDP error("[%d(%d)][%d(%d)] VDP 68k status read -> 0x%x (0x%x) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, temp, status, m68k_get_reg(M68K_REG_PC)); #endif return (temp); } unsigned int vdp_z80_ctrl_r(unsigned int cycles) { unsigned int temp; /* Check if DMA busy flag is set (Mega Drive VDP specific) */ if (status & 2) { /* Check if DMA is finished */ if (!dma_length && (cycles >= dma_endCycles)) { /* Clear DMA Busy flag */ status &= 0xFD; } } /* Check if we are already on next line */ if ((cycles - mcycles_vdp) >= MCYCLES_PER_LINE) { /* check vertical position */ if (v_counter == bitmap.viewport.h) { /* update VCounter to indicate VINT flag has been cleared & VINT should not be triggered */ v_counter++; /* cycle-accurate VINT flag (immediately cleared after being read) */ status |= 0x80; } else { /* update line counter */ int line = (v_counter + 1) % lines_per_frame; /* check if we are within active display range */ if ((line < bitmap.viewport.h) && !(work_ram[0x1ffb] & cart.special & HW_3D_GLASSES)) { /* update VCounter to indicate next line has already been rendered */ v_counter = line; /* render next line (cycle-accurate SCOL & SOVR flags) */ render_line(line); } } } /* Return VDP status */ temp = status; /* Clear pending flag */ pending = 0; /* Clear VINT, SOVR & SCOL flags */ status &= 0xFF1F; /* Mega Drive VDP specific */ if (system_hw & SYSTEM_MD) { /* Display OFF: VBLANK flag is set */ if (!(reg[1] & 0x40)) { temp |= 0x08; } /* HBLANK flag */ if ((cycles % MCYCLES_PER_LINE) < 588) { temp |= 0x04; } } else if (reg[0] & 0x04) { /* Mode 4 unused bits (fixes PGA Tour Golf) */ temp |= 0x1F; } /* Cycle-accurate SCOL flag */ if ((temp & 0x20) && (v_counter == (spr_col >> 8))) { if (system_hw & SYSTEM_MD) { /* COL flag is set at HCount 0xFF on MD */ if ((cycles % MCYCLES_PER_LINE) < 105) { status |= 0x20; temp &= ~0x20; } } else { /* COL flag is set at the pixel it occurs */ uint8 hc = hctab[(cycles + SMS_CYCLE_OFFSET + 15) % MCYCLES_PER_LINE]; if ((hc < (spr_col & 0xff)) || (hc > 0xf3)) { status |= 0x20; temp &= ~0x20; } } } /* Clear HINT & VINT pending flags */ hint_pending = vint_pending = 0; /* Clear Z80 interrupt */ Z80.irq_state = CLEAR_LINE; #ifdef LOGVDP error("[%d(%d)][%d(%d)] VDP Z80 status read -> 0x%x (0x%x) (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, temp, status, Z80.pc.w.l); #endif return (temp); } /*--------------------------------------------------------------------------*/ /* HV Counters */ /*--------------------------------------------------------------------------*/ unsigned int vdp_hvc_r(unsigned int cycles) { int vc; unsigned int data = hvc_latch; /* Check if HVC latch is enabled */ if (data) { /* Mode 5: HV counters are frozen (cf. lightgun games, Sunset Riders logo) */ if (reg[1] & 0x04) { #ifdef LOGVDP error("[%d(%d)][%d(%d)] HVC latch read -> 0x%x (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, data & 0xffff, m68k_get_reg(M68K_REG_PC)); #endif /* return latched HVC value */ return (data & 0xffff); } else { /* Mode 4: by default, VCounter runs normally & HCounter is frozen */ data &= 0xff; } } else { /* Cycle-accurate HCounter (Striker, Mickey Mania, Skitchin, Road Rash I,II,III, Sonic 3D Blast...) */ data = hctab[cycles % MCYCLES_PER_LINE]; } /* Cycle-accurate VCounter */ vc = v_counter; if ((cycles - mcycles_vdp) >= MCYCLES_PER_LINE) { vc = (vc + 1) % lines_per_frame; } /* VCounter overflow */ if (vc > vc_max) { vc -= lines_per_frame; } /* Interlaced modes */ if (interlaced) { /* Interlace mode 2 (Sonic the Hedgehog 2, Combat Cars) */ vc <<= im2_flag; /* Replace bit 0 with bit 8 */ vc = (vc & ~1) | ((vc >> 8) & 1); } /* return HCounter in LSB & VCounter in MSB */ data |= ((vc & 0xff) << 8); #ifdef LOGVDP error("[%d(%d)][%d(%d)] HVC read -> 0x%x (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, data, m68k_get_reg(M68K_REG_PC)); #endif return (data); } /*--------------------------------------------------------------------------*/ /* Test registers */ /*--------------------------------------------------------------------------*/ void vdp_test_w(unsigned int data) { #ifdef LOGERROR error("Unused VDP Write 0x%x (%08x)\n", data, m68k_get_reg(M68K_REG_PC)); #endif } /*--------------------------------------------------------------------------*/ /* 68k interrupt handler (TODO: check how interrupts are handled in Mode 4) */ /*--------------------------------------------------------------------------*/ int vdp_68k_irq_ack(int int_level) { #ifdef LOGVDP error("[%d(%d)][%d(%d)] INT Level %d ack (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE,int_level, m68k_get_reg(M68K_REG_PC)); #endif /* VINT has higher priority (Fatal Rewind) */ if (reg[1] & vint_pending) { #ifdef LOGVDP error("---> VINT cleared\n"); #endif /* Clear VINT pending flag */ vint_pending = 0; status &= ~0x80; /* Update IRQ status */ if (reg[0] & hint_pending) { m68k_set_irq(4); } else { m68k_set_irq(0); } } else { #ifdef LOGVDP error("---> HINT cleared\n"); #endif /* Clear HINT pending flag */ hint_pending = 0; /* Update IRQ status */ m68k_set_irq(0); } return M68K_INT_ACK_AUTOVECTOR; } /*--------------------------------------------------------------------------*/ /* VDP registers update function */ /*--------------------------------------------------------------------------*/ static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles) { #ifdef LOGVDP error("[%d(%d)][%d(%d)] VDP register %d write -> 0x%x (%x)\n", v_counter, (v_counter + (cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, cycles, cycles%MCYCLES_PER_LINE, r, d, m68k_get_reg(M68K_REG_PC)); #endif /* VDP registers #11 to #23 cannot be updated in Mode 4 (Captain Planet & Avengers, Bass Master Classic Pro Edition) */ if (!(reg[1] & 4) && (r > 10)) { return; } switch(r) { case 0: /* CTRL #1 */ { /* Look for changed bits */ r = d ^ reg[0]; reg[0] = d; /* Line Interrupt */ if (r & hint_pending) { /* Update IRQ status */ if (reg[1] & vint_pending) { set_irq_line(6); } else if (d & 0x10) { set_irq_line_delay(4); } else { set_irq_line(0); } } /* Palette selection */ if (r & 0x04) { /* Mega Drive VDP only */ if (system_hw & SYSTEM_MD) { /* Reset color palette */ int i; if (reg[1] & 0x04) { /* Mode 5 */ color_update_m5(0x00, *(uint16 *)&cram[border << 1]); for (i = 1; i < 0x40; i++) { color_update_m5(i, *(uint16 *)&cram[i << 1]); } } else { /* Mode 4 */ for (i = 0; i < 0x20; i++) { color_update_m4(i, *(uint16 *)&cram[i << 1]); } color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (border & 0x0F)) << 1]); } } } /* HVC latch (Sunset Riders, Lightgun games) */ if (r & 0x02) { /* Mega Drive VDP only */ if (system_hw & SYSTEM_MD) { /* Mode 5 only */ if (reg[1] & 0x04) { if (d & 0x02) { /* Latch current HVC */ hvc_latch = vdp_hvc_r(cycles) | 0x10000; } else { /* Free-running HVC */ hvc_latch = 0; } } } } break; } case 1: /* CTRL #2 */ { /* Look for changed bits */ r = d ^ reg[1]; reg[1] = d; /* 4K/16K address decoding */ if (r & 0x80) { /* original TMS99xx hardware only (fixes Magical Kid Wiz) */ if (system_hw == SYSTEM_SG) { int i; /* make temporary copy of 16KB VRAM */ memcpy(vram + 0x4000, vram, 0x4000); /* re-arrange 16KB VRAM address decoding */ if (d & 0x80) { /* 4K->16K address decoding */ for (i=0; i<0x4000; i+=2) { *(uint16 *)(vram + ((i & 0x203F) | ((i << 6) & 0x1000) | ((i >> 1) & 0xFC0))) = *(uint16 *)(vram + 0x4000 + i); } } else { /* 16K->4K address decoding */ for (i=0; i<0x4000; i+=2) { *(uint16 *)(vram + ((i & 0x203F) | ((i >> 6) & 0x40) | ((i << 1) & 0x1F80))) = *(uint16 *)(vram + 0x4000 + i); } } } } /* Display status (modified during active display) */ if ((r & 0x40) && (v_counter < bitmap.viewport.h)) { /* Cycle offset vs HBLANK */ int offset = cycles - mcycles_vdp; if (offset <= 860) { /* Sprite rendering is limited if display was disabled during HBLANK (Mickey Mania 3d level, Overdrive Demo) */ if (d & 0x40) { /* NB: This is not 100% accurate. On real hardware, the maximal number of rendered sprites pixels */ /* for the current line (normally 256 or 320 pixels) but also the maximal number of pre-processed */ /* sprites for the next line (normally 64 or 80 sprites) are both reduced depending on the amount */ /* of cycles spent with display disabled. Here we only reduce them by a fixed amount when display */ /* has been reenabled after a specific point within HBLANK. */ if (offset > 360) { max_sprite_pixels = 128; } } /* Redraw entire line (Legend of Galahad, Lemmings 2, Formula One, Kawasaki Super Bike, Deadly Moves,...) */ render_line(v_counter); /* Restore default */ max_sprite_pixels = 256 + ((reg[12] & 1) << 6); } else if (system_hw & SYSTEM_MD) { /* Active pixel offset */ if (reg[12] & 1) { /* dot clock = MCLK / 8 */ offset = ((offset - 860) / 8) + 16; } else { /* dot clock = MCLK / 10 */ offset = ((offset - 860) / 10) + 16; } /* Line is partially blanked (Nigel Mansell's World Championship Racing , Ren & Stimpy Show, ...) */ if (offset < bitmap.viewport.w) { if (d & 0x40) { render_line(v_counter); blank_line(v_counter, 0, offset); } else { blank_line(v_counter, offset, bitmap.viewport.w - offset); } } } } /* Frame Interrupt */ if (r & vint_pending) { /* Update IRQ status */ if (d & 0x20) { set_irq_line_delay(6); } else if (reg[0] & hint_pending) { set_irq_line(4); } else { set_irq_line(0); } } /* Active display height */ if (r & 0x08) { /* Mega Drive VDP only */ if (system_hw & SYSTEM_MD) { /* Mode 5 only */ if (d & 0x04) { /* Changes should be applied on next frame */ bitmap.viewport.changed |= 2; /* Update vertical counter max value */ vc_max = vc_table[(d >> 2) & 3][vdp_pal]; } } } /* Rendering mode */ if (r & 0x04) { /* Mega Drive VDP only */ if (system_hw & SYSTEM_MD) { int i; if (d & 0x04) { /* Mode 5 rendering */ parse_satb = parse_satb_m5; update_bg_pattern_cache = update_bg_pattern_cache_m5; if (im2_flag) { render_bg = (reg[11] & 0x04) ? render_bg_m5_im2_vs : render_bg_m5_im2; render_obj = (reg[12] & 0x08) ? render_obj_m5_im2_ste : render_obj_m5_im2; } else { render_bg = (reg[11] & 0x04) ? render_bg_m5_vs : render_bg_m5; render_obj = (reg[12] & 0x08) ? render_obj_m5_ste : render_obj_m5; } /* Reset color palette */ color_update_m5(0x00, *(uint16 *)&cram[border << 1]); for (i = 1; i < 0x40; i++) { color_update_m5(i, *(uint16 *)&cram[i << 1]); } /* Mode 5 bus access */ vdp_68k_data_w = vdp_68k_data_w_m5; vdp_z80_data_w = vdp_z80_data_w_m5; vdp_68k_data_r = vdp_68k_data_r_m5; vdp_z80_data_r = vdp_z80_data_r_m5; /* Clear HVC latched value */ hvc_latch = 0; /* Check if HVC latch bit is set */ if (reg[0] & 0x02) { /* Latch current HVC */ hvc_latch = vdp_hvc_r(cycles) | 0x10000; } /* max tiles to invalidate */ bg_list_index = 0x800; } else { /* Mode 4 rendering */ parse_satb = parse_satb_m4; update_bg_pattern_cache = update_bg_pattern_cache_m4; render_bg = render_bg_m4; render_obj = render_obj_m4; /* Reset color palette */ for (i = 0; i < 0x20; i++) { color_update_m4(i, *(uint16 *)&cram[i << 1]); } color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (border & 0x0F)) << 1]); /* Mode 4 bus access */ vdp_68k_data_w = vdp_68k_data_w_m4; vdp_z80_data_w = vdp_z80_data_w_m4; vdp_68k_data_r = vdp_68k_data_r_m4; vdp_z80_data_r = vdp_z80_data_r_m4; /* Latch current HVC */ hvc_latch = vdp_hvc_r(cycles) | 0x10000; /* max tiles to invalidate */ bg_list_index = 0x200; } /* Invalidate pattern cache */ for (i=0;i> 2) & 3][vdp_pal]; /* Display height change should be applied on next frame */ bitmap.viewport.changed |= 2; } else { /* No effect (cleared to avoid mode 5 detection elsewhere) */ reg[1] &= ~0x04; } } break; } case 2: /* Plane A Name Table Base */ { reg[2] = d; ntab = (d << 10) & 0xE000; /* Plane A Name Table Base changed during HBLANK */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (cycles <= (mcycles_vdp + 860))) { /* render entire line */ render_line(v_counter); } break; } case 3: /* Window Plane Name Table Base */ { reg[3] = d; if (reg[12] & 0x01) { ntwb = (d << 10) & 0xF000; } else { ntwb = (d << 10) & 0xF800; } /* Window Plane Name Table Base changed during HBLANK */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (cycles <= (mcycles_vdp + 860))) { /* render entire line */ render_line(v_counter); } break; } case 4: /* Plane B Name Table Base */ { reg[4] = d; ntbb = (d << 13) & 0xE000; /* Plane B Name Table Base changed during HBLANK (Adventures of Batman & Robin) */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (cycles <= (mcycles_vdp + 860))) { /* render entire line */ render_line(v_counter); } break; } case 5: /* Sprite Attribute Table Base */ { reg[5] = d; satb = (d << 9) & sat_base_mask; break; } case 7: /* Backdrop color */ { reg[7] = d; /* Check if backdrop color changed */ d &= 0x3F; if (d != border) { /* Update backdrop color */ border = d; /* Reset palette entry */ if (reg[1] & 4) { /* Mode 5 */ color_update_m5(0x00, *(uint16 *)&cram[d << 1]); } else { /* Mode 4 */ color_update_m4(0x40, *(uint16 *)&cram[(0x10 | (d & 0x0F)) << 1]); } /* Backdrop color modified during HBLANK (Road Rash 1,2,3)*/ if ((v_counter < bitmap.viewport.h) && (cycles <= (mcycles_vdp + 860))) { /* remap entire line */ remap_line(v_counter); } } break; } case 8: /* Horizontal Scroll (Mode 4 only) */ { /* H-Scroll is latched at HCount 0xF3, HCount 0xF6 on MD */ /* Line starts at HCount 0xF4, HCount 0xF6 on MD */ if (system_hw < SYSTEM_MD) { cycles = cycles + 15; } /* Check if H-Scroll has already been latched */ if ((cycles - mcycles_vdp) >= MCYCLES_PER_LINE) { /* update line counter */ int line = (v_counter + 1) % lines_per_frame; /* check if we are within active display range */ if ((line < bitmap.viewport.h) && !(work_ram[0x1ffb] & cart.special & HW_3D_GLASSES)) { /* update VCounter to indicate next line has already been rendered */ v_counter = line; /* render next line before updating H-Scroll */ render_line(line); } } reg[8] = d; break; } case 11: /* CTRL #3 */ { reg[11] = d; /* Horizontal scrolling mode */ hscroll_mask = hscroll_mask_table[d & 0x03]; /* Vertical Scrolling mode */ if (d & 0x04) { render_bg = im2_flag ? render_bg_m5_im2_vs : render_bg_m5_vs; } else { render_bg = im2_flag ? render_bg_m5_im2 : render_bg_m5; } break; } case 12: /* CTRL #4 */ { /* Look for changed bits */ r = d ^ reg[12]; reg[12] = d; /* Shadow & Highlight mode */ if (r & 0x08) { /* Reset color palette */ int i; color_update_m5(0x00, *(uint16 *)&cram[border << 1]); for (i = 1; i < 0x40; i++) { color_update_m5(i, *(uint16 *)&cram[i << 1]); } /* Update sprite rendering function */ if (d & 0x08) { render_obj = im2_flag ? render_obj_m5_im2_ste : render_obj_m5_ste; } else { render_obj = im2_flag ? render_obj_m5_im2 : render_obj_m5; } } /* Interlaced modes */ if (r & 0x06) { /* changes should be applied on next frame */ bitmap.viewport.changed |= 2; } /* Active display width */ if (r & 0x01) { if (d & 0x01) { /* Update display-dependant registers */ ntwb = (reg[3] << 10) & 0xF000; satb = (reg[5] << 9) & 0xFC00; sat_base_mask = 0xFC00; sat_addr_mask = 0x03FF; /* Update HC table */ hctab = cycle2hc40; /* Update clipping */ window_clip(reg[17], 1); /* Update active display width & max sprite pixels per line*/ max_sprite_pixels = bitmap.viewport.w = 320; } else { /* Update display-dependant registers */ ntwb = (reg[3] << 10) & 0xF800; satb = (reg[5] << 9) & 0xFE00; sat_base_mask = 0xFE00; sat_addr_mask = 0x01FF; /* Update HC table */ hctab = cycle2hc32; /* Update clipping */ window_clip(reg[17], 0); /* Update active display width & max sprite pixels per line*/ max_sprite_pixels = bitmap.viewport.w = 256; } /* Active display width modified during HBLANK (Bugs Bunny Double Trouble) */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (cycles <= (mcycles_vdp + 860))) { /* Redraw entire line */ render_line(v_counter); } } break; } case 13: /* HScroll Base Address */ { reg[13] = d; hscb = (d << 10) & 0xFC00; break; } case 16: /* Playfield size */ { reg[16] = d; playfield_shift = shift_table[(d & 3)]; playfield_col_mask = col_mask_table[(d & 3)]; playfield_row_mask = row_mask_table[(d >> 4) & 3]; break; } case 17: /* Window/Plane A vertical clipping */ { reg[17] = d; window_clip(d, reg[12] & 1); break; } default: { reg[r] = d; break; } } } /*--------------------------------------------------------------------------*/ /* FIFO emulation (Mega Drive VDP specific) */ /* ---------------------------------------- */ /* */ /* CPU access to VRAM, CRAM & VSRAM is limited during active display: */ /* H32 mode -> 16 access per line */ /* H40 mode -> 18 access per line */ /* */ /* with fixed access slots timings detailled below. */ /* */ /* Each VRAM access is byte wide, so one VRAM write (word) need two slots. */ /* */ /*--------------------------------------------------------------------------*/ static void vdp_fifo_update(unsigned int cycles) { int slots, count = 0; const int *fifo_timing; const int fifo_cycles_h32[16+4] = { 230, 510, 810, 970, 1130, 1450, 1610, 1770, 2090, 2250, 2410, 2730, 2890, 3050, 3350, 3370, MCYCLES_PER_LINE + 230, MCYCLES_PER_LINE + 510, MCYCLES_PER_LINE + 810, MCYCLES_PER_LINE + 970, }; const int fifo_cycles_h40[18+4] = { 352, 820, 948, 1076, 1332, 1460, 1588, 1844, 1972, 2100, 2356, 2484, 2612, 2868, 2996, 3124, 3364, 3380, MCYCLES_PER_LINE + 352, MCYCLES_PER_LINE + 820, MCYCLES_PER_LINE + 948, MCYCLES_PER_LINE + 1076, }; /* number of access slots up to current line */ if (reg[12] & 0x01) { fifo_timing = fifo_cycles_h40; slots = 18 * ((v_counter + 1) % lines_per_frame); } else { fifo_timing = fifo_cycles_h32; slots = 16 * ((v_counter + 1) % lines_per_frame); } /* number of access slots within current line */ cycles -= mcycles_vdp; while (fifo_timing[count] <= cycles) { count++; } /* number of processed FIFO entries since last access */ slots = (slots + count - fifo_slots) >> fifo_byte_access; if (slots > 0) { /* process FIFO entries */ fifo_write_cnt -= slots; /* Clear FIFO full flag */ status &= 0xFEFF; if (fifo_write_cnt <= 0) { /* No more FIFO entries */ fifo_write_cnt = 0; /* Set FIFO empty flag */ status |= 0x200; } /* Update FIFO access slot counter */ fifo_slots += (slots << fifo_byte_access); } /* next FIFO update cycle */ fifo_cycles = mcycles_vdp + fifo_timing[count | fifo_byte_access]; } /*--------------------------------------------------------------------------*/ /* Internal 16-bit data bus access function (Mode 5 only) */ /*--------------------------------------------------------------------------*/ static void vdp_bus_w(unsigned int data) { /* write data to next FIFO entry */ fifo[fifo_idx] = data; /* increment FIFO write pointer */ fifo_idx = (fifo_idx + 1) & 3; /* Check destination code (CD0-CD3) */ switch (code & 0x0F) { case 0x01: /* VRAM */ { /* VRAM address */ int index = addr & 0xFFFE; /* Pointer to VRAM */ uint16 *p = (uint16 *)&vram[index]; /* Byte-swap data if A0 is set */ if (addr & 1) { data = ((data >> 8) | (data << 8)) & 0xFFFF; } /* Intercept writes to Sprite Attribute Table */ if ((index & sat_base_mask) == satb) { /* Update internal SAT */ *(uint16 *) &sat[index & sat_addr_mask] = data; } /* Only write unique data to VRAM */ if (data != *p) { int name; /* Write data to VRAM */ *p = data; /* Update pattern cache */ MARK_BG_DIRTY (index); } #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } case 0x03: /* CRAM */ { /* Pointer to CRAM 9-bit word */ uint16 *p = (uint16 *)&cram[addr & 0x7E]; /* Pack 16-bit bus data (BBB0GGG0RRR0) to 9-bit CRAM data (BBBGGGRRR) */ data = ((data & 0xE00) >> 3) | ((data & 0x0E0) >> 2) | ((data & 0x00E) >> 1); /* Check if CRAM data is being modified */ if (data != *p) { /* CRAM index (64 words) */ int index = (addr >> 1) & 0x3F; /* Write CRAM data */ *p = data; /* Color entry 0 of each palette is never displayed (transparent pixel) */ if (index & 0x0F) { /* Update color palette */ color_update_m5(index, data); } /* Update backdrop color */ if (index == border) { color_update_m5(0x00, data); } /* CRAM modified during HBLANK (Striker, Zero the Kamikaze, etc) */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (m68k.cycles <= (mcycles_vdp + 860))) { /* Remap current line */ remap_line(v_counter); } } #ifdef LOGVDP error("[%d(%d)][%d(%d)] CRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } case 0x05: /* VSRAM */ { *(uint16 *)&vsram[addr & 0x7E] = data; /* 2-cell Vscroll mode */ if (reg[11] & 0x04) { /* VSRAM writes during HBLANK (Adventures of Batman & Robin) */ if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (m68k.cycles <= (mcycles_vdp + 860))) { /* Redraw entire line */ render_line(v_counter); } } #ifdef LOGVDP error("[%d(%d)][%d(%d)] VSRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } default: { /* add some delay until 68k periodical wait-states are accurately emulated ("Clue", "Microcosm") */ m68k.cycles += 2; #ifdef LOGERROR error("[%d(%d)][%d(%d)] Invalid (%d) 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, code, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } } /* Increment address register */ addr += reg[15]; } /*--------------------------------------------------------------------------*/ /* 68k bus interface (Mega Drive VDP only) */ /*--------------------------------------------------------------------------*/ static void vdp_68k_data_w_m4(unsigned int data) { /* Clear pending flag */ pending = 0; /* Restricted VDP writes during active display */ if (!(status & 8) && (reg[1] & 0x40)) { /* Update VDP FIFO */ vdp_fifo_update(m68k.cycles); /* Clear FIFO empty flag */ status &= 0xFDFF; /* up to 4 words can be stored */ if (fifo_write_cnt < 4) { /* Increment FIFO counter */ fifo_write_cnt++; /* Set FIFO full flag if 4 words are stored */ status |= ((fifo_write_cnt & 4) << 6); } else { /* CPU is halted until next FIFO entry processing */ m68k.cycles = fifo_cycles; /* Update FIFO access slot counter */ fifo_slots += (fifo_byte_access + 1); } } /* Check destination code */ if (code & 0x02) { /* CRAM index (32 words) */ int index = addr & 0x1F; /* Pointer to CRAM 9-bit word */ uint16 *p = (uint16 *)&cram[index << 1]; /* Pack 16-bit data (xxx000BBGGRR) to 9-bit CRAM data (xxxBBGGRR) */ data = ((data & 0xE00) >> 3) | (data & 0x3F); /* Check if CRAM data is being modified */ if (data != *p) { /* Write CRAM data */ *p = data; /* Update color palette */ color_update_m4(index, data); /* Update backdrop color */ if (index == (0x10 | (border & 0x0F))) { color_update_m4(0x40, data); } } } else { /* VRAM address (interleaved format) */ int index = ((addr << 1) & 0x3FC) | ((addr & 0x200) >> 8) | (addr & 0x3C00); /* Pointer to VRAM */ uint16 *p = (uint16 *)&vram[index]; /* Byte-swap data if A0 is set */ if (addr & 1) { data = ((data >> 8) | (data << 8)) & 0xFFFF; } /* Only write unique data to VRAM */ if (data != *p) { int name; /* Write data to VRAM */ *p = data; /* Update the pattern cache */ MARK_BG_DIRTY (index); } } /* Increment address register (TODO: check how address is incremented in Mode 4) */ addr += (reg[15] + 1); } static void vdp_68k_data_w_m5(unsigned int data) { /* Clear pending flag */ pending = 0; /* Restricted VDP writes during active display */ if (!(status & 8) && (reg[1] & 0x40)) { /* Update VDP FIFO */ vdp_fifo_update(m68k.cycles); /* Clear FIFO empty flag */ status &= 0xFDFF; /* up to 4 words can be stored */ if (fifo_write_cnt < 4) { /* Increment FIFO counter */ fifo_write_cnt++; /* Set FIFO full flag if 4 words are stored */ status |= ((fifo_write_cnt & 4) << 6); } else { /* CPU is halted until next FIFO entry processing (Chaos Engine / Soldiers of Fortune, Double Clutch, Titan Overdrive Demo) */ m68k.cycles = fifo_cycles; /* Update FIFO access slot counter */ fifo_slots += (fifo_byte_access + 1); } } /* Write data */ vdp_bus_w(data); /* Check if DMA Fill is pending */ if (dmafill) { /* Clear DMA Fill pending flag */ dmafill = 0; /* DMA length */ dma_length = (reg[20] << 8) | reg[19]; /* Zero DMA length (pre-decrementing counter) */ if (!dma_length) { dma_length = 0x10000; } /* Trigger DMA */ vdp_dma_update(m68k.cycles); } } static unsigned int vdp_68k_data_r_m4(void) { /* VRAM address (interleaved format) */ int index = ((addr << 1) & 0x3FC) | ((addr & 0x200) >> 8) | (addr & 0x3C00); /* Clear pending flag */ pending = 0; /* Increment address register (TODO: check how address is incremented in Mode 4) */ addr += (reg[15] + 1); /* Read VRAM data */ return *(uint16 *) &vram[index]; } static unsigned int vdp_68k_data_r_m5(void) { uint16 data = 0; /* Clear pending flag */ pending = 0; /* Check destination code (CD0-CD3) & CD4 */ switch (code & 0x1F) { case 0x00: { /* read two bytes from VRAM */ data = *(uint16 *)&vram[addr & 0xFFFE]; #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x read -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } case 0x04: { /* VSRAM index */ int index = addr & 0x7E; /* Check against VSRAM max size (80 x 11-bits) */ if (index >= 0x50) { /* Wrap to address 0 (TODO: check if still true with Genesis 3 model) */ index = 0; } /* Read 11-bit word from VSRAM */ data = *(uint16 *)&vsram[index] & 0x7FF; /* Unused bits are set using data from next available FIFO entry */ data |= (fifo[fifo_idx] & ~0x7FF); #ifdef LOGVDP error("[%d(%d)][%d(%d)] VSRAM 0x%x read -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } case 0x08: { /* Read 9-bit word from CRAM */ data = *(uint16 *)&cram[addr & 0x7E]; /* Unpack 9-bit CRAM data (BBBGGGRRR) to 16-bit bus data (BBB0GGG0RRR0) */ data = ((data & 0x1C0) << 3) | ((data & 0x038) << 2) | ((data & 0x007) << 1); /* Unused bits are set using data from next available FIFO entry */ data |= (fifo[fifo_idx] & ~0xEEE); #ifdef LOGVDP error("[%d(%d)][%d(%d)] CRAM 0x%x read -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } case 0x0c: /* undocumented 8-bit VRAM read */ { /* Read one byte from VRAM adjacent address */ data = READ_BYTE(vram, addr ^ 1); /* Unused bits are set using data from next available FIFO entry */ data |= (fifo[fifo_idx] & ~0xFF); #ifdef LOGVDP error("[%d(%d)][%d(%d)] 8-bit VRAM 0x%x read -> 0x%x (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, addr, data, m68k_get_reg(M68K_REG_PC)); #endif break; } default: { /* Invalid code value (normally locks VDP, hard reset required) */ #ifdef LOGERROR error("[%d(%d)][%d(%d)] Invalid (%d) 0x%x read (%x)\n", v_counter, (v_counter + (m68k.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, m68k.cycles, m68k.cycles%MCYCLES_PER_LINE, code, addr, m68k_get_reg(M68K_REG_PC)); #endif break; } } /* Increment address register */ addr += reg[15]; /* Return data */ return data; } /*--------------------------------------------------------------------------*/ /* Z80 bus interface (Mega Drive VDP in Master System compatibility mode) */ /*--------------------------------------------------------------------------*/ static void vdp_z80_data_w_m4(unsigned int data) { /* Clear pending flag */ pending = 0; /* Check destination code */ if (code & 0x02) { /* CRAM index (32 words) */ int index = addr & 0x1F; /* Pointer to CRAM word */ uint16 *p = (uint16 *)&cram[index << 1]; /* Check if CRAM data is being modified */ if (data != *p) { /* Write CRAM data */ *p = data; /* Update color palette */ color_update_m4(index, data); /* Update backdrop color */ if (index == (0x10 | (border & 0x0F))) { color_update_m4(0x40, data); } } } else { /* VRAM address */ int index = addr & 0x3FFF; /* Only write unique data to VRAM */ if (data != vram[index]) { int name; /* Write data */ vram[index] = data; /* Update pattern cache */ MARK_BG_DIRTY(index); } } /* Increment address register (TODO: check how address is incremented in Mode 4) */ addr += (reg[15] + 1); } static void vdp_z80_data_w_m5(unsigned int data) { /* Clear pending flag */ pending = 0; /* Push byte into FIFO */ fifo[fifo_idx] = data << 8; fifo_idx = (fifo_idx + 1) & 3; /* Check destination code (CD0-CD3) */ switch (code & 0x0F) { case 0x01: /* VRAM */ { /* VRAM address (write low byte to even address & high byte to odd address) */ int index = addr ^ 1; /* Intercept writes to Sprite Attribute Table */ if ((index & sat_base_mask) == satb) { /* Update internal SAT */ WRITE_BYTE(sat, index & sat_addr_mask, data); } /* Only write unique data to VRAM */ if (data != READ_BYTE(vram, index)) { int name; /* Write data */ WRITE_BYTE(vram, index, data); /* Update pattern cache */ MARK_BG_DIRTY (index); } break; } case 0x03: /* CRAM */ { /* Pointer to CRAM word */ uint16 *p = (uint16 *)&cram[addr & 0x7E]; /* Pack 8-bit value into 9-bit CRAM data */ if (addr & 1) { /* Write high byte (0000BBB0 -> BBBxxxxxx) */ data = (*p & 0x3F) | ((data & 0x0E) << 5); } else { /* Write low byte (GGG0RRR0 -> xxxGGGRRR) */ data = (*p & 0x1C0) | ((data & 0x0E) >> 1)| ((data & 0xE0) >> 2); } /* Check if CRAM data is being modified */ if (data != *p) { /* CRAM index (64 words) */ int index = (addr >> 1) & 0x3F; /* Write CRAM data */ *p = data; /* Color entry 0 of each palette is never displayed (transparent pixel) */ if (index & 0x0F) { /* Update color palette */ color_update_m5(index, data); } /* Update backdrop color */ if (index == border) { color_update_m5(0x00, data); } } break; } case 0x05: /* VSRAM */ { /* Write low byte to even address & high byte to odd address */ WRITE_BYTE(vsram, (addr & 0x7F) ^ 1, data); break; } } /* Increment address register */ addr += reg[15]; /* Check if DMA Fill is pending */ if (dmafill) { /* Clear DMA Fill pending flag */ dmafill = 0; /* DMA length */ dma_length = (reg[20] << 8) | reg[19]; /* Zero DMA length (pre-decrementing counter) */ if (!dma_length) { dma_length = 0x10000; } /* Trigger DMA */ vdp_dma_update(Z80.cycles); } } static unsigned int vdp_z80_data_r_m4(void) { /* Read buffer */ unsigned int data = fifo[0]; /* Clear pending flag */ pending = 0; /* Process next read */ fifo[0] = vram[addr & 0x3FFF]; /* Increment address register (TODO: check how address is incremented with Mega Drive VDP in Mode 4) */ addr += (reg[15] + 1); /* Return data */ return data; } static unsigned int vdp_z80_data_r_m5(void) { unsigned int data = 0; /* Clear pending flag */ pending = 0; /* Check destination code (CD0-CD3) & CD4 */ switch (code & 0x1F) { case 0x00: /* VRAM */ { /* Return low byte from even address & high byte from odd address */ data = READ_BYTE(vram, addr ^ 1); break; } case 0x04: /* VSRAM */ { /* Return low byte from even address & high byte from odd address */ data = READ_BYTE(vsram, (addr & 0x7F) ^ 1); break; } case 0x08: /* CRAM */ { /* Read CRAM data */ data = *(uint16 *)&cram[addr & 0x7E]; /* Unpack 9-bit CRAM data (BBBGGGRRR) to 16-bit data (BBB0GGG0RRR0) */ data = ((data & 0x1C0) << 3) | ((data & 0x038) << 2) | ((data & 0x007) << 1); /* Return low byte from even address & high byte from odd address */ if (addr & 1) { data = data >> 8; } data &= 0xFF; break; } } /* Increment address register */ addr += reg[15]; /* Return data */ return data; } /*-----------------------------------------------------------------------------*/ /* Z80 bus interface (Master System, Game Gear & SG-1000 VDP) */ /*-----------------------------------------------------------------------------*/ static void vdp_z80_data_w_ms(unsigned int data) { /* Clear pending flag */ pending = 0; if (code < 3) { int index; /* Check if we are already on next line */ if ((Z80.cycles - mcycles_vdp) >= MCYCLES_PER_LINE) { /* update line counter */ int line = (v_counter + 1) % lines_per_frame; /* check if we are within active display range */ if ((line < bitmap.viewport.h) && !(work_ram[0x1ffb] & cart.special & HW_3D_GLASSES)) { /* update VCounter to indicate next line has already been rendered */ v_counter = line; /* render next line */ render_line(line); } } /* VRAM address */ index = addr & 0x3FFF; /* VRAM write */ if (data != vram[index]) { int name; vram[index] = data; MARK_BG_DIRTY(index); } #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (Z80.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, Z80.cycles, Z80.cycles%MCYCLES_PER_LINE, index, data, Z80.pc.w.l); #endif } else { /* CRAM address */ int index = addr & 0x1F; /* Pointer to CRAM word */ uint16 *p = (uint16 *)&cram[index << 1]; /* Check if CRAM data is being modified */ if (data != *p) { /* Write CRAM data */ *p = data; /* Update color palette */ color_update_m4(index, data); /* Update backdrop color */ if (index == (0x10 | (border & 0x0F))) { color_update_m4(0x40, data); } } #ifdef LOGVDP error("[%d(%d)][%d(%d)] CRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (Z80.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, Z80.cycles, Z80.cycles%MCYCLES_PER_LINE, addr, data, Z80.pc.w.l); #endif } /* Update read buffer */ fifo[0] = data; /* Update address register */ addr++; } static void vdp_z80_data_w_gg(unsigned int data) { /* Clear pending flag */ pending = 0; if (code < 3) { int index; /* Check if we are already on next line */ if ((Z80.cycles - mcycles_vdp) >= MCYCLES_PER_LINE) { /* update line counter */ int line = (v_counter + 1) % lines_per_frame; /* check if we are within active display range */ if ((line < bitmap.viewport.h) && !(work_ram[0x1ffb] & cart.special & HW_3D_GLASSES)) { /* update VCounter to indicate next line has already been rendered */ v_counter = line; /* render next line */ render_line(line); } } /* VRAM address */ index = addr & 0x3FFF; /* VRAM write */ if (data != vram[index]) { int name; vram[index] = data; MARK_BG_DIRTY(index); } #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (Z80.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, Z80.cycles, Z80.cycles%MCYCLES_PER_LINE, index, data, Z80.pc.w.l); #endif } else { if (addr & 1) { /* Pointer to CRAM word */ uint16 *p = (uint16 *)&cram[addr & 0x3E]; /* 12-bit data word */ data = (data << 8) | cached_write; /* Check if CRAM data is being modified */ if (data != *p) { /* Color index (0-31) */ int index = (addr >> 1) & 0x1F; /* Write CRAM data */ *p = data; /* Update color palette */ color_update_m4(index, data); /* Update backdrop color */ if (index == (0x10 | (border & 0x0F))) { color_update_m4(0x40, data); } } } else { /* Latch LSB */ cached_write = data; } #ifdef LOGVDP error("[%d(%d)][%d(%d)] CRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (Z80.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, Z80.cycles, Z80.cycles%MCYCLES_PER_LINE, addr, data, Z80.pc.w.l); #endif } /* Update read buffer */ fifo[0] = data; /* Update address register */ addr++; } static void vdp_z80_data_w_sg(unsigned int data) { /* VRAM address */ int index = addr & 0x3FFF; /* Clear pending flag */ pending = 0; /* VRAM write */ vram[index] = data; /* Update address register */ addr++; #ifdef LOGVDP error("[%d(%d)][%d(%d)] VRAM 0x%x write -> 0x%x (%x)\n", v_counter, (v_counter + (Z80.cycles - mcycles_vdp)/MCYCLES_PER_LINE)%lines_per_frame, Z80.cycles, Z80.cycles%MCYCLES_PER_LINE, index, data, Z80.pc.w.l); #endif } /*--------------------------------------------------------------------------*/ /* DMA operations (Mega Drive VDP only) */ /*--------------------------------------------------------------------------*/ /* DMA from 68K bus: $000000-$7FFFFF (external area) */ static void vdp_dma_68k_ext(unsigned int length) { uint16 data; /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); do { /* Read data word from 68k bus */ if (m68k.memory_map[source>>16].read16) { data = m68k.memory_map[source>>16].read16(source); } else { data = *(uint16 *)(m68k.memory_map[source>>16].base + (source & 0xFFFF)); } /* Increment source address */ source += 2; /* 128k DMA window */ source = (reg[23] << 17) | (source & 0x1FFFF); /* Write data word to VRAM, CRAM or VSRAM */ vdp_bus_w(data); } while (--length); /* Update DMA source address */ dma_src = (source >> 1) & 0xffff; } /* DMA from 68K bus: $800000-$FFFFFF (internal area) except I/O area */ static void vdp_dma_68k_ram(unsigned int length) { uint16 data; /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); do { /* access Work-RAM by default */ data = *(uint16 *)(work_ram + (source & 0xFFFF)); /* Increment source address */ source += 2; /* 128k DMA window */ source = (reg[23] << 17) | (source & 0x1FFFF); /* Write data word to VRAM, CRAM or VSRAM */ vdp_bus_w(data); } while (--length); /* Update DMA source address */ dma_src = (source >> 1) & 0xffff; } /* DMA from 68K bus: $A00000-$A1FFFF (I/O area) specific */ static void vdp_dma_68k_io(unsigned int length) { uint16 data; /* 68k bus source address */ uint32 source = (reg[23] << 17) | (dma_src << 1); do { /* Z80 area */ if (source <= 0xA0FFFF) { /* Return $FFFF only when the Z80 isn't hogging the Z-bus. (e.g. Z80 isn't reset and 68000 has the bus) */ data = ((zstate ^ 3) ? *(uint16 *)(work_ram + (source & 0xFFFF)) : 0xFFFF); } /* The I/O chip and work RAM try to drive the data bus which results in both values being combined in random ways when read. We return the I/O chip values which seem to have precedence, */ else if (source <= 0xA1001F) { data = io_68k_read((source >> 1) & 0x0F); data = (data << 8 | data); } /* All remaining locations access work RAM */ else { data = *(uint16 *)(work_ram + (source & 0xFFFF)); } /* Increment source address */ source += 2; /* 128k DMA window */ source = (reg[23] << 17) | (source & 0x1FFFF); /* Write data to VRAM, CRAM or VSRAM */ vdp_bus_w(data); } while (--length); /* Update DMA source address */ dma_src = (source >> 1) & 0xffff; } /* VRAM Copy */ static void vdp_dma_copy(unsigned int length) { /* CD4 should be set (CD0-CD3 ignored) otherwise VDP locks (hard reset needed) */ if (code & 0x10) { int name; uint8 data; /* VRAM source address */ uint16 source = dma_src; do { /* Read byte from adjacent VRAM source address */ data = READ_BYTE(vram, source ^ 1); /* Intercept writes to Sprite Attribute Table */ if ((addr & sat_base_mask) == satb) { /* Update internal SAT */ WRITE_BYTE(sat, (addr & sat_addr_mask) ^ 1, data); } /* Write byte to adjacent VRAM destination address */ WRITE_BYTE(vram, addr ^ 1, data); /* Update pattern cache */ MARK_BG_DIRTY(addr); /* Increment VRAM source address */ source++; /* Increment VRAM destination address */ addr += reg[15]; } while (--length); /* Update DMA source address */ dma_src = source; } } /* DMA Fill */ static void vdp_dma_fill(unsigned int length) { /* Check destination code (CD0-CD3) */ switch (code & 0x0F) { case 0x01: /* VRAM */ { int name; /* Get source data from last written FIFO entry */ uint8 data = fifo[(fifo_idx+3)&3] >> 8; do { /* Intercept writes to Sprite Attribute Table */ if ((addr & sat_base_mask) == satb) { /* Update internal SAT */ WRITE_BYTE(sat, (addr & sat_addr_mask) ^ 1, data); } /* Write byte to adjacent VRAM address */ WRITE_BYTE(vram, addr ^ 1, data); /* Update pattern cache */ MARK_BG_DIRTY (addr); /* Increment VRAM address */ addr += reg[15]; } while (--length); break; } case 0x03: /* CRAM */ { /* Get source data from next available FIFO entry */ uint16 data = fifo[fifo_idx]; /* Pack 16-bit bus data (BBB0GGG0RRR0) to 9-bit CRAM data (BBBGGGRRR) */ data = ((data & 0xE00) >> 3) | ((data & 0x0E0) >> 2) | ((data & 0x00E) >> 1); do { /* Pointer to CRAM 9-bit word */ uint16 *p = (uint16 *)&cram[addr & 0x7E]; /* Check if CRAM data is being modified */ if (data != *p) { /* CRAM index (64 words) */ int index = (addr >> 1) & 0x3F; /* Write CRAM data */ *p = data; /* Color entry 0 of each palette is never displayed (transparent pixel) */ if (index & 0x0F) { /* Update color palette */ color_update_m5(index, data); } /* Update backdrop color */ if (index == border) { color_update_m5(0x00, data); } } /* Increment CRAM address */ addr += reg[15]; } while (--length); break; } case 0x05: /* VSRAM */ { /* Get source data from next available FIFO entry */ uint16 data = fifo[fifo_idx]; do { /* Write VSRAM data */ *(uint16 *)&vsram[addr & 0x7E] = data; /* Increment VSRAM address */ addr += reg[15]; } while (--length); break; } default: { /* invalid destination does nothing (Williams Greatest Hits after soft reset) */ /* address is still incremented */ addr += reg[15] * length; } } } gcw0/opk-data/CLASSIC_02.png000664 001750 001750 00000000253 12702465756 016350 0ustar00sergiosergio000000 000000 PNG  IHDR pHYs  ~]IDATxU JA$.UhIyw%] XB*,IL.>dڀuGm~\ KnkX N?y|IENDB`core/cart_hw/eeprom_i2c.h000664 001750 001750 00000004246 12702465756 016502 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * I2C Serial EEPROM (24Cxx) boards * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _EEPROM_I2C_H_ #define _EEPROM_I2C_H_ /* Function prototypes */ extern void eeprom_i2c_init(); #endif core/cart_hw/000700 001750 001750 00000000000 12703321515 014244 5ustar00sergiosergio000000 000000 gcw0/opk-data/MD.png000664 001750 001750 00000065740 12702465756 015302 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATx}]w;-)ɒ׬y9k/>IlVvvm|Ksr4*Al4M_{G)$dJyy[G6 %{E+oᰐ}Ƚylv;omYV;\.`Cng;%neN67c:i5^_Z= SZNẁ rlE 7-No] :#l( ɶ ~Lٟ{V@P[-]P!!\,bΐY1Y1Zrf,z-n=GҪdE=f!T7E!œ59ܤ| Ԍ{\ߧ:ȃh9VBϜ_ȉxi ?Y PBzAv:2L|ߜ+Ca GZ*y<ύsCN,s."1W,| ?"Ala35{uTpŝ:x&W(8HuE/N^%b St[1˜0pdo"O.<`(CAnV1!< ^.`,,@f!q@θdbM,k?Bɯ0x"ߞ7Oy$`uk`R*ˆ{np0Hojf'q )gh986]G'e_qj`!54g؟WRv{ G}UH8pBVk sD20UhP%դ< 3Np7_(:>pq?{7{JjR.x_eM44}Q@&.,S-]-R~0^'-Q#aB0N5$8Ll}}}f0b%۔DXb?E6.,fHb)m3 x6v '.mc޷[|O/ЫJ~%ҖC)U+ n-<ОN'+@/A$ Zޭ4f_f%}hSQ_ϼRyGp":eQW8W;:UD ~m99,xwȎ4 _[)X5"8Ľbpk'C 81䷧b%O<,rͳP[@eiyl?!Ү@?xiy. 'gN:Jùi3pۗs6]t]" g$ NET5ՈfħCFyG-l<[Zpn,"EAWr5jZ3><<<<mƺ9-@ c9[)CAKa73*!+\VJAL Np0"c"J#EVe5,cQPjC"7['|vThZC#˻b={`/PW-6&!Ʀy|>ndx< D*n?W$o3;20v*̐iuC㤼nap{6m8/.9d~AClqBm ]yUQ C\3sDhw`VK.l , [(H:`ǥ`c#э8um6x=|υ&Q?CSatցDA<. PI|+o~Aj_5,޻FsgQbsHR-AicCϪU2Ug|2yk#Xu`AoW h˵Pr REYKG RȐ9{U)e4%v`ĆE`C~؏C}ZtUg;$ZTSs3aa!AQ(ע~zz2]3 W4Sظ# }5{ ^V"Ru[vd ;X~#0sȺsq)k \ʵ!CV Y6v>lY˽o1jq*8n"Nm~IfkR)(Bi2خ+ ehacۄkGE\T{Zm5н(x#i5[ێ=жm u{s! 87!_yR w.sU`$&Dl磝x:py2_vM0Xk&:Lzb0c#t&lTO=NM|0#>EvPLXZdIE7ng0l ,\LtI{{{{yyx|||4H2g;%/twOFF.<%IYZQ9aUF$Y [xsdq/Õ3J23dKؒ U<.@u֚d] w̘$H2nEeeQӵ̌g?ȋ.Nm4oyߘb-C)Vȶl[ pqam0j@F/oKtH1}||}TOHʂL w`# }ܒN }Ex2o!U}r*|x~y^*eY[F7-I2TC0ۢ#].,ڙis[JlhpEl?: 4Wm q[9)O@^b P)@M zW*_ˎe6[&еT6G}~~]OZꕋ<}mz y2q;+yk~G'Cs EsB+br5c!@cˠ˾e$F6ZZ˟;XEfDi|{'?dgըهwwa>]ߒ2sEw1ç<\AN)ԯ d%`Vڛ%[17 UgUvwByےq: ]~"IfǑŞwP$ 7ǪOR;$VyF_7HD~1IXBW4`0t<eu$% f_ZkΆlz\杂m[&jI즌=ȊCmivChv Xp܋ڛ:M."-78?fx$i0wi`BU34Nn/1Bϐ).=TQlm,fzuݔF%nfmYP-rl/7PiFj`kgRZgjLB .ׯ\hNxT{ܞ_Va 2MsjZːD-Y- J3aY$-Vڨ̦xdي3MryEiyj2( 7 y cAeNdC6~Z.2C ,# ,,*]6~{33c# O8l4ҖqUE7Hb^/@g^jVmLĿ%&W&vMqWry~~Øݭ _n 0daȼu[k@ҭ71}Ҵm3L!-~mRӹ_i _&i2<\z` 7a\ʮ(w\4ب%h8x¾hS-,X֡PiPdNG*t(h Iކ;yˇ̔.إڲVWTNbdc,G4;`yTm:[ni^&/ayޗܗ-M民9e6eh'Qℶߜ"P/ގXXc^pJ j>C9$XA/1k^Gf\ZbB&SBI>`u<*(}0+f?}o2X թU( c&L*_.|0^Re,Wp!Eu]QBAqʔ9L͌=7/.86 +Z2-7w58ϙp {a̒-hѐFZI3<&hg|ʳ7-c>my4k9xl W{Ctɐ5dH ؜Hꡞ/<>>>>>7dbG7WZIPƌܜcd/*6 A  3P]؞5`lnQZ#|K)jd5( /$c/|_fɞظѻ>}5B-V 6~. Y#P x;-8(P֪=yX$$+.W_y9k3#~RUdv˚pqfO.ufCN1" B;0p OOO\CB-*HBk"ۡ{o`"h/pI 6ҢhB2ZŮeU{0y՝-$ko`FZ!!V8ϟ?X v 2+Ӑ/ȊޭȎtvNJ*vNј!F}Ⓚ#fl s \ |wo0"ټ6}j! |mkY]Sj۹d ]yKACϫaxCRB-gGBS+귑:97@x<ϟ??<<9C3%m7|}u ghJ{6[\eE^„ Y$֖\x6؞ːNilK=/)Rf/x؅BkK20۹4I#hHʼӗQM~ Ci3%[6ldRV2 o#%Ձ '#.jI邰knkYy)Qui3x">_f[ݤ1jv=UXߴG/}O>0͟}Xt(ۗ)HcB<DeCgUaS|JhBt`djHV*_ЗԪ_)~- izO z6g!}5Ι˜oRiP[ #66*xªVv8vby&O61?b.$9_ܑdZ%0㧅6J‡A Z'Cmy]봼.o7_ 91KR UYW,F}?6.lT1qeWZL`άSjKB_V=Tzqe8PH vYc>SMn̶ :qF0'ӼYXYKEB@F?MbʊdF{r IDAT$/ڦ?A~̜uhK(M8Jeu} { p:sWd;q<+cNԲZ6qIV݅a5?|F1^sLy2]wl|-glx9r8Eі榵ֿ|'yBvi~8b[(%3!j.pȞgㅨB#= -l rw[8-g񫐼p^f7ÄUjaz9!uoOҵ䞽e0O͉Bk^b 1[]od[5DFOd"]#&,pH/O>H-lYmxAsܣO.}׆ 44QEt][X+ ke#ݙk]AOyEE+;BH^?(b>g/Mm=!({g\m5-lW c.Ż̦nųxwJLl\Jy5}N24E'"ypE !Զ 1i Q.B&ԑ4[HY8]\e7$E/]%{ߴb'`-Ni(Y͛?.$_BM[K)CpҜ҆`dR?dNSg3K4H6%BRAwД6USB!nNS%H7DfB_G Fa3% C{HcC)of5l5VeiC\hWQTcKxZCmt %-DQ3YtaV67p>7jA-!tk>/ (uKyլ¼wb5.)&]@q:캂puK$u-" a=e] uJuE3G%a-Z! @e|g{>?Ԟ9K\*k`PpE 5mY°E,qjxODaVKt8kO>-=a*sZZUzݎo{m`.uSݦtYkG: XELԗI2CtUH}3i ׯffoOfc_ƙ҇[F_0-h|fk+q-1[%> J/HCy,<ru_PiYŌJكC"s|]vxZvw>o~+ V3 úT8܀8J==;0 ?|q/p- 3xnѨ*F 8[̸sbxr_q㫔3Ϟ.7#jк״}@OM4ڂ|ȇ-' 2yTuHK[6GRO??R =W޻mw;*-L]W~ȩ## 6(iМ*"|:>\MĦ.adeW7".Iu8MR'j$.ކAWdN!U4hi^oJg>rT7&P⿪̡m>ɶdKbӧ>-bdjWaC<P@ OyP̕8dqddZ""XC\hȢKہW;P,"[Z }d&Wߎtȳ }stxNb167 k7)S@|2']\ oc!<Lc}_{ ݥ؃|ZF:VGB5v4 wHdC>S>6pC9})W&C6Z؝gaU#οJC|o%e+d#L 3e̞R $?ͫ[5@.H#2HWB74q'V! {KO&i 誏nF\gP\VQ3?\S(z&W<¨~?'&Y<4IfW,W"u~ >MFK0 5SXð^{p)nyJG dU pw.U4~?bYߋ4?u&lɾ͟fdԺ Ys<~VkXwivX)X|H m)#DE{'B+8/"Ce8d^Γ@u&cW8qq$,?}Ԝ@Akɇ&϶|#E z9r".,\v1} $3-2!\X/}X+/@oH"ֆ)ugo-('98M >o=^⠸W W異!VO[',9Wy7N_t\uX5 Tla[ޣnjN*bDið]0` Ͼuq" m\U{ F80NDF#R "#DM0" '3gQEիjyY!&qN& =κi#jHq_%)Uo-,eڛɏXL^_E8ſ=4[ٖ.l$Ơ U*J5 (t ;|??`ki&(iI_8K7m՜/wTTcí➹ qUgb5L?4t#'obHha >dƭ0VQvոpZpV<  ٲ[̅ދQE;m}t3^Xq BC"Zڗ//-w /=al #0,=aaV<^QZ.|x'uH~ġGtj.\XiАBnN-/tkl>êz ? yEĸIJ[j080gf%I@V9^5 Ot, `yK Y\yAGT7Rbzy1}*t[=HO"S)0,j[Rx6~ Z,X=='q| b$Htr-' xĞw0Z{MPl[&AQ+3"(we-gBu܌eM4kfK)v/ƥ-,yB6]Z4-K'Zގpos竄z GjyyД{ U@j?>>[wFBTkP]HE5:'~_% xG;wX m&pMCY z&J”.晖`\`㘋,Jq,7KsweE P0MM!3eOp$ZoGMg悠=n5Hr`(D_F5 x/su4;r1[>wWJc} 62Af "2K@,趥RsPB^cnm'("y썠Rc}Cav%x x+%;jÅrSOO˰=YY&0i9 ,S}9xaXzy =+DV\P9)@r-+e.6WzTƊVӨ;SJ#c<0`حLWbT>'hTvIƻ NІpEp294R6Mڶr\-/@E ڏV2#"Rq9\Gy|O@/c(K(( ^&9ԱyB%y. Vl {mmWeՄSM^A?ro|?<xz_ b<3{LzcYFj# \,jx""&g:Vz-g+8cˣ($ٜXTar\de@^{{;4=>>v߿???OV@ʀ y $sMpH2/+GfFA߉aa@r2MV`1hFn4W:{Eɾt(+y x {¿)dYG|t.WDܬu|kt:N'p+lkN k9RVYN'ې.rEX2~SHd綾fS‰ܶT{UpNSEh"M_ y&-M)t]3y"p"ΔV8A]8Ж5R~p8uݖ|lyxxxzzb4d^|2O n3at0lxϩEϷ9=`k fmrtz7bJ02G;: sюY4aɬ& muȂ IJf]Q Y3f?i:z{ƽqb{-0'Nq9#y&8v=~&Ж8po@Y~-ZZ]97!Y"7ߐr%Yrբ$-G(1DE9,ۗIȆWɮZz:sxFC6W懁NIHf1Td13#f3)s1|Ő;:Qf̜=U^HfĂ2+ySb\F6X>Is+i}{c~>-iYbuvn)rooo.y ߲b<yaHF4n ɂ}OpP|9jvy{qqRpٶ4="RǷ,v~Y@`8`Kܣ$ѫ'饝]M))546\BMi^_____M arOz9&01hel{ng9@:TVV -mXo8-ZlgOBx O!h_;!M4ꧻpW` /UKNj¾=gͅ[a6l s*l{3o?RwQ c E\c ˼M2s{a9pW}Li6ls)^1XYbGQ8*ͦ LH@W!aKÇkEa/5{+>(Y8Fq{@) &Q m$O$PNL~5P~d* $3i0¡[8j4d@3i5Z&긳X0BVx@0 H IDATejRfD@RA_z9(Dy&ek___pZ4H\jfn%0Wxb@ :n0%}*C)1熄*]Gh2h0F[+ kJG ~V6IY,V.$(#)g߾ЗvM OЈ,JR_ތ&O\Vle0>b]N91Xɞ~/ۉ$Oqc `!%2}#',8{іZ\ [ix&Gm<PE!^BSo= J!',s@UˁqȢ *8'2y6D65ɋl2Y"Di7p8Ĩ˥[X&?3Ȧ/gb'JJɆgA_AƳ MAt)S!0IMv 2I@9kuWP•pW}7q AwK!fd8feZ$?VE*U"y("ZýE\`[̒N >ږ4_hLo1)%eklRI^b$M :1nǙeDn;CcM/nVN^K_Q`5 y̗=@Ws-Ŵ͓amvk֖yޖ Ec<c8o$ C*|ղu$H [wWfCokͦj}}S8;uuBhe}mRk0gN;RvZnϤDFu8Z6WSƭi;G[8OF9TNu=-Ǡ~p ~)O0/oː-gP;yF8x3}C9zM}* `AMJyg)'*@,ݡ H2Pv U-P0N׼F[mբ+!4s0݈ Bh01iYEhKKߖ- {///^ Ec%26k.7gc+"!ɐl{3Ҩ5d\ Җ>b:~& .\22_"^o`3p`Uzӣ-~SAj{E ~=2͌nefڿ齟N'vFXhM2RΘ7i`ryY \F)lea/9vV[fCmQ OVS >\1gS#WinWmN_:BFlb3JhKJQ/8;C,I{0eb+>/LΙ<=PD})qUq|^G3cBW_{ͤ9[.eWm/ٺ ªS8:6׍nh]"NTbxd\vaf~]nkf1RM8_?&@CFA,;F-& ` }5vPJZO"զrfO${Z-D9dl]cLWsMs޸.\1p/'V<0 }] _$h'Tt˼Q$4٢O\('0Ks|]̘؅fVLtgȏΞ@ ?n)}hb{!۲ǥXתBslT+P[᳢XOEHCLUJ:^'wL2|u9q 4Y db1 bC* i$bɇoeW_5EDt\bN"kKEdBIgg^4[@ 1s/pA+MeW3bJ8r捷lV0#n!VIћm֬rU4UlK\bHmׂ羼!c`ˎkPd`b6Ѽ{f @2 gu9.ΞA ^pUPtb}^6pt̨1<^>lu`e.NɧA+st(8=`g]{[~}31V ӎ/cC9=KC_\In{>IfCjYW7" ^~YʮFr:oe)s_u֨PtF׶uіX `_`g>C_[ȵszhT\-,88';of_:)&@(D=YI0=\Ic8xnK[Og2Zwu J#4i7v;uY =-8r'#ڊvO q)?p ;ދ˥-aݔHAl].WV(w0%})OrbuO YH돪m8 xg6węx;:Rj,U܇CHblB>At'#*W5gjuEUNn m'{yó[&]ܩ`u {:Q.}]T)^[,Gې= B}N&-nRφ@"AWx<,̄ET9c_}]j{wy. jIȰ+D<\-# BbІn ЋNl vGy|!" ]bDlp gPaɑXDS_^^rVG5dC_"m"@ص}q_!75…rxꖲaZ|Z " 2=1@;Mhtآm4nDrZ؇f{x<{v;Ȉs5Qb N >=(I0aW_ ߱ 5 67~yyy}}*ݱZ5zS5\Zz8NrQtK0)ՆXfx>B˂gtWZ~>?<zLfUKKD&f*W,ĸ-bG4m_~ŷ]6 C܏0.YE_"=??[l-!}{pu_M3^#5f.#i^Ng˃Uߢ-XL`\xzm)n'یmXv߿iLmS$g[JU$\)oƆaY Ӂ]YW}P^4bc84M~ Kva/(e6Ϩ\VZ5>,,5' f;BG䁯"Ld)1Ͱli%g1dӇ{#@]4̟m3] #Mt]80>1Ɉ֍lSu|D Kr܇p esy; l~ kuuax2Sxyy0T-2^_Bӓ?v:ܯ܄{5dٕ]WY8-\|!}B%rmP̌THid;EbJm- Vϻ25$#k]1tw鄡4M͊C`c^X7 ӷ~V)M|]WߊO 4O{0,sζkv&$npOk&cW!H޶̆\u@ HIDATo e!@yt=X@ Q#FSϑl;5Ϡzd1I?;I gfldE7!R(mvh_~䶰Jh>}[k4=??ct:69߸ɖO-wwE0,<Wo\|g<=3W >42/hMwcg]6HCa`vJBՍ.K}HIk`ׯ_B~\y#.ۖ_cdlW|,#e"<0-;E}&6!A܊fcRk\isEIs///ndΎbgYײjȲ1q65Wt72]i/3  8G_{^KZ9adcOkk= !4rW\/_unǶ97&%>U,y_OR{3(oN@s4M(еi>Dk>r,&76F|5>o4^.?}#dx5U;)Y=.(QUGxǴFKZ!Zſӯׅpe ?6S 8DY amE} Lmm;*h*ߍvPDV_]_jZQ0ȶܸOG#wOc`mk>¢!س˗/|D*¾v^dMY 4 鼣W; ,xu5j#LEvtJ[W-B[<10 |h<)-`3Nܝvnd x5ѩ_yv$p  }ވ][xhI@ۢsNa\|>9p[bQdO2;Ǭ&o0ԓ8n7c]lh Y6k}8uw !;hakpN~ n\m ʝNBsT!V;gqOHuaCsa- [^Wu)jZhe-5hi *$iS;FvkMhBDf Mp80מ)6U79oCþO٘mڹ ܈=>B.~Ů{vg5&4Ay|z+X!o 3϶kf'p ]czqbR8S13YށϔYIO`u_U63Q=Kү*[k Om7|֫lBFY@8=Q#fl65 >CkwӰ;MFSK0 } u]C39`Z6T年Kg诶,,z5\ ai,vdžNbrF| aHm o+ї\@hGƀe__*(Pg[(,+ѽ1]$15e{7x`}yxAy|?-:Mf-2v_$m4GBr P\zxNGoqM.lyOW2^;5ͻ1Se۰#@'<_.<#:hc1ȽҦ6n_|]D즯{ MDv͚J%b)F%c4k}_޶KVi^0AMW4}ݾk6_5˼:hוqR(ޙA[-Pa5CLW˧ <#ƾ) ݽȤ\1^ba2t[&m<_XmV#Ax5_J =R:-q*~B/_w(9z~eU"WHfڻ[{̴*3 Pm1TB=2>5yd*O7kϟ]ʽoI6F3\M[[2g qw0`O5d &QzX/ZV]č$tEXtAuthorUlead Systems, Inc.>vIENDB`Makefile.libretro000664 001750 001750 00000024617 12702465756 015213 0ustar00sergiosergio000000 000000 DEBUG = 0 LOGSOUND = 0 FRONTEND_SUPPORTS_RGB565 = 1 ifeq ($(platform),) platform = unix ifeq ($(shell uname -a),) platform = win else ifneq ($(findstring MINGW,$(shell uname -a)),) platform = win else ifneq ($(findstring Darwin,$(shell uname -a)),) platform = osx arch = intel ifeq ($(shell uname -p),powerpc) arch = ppc endif else ifneq ($(findstring win,$(shell uname -a)),) platform = win endif endif # system platform system_platform = unix ifeq ($(shell uname -a),) EXE_EXT = .exe system_platform = win else ifneq ($(findstring Darwin,$(shell uname -a)),) system_platform = osx arch = intel ifeq ($(shell uname -p),powerpc) arch = ppc endif else ifneq ($(findstring MINGW,$(shell uname -a)),) system_platform = win endif TARGET_NAME := genesis_plus_gx LIBM := -lm # Unix ifeq ($(platform), unix) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB # Portable Linux else ifeq ($(platform), linux-portable) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC -nostdlib SHARED := -shared -Wl,--version-script=libretro/link.T ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB LIBM := # OS X else ifeq ($(platform), osx) TARGET := $(TARGET_NAME)_libretro.dylib fpic := -fPIC SHARED := -dynamiclib ifeq ($(arch),ppc) ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN else ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN endif PLATFORM_DEFINES := -DHAVE_ZLIB OSXVER = `sw_vers -productVersion | cut -d. -f 2` OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"` fpic += -mmacosx-version-min=10.1 ifndef ($(NOUNIVERSAL)) CFLAGS += $(ARCHFLAGS) LDFLAGS += $(ARCHFLAGS) endif # iOS else ifneq (,$(findstring ios,$(platform))) TARGET := $(TARGET_NAME)_libretro_ios.dylib fpic := -fPIC SHARED := -dynamiclib ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB ifeq ($(IOSSDK),) IOSSDK := $(shell xcrun -sdk iphoneos -show-sdk-path) endif CC = cc -arch armv7 -isysroot $(IOSSDK) ifeq ($(platform),ios9) CC += -miphoneos-version-min=8.0 PLATFORM_DEFINES += -miphoneos-version-min=8.0 else CC += -miphoneos-version-min=5.0 PLATFORM_DEFINES += -miphoneos-version-min=5.0 endif # Theos else ifeq ($(platform), theos_ios) DEPLOYMENT_IOSVERSION = 5.0 TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION) ARCHS = armv7 armv7s TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION) THEOS_BUILD_DIR := objs include $(THEOS)/makefiles/common.mk LIBRARY_NAME = $(TARGET_NAME)_libretro_ios ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB # QNX else ifeq ($(platform), qnx) TARGET := $(TARGET_NAME)_libretro_qnx.so fpic := -fPIC SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB CC = qcc -Vgcc_ntoarmv7le AR = qcc -Vgcc_ntoarmv7le PLATFORM_DEFINES := -D__BLACKBERRY_QNX__ -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp # PS3 else ifeq ($(platform), ps3) TARGET := $(TARGET_NAME)_libretro_ps3.a CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER -DBYTE_ORDER=BIG_ENDIAN STATIC_LINKING = 1 # sncps3 else ifeq ($(platform), sncps3) TARGET := $(TARGET_NAME)_libretro_ps3.a CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER -DBYTE_ORDER=BIG_ENDIAN STATIC_LINKING = 1 # Lightweight PS3 Homebrew SDK else ifeq ($(platform), psl1ght) TARGET := $(TARGET_NAME)_libretro_psl1ght.a$(EXE_EXT) CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT) AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT) PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER STATIC_LINKING = 1 # PSP else ifeq ($(platform), psp1) TARGET := $(TARGET_NAME)_libretro_psp1.a$(EXE_EXT) CC = psp-gcc$(EXE_EXT) AR = psp-ar$(EXE_EXT) ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DPSP CFLAGS += -G0 STATIC_LINKING = 1 # Vita else ifeq ($(platform), vita) TARGET := $(TARGET_NAME)_libretro_vita.a$(EXE_EXT) CC = arm-vita-eabi-gcc$(EXE_EXT) AR = arm-vita-eabi-ar$(EXE_EXT) CFLAGS += -O3 -mfloat-abi=hard -ffast-math -fsingle-precision-constant ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DALT_RENDERER -DHAVE_ALLOCA_H -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DVITA STATIC_LINKING = 1 # CTR (3DS) else ifeq ($(platform), ctr) TARGET := $(TARGET_NAME)_libretro_ctr.a CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT) AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN -DUSE_DYNAMIC_ALLOC PLATFORM_DEFINES := -DARM11 -D_3DS CFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp CFLAGS += -Wall -mword-relocations CFLAGS += -fomit-frame-pointer -ffast-math STATIC_LINKING = 1 # Raspberry Pi 1 else ifeq ($(platform), rpi1) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined PLATFORM_DEFINES := -DHAVE_ZLIB PLATFORM_DEFINES += -DARM11 PLATFORM_DEFINES += -marm -march=armv6j -mfloat-abi=hard -mfpu=vfp -funsafe-math-optimizations ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN CFLAGS += -fomit-frame-pointer -ffast-math CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 # Raspberry Pi 2 else ifeq ($(platform), rpi2) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined PLATFORM_DEFINES := -DHAVE_ZLIB PLATFORM_DEFINES += -DARM PLATFORM_DEFINES += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -funsafe-math-optimizations ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN CFLAGS += -fomit-frame-pointer -ffast-math CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 # Xbox 360 else ifeq ($(platform), xenon) TARGET := $(TARGET_NAME)_libretro_xenon360.a CC = xenon-gcc$(EXE_EXT) AR = xenon-ar$(EXE_EXT) PLATFORM_DEFINES := -D__LIBXENON__ -DALT_RENDER ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN STATIC_LINKING = 1 # Nintendo Game Cube else ifeq ($(platform), ngc) TARGET := $(TARGET_NAME)_libretro_ngc.a CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN PLATFORM_DEFINES := -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float -DALT_RENDER STATIC_LINKING = 1 # Nintendo Wii else ifeq ($(platform), wii) TARGET := $(TARGET_NAME)_libretro_wii.a CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) PLATFORM_DEFINES := -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float -DALT_RENDER ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN STATIC_LINKING = 1 # ARM else ifneq (,$(findstring armv,$(platform))) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB ifneq (,$(findstring cortexa5,$(platform))) PLATFORM_DEFINES += -marm -mcpu=cortex-a5 else ifneq (,$(findstring cortexa8,$(platform))) PLATFORM_DEFINES += -marm -mcpu=cortex-a8 else ifneq (,$(findstring cortexa9,$(platform))) PLATFORM_DEFINES += -marm -mcpu=cortex-a9 else ifneq (,$(findstring cortexa15a7,$(platform))) PLATFORM_DEFINES += -marm -mcpu=cortex-a15.cortex-a7 else PLATFORM_DEFINES += -marm endif ifneq (,$(findstring softfloat,$(platform))) PLATFORM_DEFINES += -mfloat-abi=softfp else ifneq (,$(findstring hardfloat,$(platform))) PLATFORM_DEFINES += -mfloat-abi=hard endif PLATFORM_DEFINES += -DARM # emscripten else ifeq ($(platform), emscripten) TARGET := $(TARGET_NAME)_libretro_emscripten.bc ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DHAVE_ALLOCA_H -DUSE_DYNAMIC_ALLOC -DUSE_MEMORY_H -DBYTE_ORDER=BIG_ENDIAN -DHAVE_ZLIB # GCW0 else ifeq ($(platform), gcw0) TARGET := $(TARGET_NAME)_libretro.so CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++ AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined fpic := -fPIC LDFLAGS += $(PTHREAD_FLAGS) CFLAGS += $(PTHREAD_FLAGS) -DHAVE_MKDIR CFLAGS += -ffast-math -march=mips32 -mtune=mips32r2 -mhard-float # Windows else TARGET := $(TARGET_NAME)_libretro.dll CC = gcc SHARED := -shared -static-libgcc -static-libstdc++ -Wl,--version-script=libretro/link.T -Wl,--no-undefined ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB endif LDFLAGS += $(LIBM) ifeq ($(DEBUG), 1) CFLAGS += -O0 -g else ifeq ($(platform),qnx) CFLAGS += -Os -DNDEBUG else ifeq ($(platform), emscripten) CFLAGS += -O2 -DNDEBUG else CFLAGS += -O3 -DNDEBUG endif CORE_DIR := . TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor LIBRETRO_DIR := $(CORE_DIR)/libretro include $(LIBRETRO_DIR)/Makefile.common OBJECTS := $(SOURCES_C:.c=.o) ifeq ($(LOGSOUND), 1) LIBRETRO_CFLAGS := -DLOGSOUND endif DEFINES := -DUSE_LIBTREMOR CFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) ifeq ($(FRONTEND_SUPPORTS_RGB565), 1) # if you have a new frontend that supports RGB565 BPP_DEFINES = -DUSE_16BPP_RENDERING -DFRONTEND_SUPPORTS_RGB565 else BPP_DEFINES = -DUSE_15BPP_RENDERING endif LIBRETRO_CFLAGS += $(INCFLAGS) LIBRETRO_CFLAGS += $(BPP_DEFINES) \ $(ENDIANNESS_DEFINES) \ $(PLATFORM_DEFINES) \ -D__LIBRETRO__ ifeq ($(platform), qnx) LIBRETRO_CFLAGS += -D__inline__=inline else LIBRETRO_CFLAGS += -DINLINE="static inline" endif ifeq ($(platform), theos_ios) COMMON_FLAGS := $(COMMON_DEFINES) $(INCFLAGS) -I$(THEOS_INCLUDE_PATH) -Wno-error $(LIBRARY_NAME)_CFLAGS += $(CFLAGS) $(LIBRETRO_CFLAGS) $(COMMON_FLAGS) ${LIBRARY_NAME}_FILES = $(SOURCES_C) ${LIBRARY_NAME}_LIBRARIES = m z include $(THEOS_MAKE_PATH)/library.mk else all: $(TARGET) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) $(LIBRETRO_CFLAGS) $(TARGET): $(OBJECTS) ifeq ($(STATIC_LINKING), 1) $(AR) rcs $@ $(OBJECTS) else $(CC) -o $(TARGET) $(fpic) $(OBJECTS) $(LDFLAGS) $(SHARED) endif clean-objs: rm -f $(OBJECTS) clean: rm -f $(OBJECTS) rm -f $(TARGET) .PHONY: clean clean-objs endif core/cart_hw/eeprom_i2c.c000664 001750 001750 00000067002 12702465756 016474 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * I2C serial EEPROM (24Cxx) boards * * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gamepad.h" /* Some notes from 8BitWizard (http://gendev.spritesmind.net/forum/viewtopic.php?t=206): * * Mode 1 (7-bit) - the chip takes a single byte with a 7-bit memory address and a R/W bit (X24C01) * Mode 2 (8-bit) - the chip takes a 7-bit device address and R/W bit followed by an 8-bit memory address; * the device address may contain up to three more memory address bits (24C01 - 24C16). * You can also string eight 24C01, four 24C02, two 24C08, or various combinations, set their address config lines correctly, * and the result appears exactly the same as a 24C16 * Mode 3 (16-bit) - the chip takes a 7-bit device address and R/W bit followed by a 16-bit memory address (24C32 and larger) * */ typedef enum { STAND_BY = 0, WAIT_STOP, GET_DEVICE_ADR, GET_WORD_ADR_7BITS, GET_WORD_ADR_HIGH, GET_WORD_ADR_LOW, WRITE_DATA, READ_DATA } T_I2C_STATE; typedef enum { NO_EEPROM = -1, EEPROM_X24C01, EEPROM_X24C02, EEPROM_24C01, EEPROM_24C02, EEPROM_24C04, EEPROM_24C08, EEPROM_24C16, EEPROM_24C32, EEPROM_24C64, EEPROM_24C65, EEPROM_24C128, EEPROM_24C256, EEPROM_24C512 } T_I2C_TYPE; typedef struct { uint8 address_bits; uint16 size_mask; uint16 pagewrite_mask; } T_I2C_SPEC; static const T_I2C_SPEC i2c_specs[] = { { 7 , 0x7F , 0x03}, { 8 , 0xFF , 0x03}, { 8 , 0x7F , 0x07}, { 8 , 0xFF , 0x07}, { 8 , 0x1FF , 0x0F}, { 8 , 0x3FF , 0x0F}, { 8 , 0x7FF , 0x0F}, {16 , 0xFFF , 0x1F}, {16 , 0x1FFF , 0x1F}, {16 , 0x1FFF , 0x3F}, {16 , 0x3FFF , 0x3F}, {16 , 0x7FFF , 0x3F}, {16 , 0xFFFF , 0x7F} }; typedef struct { char id[16]; uint32 sp; uint16 chk; void (*mapper_init)(void); T_I2C_TYPE eeprom_type; } T_I2C_GAME; static void mapper_i2c_ea_init(void); static void mapper_i2c_sega_init(void); static void mapper_i2c_acclaim_16M_init(void); static void mapper_i2c_acclaim_32M_init(void); static void mapper_i2c_jcart_init(void); static const T_I2C_GAME i2c_database[] = { {"T-50176" , 0 , 0 , mapper_i2c_ea_init , EEPROM_X24C01 }, /* Rings of Power */ {"T-50396" , 0 , 0 , mapper_i2c_ea_init , EEPROM_X24C01 }, /* NHLPA Hockey 93 */ {"T-50446" , 0 , 0 , mapper_i2c_ea_init , EEPROM_X24C01 }, /* John Madden Football 93 */ {"T-50516" , 0 , 0 , mapper_i2c_ea_init , EEPROM_X24C01 }, /* John Madden Football 93 (Championship Ed.) */ {"T-50606" , 0 , 0 , mapper_i2c_ea_init , EEPROM_X24C01 }, /* Bill Walsh College Football (warning: invalid SRAM header !) */ {" T-12046" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Megaman - The Wily Wars (warning: SRAM hack exists !) */ {" T-12053" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Rockman Mega World (warning: SRAM hack exists !) */ {"MK-1215" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Evander 'Real Deal' Holyfield's Boxing */ {"MK-1228" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Greatest Heavyweights of the Ring (U)(E) */ {"G-5538" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Greatest Heavyweights of the Ring (J) */ {"PR-1993" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Greatest Heavyweights of the Ring (Prototype) */ {" G-4060" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Wonderboy in Monster World (warning: SRAM hack exists !) */ {"00001211" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Sports Talk Baseball */ {"00004076" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Honoo no Toukyuuji Dodge Danpei */ {"G-4524" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Ninja Burai Densetsu */ {"00054503" , 0 , 0 , mapper_i2c_sega_init , EEPROM_X24C01 }, /* Game Toshokan */ {"T-81033" , 0 , 0 , mapper_i2c_acclaim_16M_init , EEPROM_X24C02 }, /* NBA Jam (J) */ {"T-081326" , 0 , 0 , mapper_i2c_acclaim_16M_init , EEPROM_X24C02 }, /* NBA Jam (UE) */ {"T-081276" , 0 , 0 , mapper_i2c_acclaim_32M_init , EEPROM_24C02 }, /* NFL Quarterback Club */ {"T-81406" , 0 , 0 , mapper_i2c_acclaim_32M_init , EEPROM_24C04 }, /* NBA Jam TE */ {"T-081586" , 0 , 0 , mapper_i2c_acclaim_32M_init , EEPROM_24C16 }, /* NFL Quarterback Club '96 */ {"T-81476" , 0 , 0 , mapper_i2c_acclaim_32M_init , EEPROM_24C65 }, /* Frank Thomas Big Hurt Baseball */ {"T-81576" , 0 , 0 , mapper_i2c_acclaim_32M_init , EEPROM_24C65 }, /* College Slam */ {"T-120106" , 0 , 0 , mapper_i2c_jcart_init , EEPROM_24C08 }, /* Brian Lara Cricket */ {"00000000" , 0x444e4c44 , 0x168B , mapper_i2c_jcart_init , EEPROM_24C08 }, /* Micro Machines Military */ {"00000000" , 0x444e4c44 , 0x165E , mapper_i2c_jcart_init , EEPROM_24C16 }, /* Micro Machines Turbo Tournament 96 */ {"T-120096" , 0 , 0 , mapper_i2c_jcart_init , EEPROM_24C16 }, /* Micro Machines 2 - Turbo Tournament */ {"T-120146" , 0 , 0 , mapper_i2c_jcart_init , EEPROM_24C65 }, /* Brian Lara Cricket 96 / Shane Warne Cricket */ {"00000000" , 0xfffffffc , 0x168B , mapper_i2c_jcart_init , NO_EEPROM }, /* Super Skidmarks */ {"00000000" , 0xfffffffc , 0x165E , mapper_i2c_jcart_init , NO_EEPROM }, /* Pete Sampras Tennis (Prototype) */ {"T-120066" , 0 , 0 , mapper_i2c_jcart_init , NO_EEPROM }, /* Pete Sampras Tennis */ {"T-123456" , 0 , 0 , mapper_i2c_jcart_init , NO_EEPROM }, /* Pete Sampras Tennis 96 */ {"XXXXXXXX" , 0 , 0xDF39 , mapper_i2c_jcart_init , NO_EEPROM }, /* Pete Sampras Tennis 96 (Prototype ?) */ }; static struct { uint8 sda; /* current SDA line state */ uint8 scl; /* current SCL line state */ uint8 old_sda; /* previous SDA line state */ uint8 old_scl; /* previous SCL line state */ uint8 cycles; /* operation internal cycle (0-9) */ uint8 rw; /* operation type (1:READ, 0:WRITE) */ uint16 device_address; /* device address */ uint16 word_address; /* memory address */ uint8 buffer; /* write buffer */ T_I2C_STATE state; /* current operation state */ T_I2C_SPEC spec; /* EEPROM characteristics */ uint8 scl_in_bit; /* SCL (write) bit position */ uint8 sda_in_bit; /* SDA (write) bit position */ uint8 sda_out_bit; /* SDA (read) bit position */ } eeprom_i2c; /********************************************************************/ /* I2C EEPROM mapper initialization */ /********************************************************************/ void eeprom_i2c_init() { int i = sizeof(i2c_database) / sizeof(T_I2C_GAME) - 1; /* no serial EEPROM found by default */ sram.custom = 0; /* initialize I2C EEPROM state */ memset(&eeprom_i2c, 0, sizeof(eeprom_i2c)); eeprom_i2c.sda = eeprom_i2c.old_sda = 1; eeprom_i2c.scl = eeprom_i2c.old_scl = 1; eeprom_i2c.state = STAND_BY; /* auto-detect games listed in database */ do { /* check game internal id code */ if (strstr(rominfo.product, i2c_database[i].id)) { /* additional check for known SRAM-patched hacks */ if ((i2c_database[i].id[0] == ' ') && ((sram.end - sram.start) > 2)) { break; } /* additional check for Codemasters games */ if (((i2c_database[i].chk == 0) || (i2c_database[i].chk == rominfo.checksum)) && ((i2c_database[i].sp == 0) || (i2c_database[i].sp == READ_WORD_LONG(cart.rom, 0)))) { /* additional check for J-CART games without serial EEPROM */ if (i2c_database[i].eeprom_type > NO_EEPROM) { /* get EEPROM characteristics */ memcpy(&eeprom_i2c.spec, &i2c_specs[i2c_database[i].eeprom_type], sizeof(T_I2C_SPEC)); /* serial EEPROM game found */ sram.on = sram.custom = 1; } /* initialize memory mapping */ i2c_database[i].mapper_init(); break; } } } while (i--); /* for games not present in database, check if ROM header indicates serial EEPROM is used */ if (!sram.custom && sram.detected) { if ((READ_BYTE(cart.rom,0x1b2) == 0xe8) || ((sram.end - sram.start) < 2)) { /* serial EEPROM game found */ sram.custom = 1; /* assume SEGA mapper as default */ memcpy(&eeprom_i2c.spec, &i2c_specs[EEPROM_X24C01], sizeof(T_I2C_SPEC)); mapper_i2c_sega_init(); } } } /********************************************************************/ /* I2C EEPROM internal */ /********************************************************************/ INLINE void Detect_START() { /* detect SDA HIGH to LOW transition while SCL is held HIGH */ if (eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.old_sda && !eeprom_i2c.sda) { /* initialize cycle counter */ eeprom_i2c.cycles = 0; /* initialize sequence */ if (eeprom_i2c.spec.address_bits == 7) { /* get Word Address */ eeprom_i2c.word_address = 0; eeprom_i2c.state = GET_WORD_ADR_7BITS; } else { /* get Device Address */ eeprom_i2c.device_address = 0; eeprom_i2c.state = GET_DEVICE_ADR; } } } } INLINE void Detect_STOP() { /* detect SDA LOW to HIGH transition while SCL is held HIGH */ if (eeprom_i2c.old_scl && eeprom_i2c.scl) { if (!eeprom_i2c.old_sda && eeprom_i2c.sda) { eeprom_i2c.state = STAND_BY; } } } static void eeprom_i2c_update(void) { /* EEPROM current state */ switch (eeprom_i2c.state) { /* Standby Mode */ case STAND_BY: { Detect_START(); break; } /* Suspended Mode */ case WAIT_STOP: { Detect_STOP(); break; } /* Get Word Address (7-bit): Mode 1 (X24C01) only * and R/W bit */ case GET_WORD_ADR_7BITS: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* next sequence */ eeprom_i2c.cycles = 1; eeprom_i2c.state = eeprom_i2c.rw ? READ_DATA : WRITE_DATA; /* clear write buffer */ eeprom_i2c.buffer = 0x00; } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.cycles < 8) { /* latch Word Address bits 6-0 */ eeprom_i2c.word_address |= (eeprom_i2c.sda << (7 - eeprom_i2c.cycles)); } else if (eeprom_i2c.cycles == 8) { /* latch R/W bit */ eeprom_i2c.rw = eeprom_i2c.sda; } } break; } /* Get Device Address (0-3 bits, depending on the array size) : Mode 2 & Mode 3 (24C01 - 24C512) only * or/and Word Address MSB: Mode 2 only (24C04 - 24C16) (0-3 bits, depending on the array size) * and R/W bit */ case GET_DEVICE_ADR: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* shift Device Address bits */ eeprom_i2c.device_address <<= eeprom_i2c.spec.address_bits; /* next sequence */ eeprom_i2c.cycles = 1; if (eeprom_i2c.rw) { eeprom_i2c.state = READ_DATA; } else { eeprom_i2c.word_address = 0; eeprom_i2c.state = (eeprom_i2c.spec.address_bits == 16) ? GET_WORD_ADR_HIGH : GET_WORD_ADR_LOW; } } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if ((eeprom_i2c.cycles > 4) && (eeprom_i2c.cycles < 8)) { /* latch Device Address bits */ eeprom_i2c.device_address |= (eeprom_i2c.sda << (7 - eeprom_i2c.cycles)); } else if (eeprom_i2c.cycles == 8) { /* latch R/W bit */ eeprom_i2c.rw = eeprom_i2c.sda; } } break; } /* Get Word Address MSB (4-8 bits depending on the array size) * Mode 3 only (24C32 - 24C512) */ case GET_WORD_ADR_HIGH: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* next sequence */ eeprom_i2c.cycles = 1; eeprom_i2c.state = GET_WORD_ADR_LOW; } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { if (eeprom_i2c.spec.size_mask < (1 << (16 - eeprom_i2c.cycles))) { /* ignored bit: Device Address bits should be right-shifted */ eeprom_i2c.device_address >>= 1; } else { /* latch Word Address high bits */ eeprom_i2c.word_address |= (eeprom_i2c.sda << (16 - eeprom_i2c.cycles)); } } } break; } /* Get Word Address LSB: 7bits (24C01) or 8bits (24C02-24C512) * MODE-2 and MODE-3 only (24C01 - 24C512) */ case GET_WORD_ADR_LOW: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* next sequence */ eeprom_i2c.cycles = 1; eeprom_i2c.state = WRITE_DATA; /* clear write buffer */ eeprom_i2c.buffer = 0x00; } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { if (eeprom_i2c.spec.size_mask < (1 << (8 - eeprom_i2c.cycles))) { /* ignored bit (24C01): Device Address bits should be right-shifted */ eeprom_i2c.device_address >>= 1; } else { /* latch Word Address low bits */ eeprom_i2c.word_address |= (eeprom_i2c.sda << (8 - eeprom_i2c.cycles)); } } } break; } /* * Read Sequence */ case READ_DATA: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* next read sequence */ eeprom_i2c.cycles = 1; } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.cycles == 9) { /* check if ACK is received */ if (eeprom_i2c.sda) { /* end of read sequence */ eeprom_i2c.state = WAIT_STOP; } else { /* increment Word Address (roll up at maximum array size) */ eeprom_i2c.word_address = (eeprom_i2c.word_address + 1) & eeprom_i2c.spec.size_mask; } } } break; } /* * Write Sequence */ case WRITE_DATA: { Detect_START(); Detect_STOP(); /* look for SCL HIGH to LOW transition */ if (eeprom_i2c.old_scl && !eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* increment cycle counter */ eeprom_i2c.cycles++; } else { /* next write sequence */ eeprom_i2c.cycles = 1; } } /* look for SCL LOW to HIGH transition */ else if (!eeprom_i2c.old_scl && eeprom_i2c.scl) { if (eeprom_i2c.cycles < 9) { /* latch DATA bits 7-0 to write buffer */ eeprom_i2c.buffer |= (eeprom_i2c.sda << (8 - eeprom_i2c.cycles)); } else { /* write back to memory array (max 64kB) */ sram.sram[(eeprom_i2c.device_address | eeprom_i2c.word_address) & 0xffff] = eeprom_i2c.buffer; /* clear write buffer */ eeprom_i2c.buffer = 0; /* increment Word Address (roll over at maximum page size) */ eeprom_i2c.word_address = (eeprom_i2c.word_address & ~eeprom_i2c.spec.pagewrite_mask) | ((eeprom_i2c.word_address + 1) & eeprom_i2c.spec.pagewrite_mask); } } break; } } /* save SCL & SDA previous state */ eeprom_i2c.old_scl = eeprom_i2c.scl; eeprom_i2c.old_sda = eeprom_i2c.sda; } static uint8 eeprom_i2c_out(void) { /* check EEPROM state */ if (eeprom_i2c.state == READ_DATA) { /* READ cycle */ if (eeprom_i2c.cycles < 9) { /* return memory array (max 64kB) DATA bits */ return ((sram.sram[(eeprom_i2c.device_address | eeprom_i2c.word_address) & 0xffff] >> (8 - eeprom_i2c.cycles)) & 1); } } else if (eeprom_i2c.cycles == 9) { /* ACK cycle */ return 0; } /* return latched /SDA input by default */ return eeprom_i2c.sda; } /********************************************************************/ /* Common I2C board memory mapping */ /********************************************************************/ static uint32 mapper_i2c_generic_read8(uint32 address) { /* only use D0-D7 */ if (address & 0x01) { return eeprom_i2c_out() << eeprom_i2c.sda_out_bit; } return m68k_read_bus_8(address); } static uint32 mapper_i2c_generic_read16(uint32 address) { return eeprom_i2c_out() << eeprom_i2c.sda_out_bit; } static void mapper_i2c_generic_write8(uint32 address, uint32 data) { /* only use /LWR */ if (address & 0x01) { eeprom_i2c.sda = (data >> eeprom_i2c.sda_in_bit) & 1; eeprom_i2c.scl = (data >> eeprom_i2c.scl_in_bit) & 1; eeprom_i2c_update(); } else { m68k_unused_8_w(address, data); } } static void mapper_i2c_generic_write16(uint32 address, uint32 data) { eeprom_i2c.sda = (data >> eeprom_i2c.sda_in_bit) & 1; eeprom_i2c.scl = (data >> eeprom_i2c.scl_in_bit) & 1; eeprom_i2c_update(); } /********************************************************************/ /* EA mapper (PWA P10003 & P10004 boards) */ /********************************************************************/ static void mapper_i2c_ea_init(void) { int i; /* serial EEPROM (read/write) mapped to $200000-$3fffff */ for (i=0x20; i<0x40; i++) { m68k.memory_map[i].read8 = mapper_i2c_generic_read8; m68k.memory_map[i].read16 = mapper_i2c_generic_read16; m68k.memory_map[i].write8 = mapper_i2c_generic_write8; m68k.memory_map[i].write16 = mapper_i2c_generic_write16; zbank_memory_map[i].read = mapper_i2c_generic_read8; zbank_memory_map[i].write = mapper_i2c_generic_write8; } /* SCL (in) -> D6 */ /* SDA (in/out) -> D7 */ eeprom_i2c.scl_in_bit = 6; eeprom_i2c.sda_in_bit = 7; eeprom_i2c.sda_out_bit = 7; } /********************************************************************/ /* SEGA mapper (171-5878, 171-6111, 171-6304 & 171-6584 boards) */ /********************************************************************/ static void mapper_i2c_sega_init(void) { int i; /* serial EEPROM (read/write) mapped to $200000-$3fffff */ for (i=0x20; i<0x40; i++) { m68k.memory_map[i].read8 = mapper_i2c_generic_read8; m68k.memory_map[i].read16 = mapper_i2c_generic_read16; m68k.memory_map[i].write8 = mapper_i2c_generic_write8; m68k.memory_map[i].write16 = mapper_i2c_generic_write16; zbank_memory_map[i].read = mapper_i2c_generic_read8; zbank_memory_map[i].write = mapper_i2c_generic_write8; } /* SCL (in) -> D1 */ /* SDA (in/out) -> D0 */ eeprom_i2c.scl_in_bit = 1; eeprom_i2c.sda_in_bit = 0; eeprom_i2c.sda_out_bit = 0; } /********************************************************************/ /* ACCLAIM 16M mapper (P/N 670120 board) */ /********************************************************************/ static void mapper_i2c_acclaim_16M_init(void) { int i; /* serial EEPROM (read/write) mapped to $200000-$3fffff */ for (i=0x20; i<0x40; i++) { /* /LWR & /UWR are unused */ m68k.memory_map[i].read8 = mapper_i2c_generic_read8; m68k.memory_map[i].read16 = mapper_i2c_generic_read16; m68k.memory_map[i].write8 = mapper_i2c_generic_write16; m68k.memory_map[i].write16 = mapper_i2c_generic_write16; zbank_memory_map[i].read = mapper_i2c_generic_read8; zbank_memory_map[i].write = mapper_i2c_generic_write16; } /* SCL (in) & SDA (out) -> D1 */ /* SDA (in) -> D0 */ eeprom_i2c.scl_in_bit = 1; eeprom_i2c.sda_in_bit = 0; eeprom_i2c.sda_out_bit = 1; } /********************************************************************/ /* ACCLAIM 32M mapper (P/N 670125 & 670127 boards with LZ95A53 PAL) */ /********************************************************************/ static void mapper_acclaim_32M_write8(uint32 address, uint32 data) { if (address & 0x01) { /* D0 goes to /SDA when only /LWR is asserted */ eeprom_i2c.sda = data & 1; } else { /* D0 goes to /SCL when only /UWR is asserted */ eeprom_i2c.scl = data & 1; } eeprom_i2c_update(); } static void mapper_acclaim_32M_write16(uint32 address, uint32 data) { int i; /* custom bankshifting when both /LWR and /UWR are asserted */ if (data & 0x01) { /* cartridge ROM (read) mapped to $200000-$2fffff */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; zbank_memory_map[i].read = NULL; } } else { /* serial EEPROM (read) mapped to $200000-$2fffff */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].read8 = mapper_i2c_generic_read8; m68k.memory_map[i].read16 = mapper_i2c_generic_read16; zbank_memory_map[i].read = mapper_i2c_generic_read8; } } } static void mapper_i2c_acclaim_32M_init(void) { int i; /* custom LZ95A53 PAL (write) mapped to $200000-$2fffff */ for (i=0x20; i<0x30; i++) { m68k.memory_map[i].write8 = mapper_acclaim_32M_write8; m68k.memory_map[i].write16 = mapper_acclaim_32M_write16; zbank_memory_map[i].write = mapper_acclaim_32M_write8; } /* SCL (in) & SDA (in/out) -> D0 */ eeprom_i2c.scl_in_bit = 0; eeprom_i2c.sda_in_bit = 0; eeprom_i2c.sda_out_bit = 0; /* cartridge ROM mapping is reinitialized on reset */ cart.hw.bankshift = 1; } /********************************************************************/ /* CODEMASTERS mapper (SRJCV2-1 & SRJCV2-2 boards with 16R4 PAL) */ /********************************************************************/ static uint32 mapper_i2c_jcart_read8(uint32 address) { /* only D7 used for /SDA */ if (address & 0x01) { return ((eeprom_i2c_out() << 7) | (jcart_read(address) & 0x7f)); } return (jcart_read(address) >> 8); } static uint32 mapper_i2c_jcart_read16(uint32 address) { return ((eeprom_i2c_out() << 7) | jcart_read(address)); } static void mapper_i2c_jcart_init(void) { int i; /* check if serial EEPROM is used (support for SRJCV1-1 & SRJCV1-2 boards with only J-CART) */ if (sram.custom) { /* serial EEPROM (write) mapped to $300000-$37ffff */ for (i=0x30; i<0x38; i++) { /* /LWR & /UWR are unused */ m68k.memory_map[i].write8 = mapper_i2c_generic_write16; m68k.memory_map[i].write16 = mapper_i2c_generic_write16; zbank_memory_map[i].write = mapper_i2c_generic_write16; } } /* check if J-CART is used (support for Brian Lara Cricket games without J-CART) */ if (strstr(rominfo.product,"T-120106") || strstr(rominfo.product,"T-120146")) { /* only serial EEPROM (read) mapped to $380000-$3fffff */ for (i=0x38; i<0x40; i++) { m68k.memory_map[i].read8 = mapper_i2c_generic_read8; m68k.memory_map[i].read16 = mapper_i2c_generic_read16; m68k.memory_map[i].write8 = m68k_unused_8_w; m68k.memory_map[i].write16 = m68k_unused_16_w; zbank_memory_map[i].read = mapper_i2c_generic_read8; zbank_memory_map[i].write = m68k_unused_8_w; } } else { /* enable J-CART controllers */ cart.special |= HW_J_CART; /* serial EEPROM (read) & J-CART (read/write) mapped to $380000-$3fffff */ for (i=0x38; i<0x40; i++) { /* /LWR & /UWR are unused */ m68k.memory_map[i].read8 = mapper_i2c_jcart_read8; m68k.memory_map[i].read16 = mapper_i2c_jcart_read16; m68k.memory_map[i].write8 = jcart_write; m68k.memory_map[i].write16 = jcart_write; zbank_memory_map[i].read = mapper_i2c_jcart_read8; zbank_memory_map[i].write = jcart_write; } } /* SCL (in) -> D1 */ /* SDA (in) -> D0 */ /* SDA (out) -> D7 */ eeprom_i2c.scl_in_bit = 1; eeprom_i2c.sda_in_bit = 0; eeprom_i2c.sda_out_bit = 7; } gx/images/Button_digit.png000664 001750 001750 00000003336 12702465756 016751 0ustar00sergiosergio000000 000000 PNG  IHDR((msBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time07/14/10pcVH2IDATxoIǿݓy9q;}@hH"&R)R$i)"]HQЊ +x,+8DVBCP퐝؞~jgdI9Lէ~j.\#׾ݟ?㹫'X+XBk^ i 5Z2_30"Jnz e!c#V 1r; >;OW PJA[7.)}c ~`3x{  H)cZc|"<16w VƭU~x 6 ajj gΜARA&}4 uR0 <$ `1XW 66p#v >Ν;ͧOT-)%D ,7VG1}<A9*VAADR}}}JaBB"DZSO#DkBH)1(IU;1"#ZkH)!8#dD{g͞ %."DQ!8N'h‰RĜ{jq9p5R83PGxP)`. ";^ȡ8p[8pzȳ;Z8 Ⱥδ4v 4/f^T/̐P,r(*1+Lit.+hlh~k49b`:uh%)ʥkCfwѬ< р")6M^zN_)J0 >E|<z|ZkJ]{);38F,%JQ[ `E 2m95Q)×>gz4twٳg']i_63tBgZ133BZ`vwُg?w1;;J(f:}KnfS#8Ӱ?WYkuܙH;\x6MݎtTcmm wAi7{O@V{V7-b<?#[v2 HN٫Ls0yXXX@^dFr{ ܱ=11srΙ>L}痘dtnf9uܻw1D Z(kCGV~]y&,Ss?*VW:P, G m-gSC?:#=Aʏ*vDz Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ---------------------------------------------------------------------------------------- Gamecube & Wii ports are linked with LIBASND library and includes code distributed under the following license: Copyright (c) 2008 Hermes All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------------------- libretro/msvc/000700 001750 001750 00000000000 12703321515 014457 5ustar00sergiosergio000000 000000 core/mem68k.h000664 001750 001750 00000007411 12702465756 014133 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Main 68k bus handlers * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _MEM68K_H_ #define _MEM68K_H_ /* unused areas */ extern unsigned int m68k_read_bus_8(unsigned int address); extern unsigned int m68k_read_bus_16(unsigned int address); extern void m68k_unused_8_w(unsigned int address, unsigned int data); extern void m68k_unused_16_w(unsigned int address, unsigned int data); /* illegal areas */ extern unsigned int m68k_lockup_r_8(unsigned int address); extern unsigned int m68k_lockup_r_16(unsigned int address); extern void m68k_lockup_w_8(unsigned int address, unsigned int data); extern void m68k_lockup_w_16(unsigned int address, unsigned int data); /* Z80 bus */ extern unsigned int z80_read_byte(unsigned int address); extern unsigned int z80_read_word(unsigned int address); extern void z80_write_byte(unsigned int address, unsigned int data); extern void z80_write_word(unsigned int address, unsigned int data); /* I/O & Control registers */ extern unsigned int ctrl_io_read_byte(unsigned int address); extern unsigned int ctrl_io_read_word(unsigned int address); extern void ctrl_io_write_byte(unsigned int address, unsigned int data); extern void ctrl_io_write_word(unsigned int address, unsigned int data); /* VDP */ extern unsigned int vdp_read_byte(unsigned int address); extern unsigned int vdp_read_word(unsigned int address); extern void vdp_write_byte(unsigned int address, unsigned int data); extern void vdp_write_word(unsigned int address, unsigned int data); /* PICO */ extern unsigned int pico_read_byte(unsigned int address); extern unsigned int pico_read_word(unsigned int address); #endif /* _MEM68K_H_ */ gx/images/Overlay_bar.png000664 001750 001750 00000004405 12702465756 016561 0ustar00sergiosergio000000 000000 PNG  IHDRd͌.sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/03/10yQYIDATxKUݖ@%CO`dv`o{xh@~ݪsGP6 "U}tU{ϓu'|=::PU woo߄N{aɵCSUo?gϞ==|b5VsƝt,;ouIw:5a(^l +>SUES"ۧO/ƿ?N>zD&)V"vX1/fwYw:E~iR!V0@`od㻏Ƒc!f)9FbYj>cn2V)u|;N/c& _Ur. NsWUyW,#"8{d2i \$ӟ^rvv9Ájۛn>%aoK8nު*ے%Kw\z.I#k֝Ns;MGvˎk Y/we5'CI%l&CvcD0' Ʉ1aWmKvUΗ+sSbt:wtݶ,LsH3qiLs1REoCvj)p gLIٮJuU_!tn}B"Ya[$R*9rr[4G/b T{E\}z*Ӣ>16)&0xff].base, (address) & 0xffff); } unsigned int m68k_read_bus_16(unsigned int address) { #ifdef LOGERROR error("Unused read16 %08X (%08X)\n", address, m68k_get_reg(M68K_REG_PC)); #endif address = m68k.pc; return *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)); } void m68k_unused_8_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("Unused write8 %08X = %02X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC)); #endif } void m68k_unused_16_w(unsigned int address, unsigned int data) { #ifdef LOGERROR error("Unused write16 %08X = %04X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC)); #endif } /*--------------------------------------------------------------------------*/ /* Illegal areas (cause system to lock-up since !DTACK is not returned) */ /*--------------------------------------------------------------------------*/ void m68k_lockup_w_8 (unsigned int address, unsigned int data) { #ifdef LOGERROR error ("Lockup %08X = %02X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } } void m68k_lockup_w_16 (unsigned int address, unsigned int data) { #ifdef LOGERROR error ("Lockup %08X = %04X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } } unsigned int m68k_lockup_r_8 (unsigned int address) { #ifdef LOGERROR error ("Lockup %08X.b (%08X)\n", address, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } address = m68k.pc | (address & 1); return READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff); } unsigned int m68k_lockup_r_16 (unsigned int address) { #ifdef LOGERROR error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } address = m68k.pc; return *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)); } /*--------------------------------------------------------------------------*/ /* Z80 bus (accessed through I/O chip) */ /*--------------------------------------------------------------------------*/ unsigned int z80_read_byte(unsigned int address) { switch ((address >> 13) & 3) { case 2: /* YM2612 */ { return fm_read(m68k.cycles, address & 3); } case 3: /* Misc */ { /* VDP (through 68k bus) */ if ((address & 0xFF00) == 0x7F00) { return m68k_lockup_r_8(address); } return (m68k_read_bus_8(address) | 0xFF); } default: /* ZRAM */ { return zram[address & 0x1FFF]; } } } unsigned int z80_read_word(unsigned int address) { unsigned int data = z80_read_byte(address); return (data | (data << 8)); } void z80_write_byte(unsigned int address, unsigned int data) { switch ((address >> 13) & 3) { case 2: /* YM2612 */ { fm_write(m68k.cycles, address & 3, data); return; } case 3: { switch ((address >> 8) & 0x7F) { case 0x60: /* Bank register */ { gen_zbank_w(data & 1); return; } case 0x7F: /* VDP */ { m68k_lockup_w_8(address, data); return; } default: { m68k_unused_8_w(address, data); return; } } } default: /* ZRAM */ { zram[address & 0x1FFF] = data; m68k.cycles += 8; /* ZRAM access latency (fixes Pacman 2: New Adventures) */ return; } } } void z80_write_word(unsigned int address, unsigned int data) { z80_write_byte(address, data >> 8); } /*--------------------------------------------------------------------------*/ /* MAIN-CPU polling detection and SUB-CPU synchronization (MEGA CD mode) */ /*--------------------------------------------------------------------------*/ static void m68k_poll_detect(unsigned int reg_mask) { /* detect MAIN-CPU register polling */ if (m68k.poll.detected & reg_mask) { if (m68k.cycles <= m68k.poll.cycle) { if (m68k.pc == m68k.poll.pc) { /* MAIN-CPU polling confirmed ? */ if (m68k.poll.detected & 1) { /* idle MAIN-CPU until register is modified */ m68k.cycles = m68k.cycle_end; m68k.stopped = reg_mask; #ifdef LOG_SCD error("m68k stopped from %d cycles\n", m68k.cycles); #endif } else { /* confirm MAIN-CPU polling */ m68k.poll.detected |= 1; m68k.poll.cycle = m68k.cycles + 840; } } return; } } else { /* set MAIN-CPU register access flag */ m68k.poll.detected = reg_mask; } /* reset MAIN-CPU polling detection */ m68k.poll.cycle = m68k.cycles + 840; m68k.poll.pc = m68k.pc; } static void m68k_poll_sync(unsigned int reg_mask) { /* relative SUB-CPU cycle counter */ unsigned int cycles = (m68k.cycles * SCYCLES_PER_LINE) / MCYCLES_PER_LINE; /* sync SUB-CPU with MAIN-CPU */ if (!s68k.stopped) { s68k_run(cycles); } /* SUB-CPU idle on register polling ? */ if (s68k.stopped & reg_mask) { /* sync SUB-CPU with MAIN-CPU */ s68k.cycles = cycles; /* restart SUB-CPU */ s68k.stopped = 0; #ifdef LOG_SCD error("s68k started from %d cycles\n", cycles); #endif } /* clear CPU register access flags */ s68k.poll.detected &= ~reg_mask; m68k.poll.detected &= ~reg_mask; } /*--------------------------------------------------------------------------*/ /* I/O Control */ /*--------------------------------------------------------------------------*/ unsigned int ctrl_io_read_byte(unsigned int address) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { if (!(address & 0xE0)) { return io_68k_read((address >> 1) & 0x0F); } return m68k_read_bus_8(address); } case 0x11: /* Z80 BUSACK */ { if (!(address & 1)) { /* Unused bits return prefetched bus data (Time Killers) */ address = m68k.pc; /* Check if bus has been requested and is not reseted */ if (zstate == 3) { /* D0 is cleared */ return (READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff) & 0xFE); } /* D0 is set */ return (READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff) | 0x01); } return m68k_read_bus_8(address); } case 0x20: /* MEGA-CD */ { #ifdef LOG_SCD error("[%d][%d]read byte CD register %X (%X)\n", v_counter, m68k.cycles, address, m68k.pc); #endif if (system_hw == SYSTEM_MCD) { /* register index ($A12000-A1203F mirrored up to $A120FF) */ uint8 index = address & 0x3f; /* Memory Mode */ if (index == 0x03) { m68k_poll_detect(1<<0x03); return scd.regs[0x03>>1].byte.l; } /* SUB-CPU communication flags */ if (index == 0x0f) { if (!s68k.stopped) { /* relative SUB-CPU cycle counter */ unsigned int cycles = (m68k.cycles * SCYCLES_PER_LINE) / MCYCLES_PER_LINE; /* sync SUB-CPU with MAIN-CPU (Dracula Unleashed w/ Sega CD Model 2 Boot ROM) */ s68k_run(cycles); } m68k_poll_detect(1<<0x0f); return scd.regs[0x0f>>1].byte.l; } /* default registers */ if (index < 0x30) { /* SUB-CPU communication words */ if (index >= 0x20) { m68k_poll_detect(1 << (index - 0x10)); } /* register LSB */ if (address & 1) { return scd.regs[index >> 1].byte.l; } /* register MSB */ return scd.regs[index >> 1].byte.h; } } return m68k_read_bus_8(address); } case 0x30: /* TIME */ { if (cart.hw.time_r) { unsigned int data = cart.hw.time_r(address); if (address & 1) { return (data & 0xFF); } return (data >> 8); } return m68k_read_bus_8(address); } case 0x41: /* BOOT ROM */ { if ((config.bios & 1) && (address & 1)) { unsigned int data = gen_bankswitch_r() & 1; /* Unused bits return prefetched bus data */ address = m68k.pc; data |= (READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff) & 0xFE); return data; } return m68k_read_bus_8(address); } case 0x10: /* MEMORY MODE */ case 0x12: /* Z80 RESET */ case 0x13: /* unknown */ case 0x40: /* TMSS */ case 0x44: /* RADICA */ case 0x50: /* SVP */ { return m68k_read_bus_8(address); } default: /* Invalid address */ { return m68k_lockup_r_8(address); } } } unsigned int ctrl_io_read_word(unsigned int address) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { if (!(address & 0xE0)) { unsigned int data = io_68k_read((address >> 1) & 0x0F); return (data << 8 | data); } return m68k_read_bus_16(address); } case 0x11: /* Z80 BUSACK */ { /* Unused bits return prefetched bus data (Time Killers) */ address = m68k.pc; /* Check if bus has been requested and is not reseted */ if (zstate == 3) { /* D8 is cleared */ return (*(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)) & 0xFEFF); } /* D8 is set */ return (*(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)) | 0x0100); } case 0x20: /* MEGA-CD */ { #ifdef LOG_SCD error("[%d][%d]read word CD register %X (%X)\n", v_counter, m68k.cycles, address, m68k.pc); #endif if (system_hw == SYSTEM_MCD) { /* register index ($A12000-A1203F mirrored up to $A120FF) */ uint8 index = address & 0x3f; /* Memory Mode */ if (index == 0x02) { m68k_poll_detect(1<<0x03); return scd.regs[0x03>>1].w; } /* CDC host data (word access only ?) */ if (index == 0x08) { return cdc_host_r(); } /* H-INT vector (word access only ?) */ if (index == 0x06) { return *(uint16 *)(m68k.memory_map[scd.cartridge.boot].base + 0x72); } /* Stopwatch counter (word read access only ?) */ if (index == 0x0c) { /* relative SUB-CPU cycle counter */ unsigned int cycles = (m68k.cycles * SCYCLES_PER_LINE) / MCYCLES_PER_LINE; /* cycle-accurate counter value */ return (scd.regs[0x0c>>1].w + ((cycles - scd.stopwatch) / TIMERS_SCYCLES_RATIO)) & 0xfff; } /* default registers */ if (index < 0x30) { /* SUB-CPU communication words */ if (index >= 0x20) { if (!s68k.stopped) { /* relative SUB-CPU cycle counter */ unsigned int cycles = (m68k.cycles * SCYCLES_PER_LINE) / MCYCLES_PER_LINE; /* sync SUB-CPU with MAIN-CPU (Soul Star) */ s68k_run(cycles); } m68k_poll_detect(3 << (index - 0x10)); } return scd.regs[index >> 1].w; } } /* invalid address */ return m68k_read_bus_16(address); } case 0x30: /* TIME */ { if (cart.hw.time_r) { return cart.hw.time_r(address); } return m68k_read_bus_16(address); } case 0x50: /* SVP */ { if ((address & 0xFD) == 0) { return svp->ssp1601.gr[SSP_XST].byte.h; } if ((address & 0xFF) == 4) { unsigned int data = svp->ssp1601.gr[SSP_PM0].byte.h; svp->ssp1601.gr[SSP_PM0].byte.h &= ~1; return data; } return m68k_read_bus_16(address); } case 0x10: /* MEMORY MODE */ case 0x12: /* Z80 RESET */ case 0x13: /* unknown */ case 0x40: /* TMSS */ case 0x41: /* BOOT ROM */ case 0x44: /* RADICA */ { return m68k_read_bus_16(address); } default: /* Invalid address */ { return m68k_lockup_r_16(address); } } } void ctrl_io_write_byte(unsigned int address, unsigned int data) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { if ((address & 0xE1) == 0x01) { /* get /LWR only */ io_68k_write((address >> 1) & 0x0F, data); return; } m68k_unused_8_w(address, data); return; } case 0x11: /* Z80 BUSREQ */ { if (!(address & 1)) { gen_zbusreq_w(data & 1, m68k.cycles); return; } m68k_unused_8_w(address, data); return; } case 0x12: /* Z80 RESET */ { if (!(address & 1)) { gen_zreset_w(data & 1, m68k.cycles); return; } m68k_unused_8_w(address, data); return; } case 0x20: /* MEGA-CD */ { #ifdef LOG_SCD error("[%d][%d]write byte CD register %X -> 0x%02X (%X)\n", v_counter, m68k.cycles, address, data, m68k.pc); #endif if (system_hw == SYSTEM_MCD) { /* register index ($A12000-A1203F mirrored up to $A120FF) */ switch (address & 0x3f) { case 0x00: /* SUB-CPU interrupt */ { /* IFL2 bit */ if (data & 0x01) { /* level 2 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x04) { if (!s68k.stopped) { /* relative SUB-CPU cycle counter */ unsigned int cycles = (m68k.cycles * SCYCLES_PER_LINE) / MCYCLES_PER_LINE; /* sync SUB-CPU with MAIN-CPU (Earnest Evans, Fhey Area) */ s68k_run(cycles); } /* set IFL2 flag */ scd.regs[0x00].byte.h |= 0x01; /* trigger level 2 interrupt */ scd.pending |= (1 << 2); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* writing 0 does nothing */ return; } case 0x01: /* SUB-CPU control */ { unsigned int halted = s68k.stopped; /* RESET bit */ if (data & 0x01) { /* trigger reset on 0->1 transition */ if (!(scd.regs[0x00].byte.l & 0x01)) { /* reset SUB-CPU */ s68k_pulse_reset(); } /* BUSREQ bit */ if (data & 0x02) { /* SUB-CPU bus requested */ s68k_pulse_halt(); } else { /* SUB-CPU bus released */ s68k_clear_halt(); } } else { /* SUB-CPU is halted while !RESET is asserted */ s68k_pulse_halt(); } /* check if SUB-CPU halt status has changed */ if (s68k.stopped != halted) { /* PRG-RAM (128KB bank) is normally mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ unsigned int base = scd.cartridge.boot + 0x02; /* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */ if ((data & 0x03) != 0x01) { m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = NULL; m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = NULL; m68k.memory_map[base].write8 = m68k.memory_map[base+1].write8 = NULL; m68k.memory_map[base].write16 = m68k.memory_map[base+1].write16 = NULL; zbank_memory_map[base].read = zbank_memory_map[base+1].read = NULL; zbank_memory_map[base].write = zbank_memory_map[base+1].write = NULL; } else { m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = m68k_read_bus_8; m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = m68k_read_bus_16; m68k.memory_map[base].write8 = m68k.memory_map[base+1].write8 = m68k_unused_8_w; m68k.memory_map[base].write16 = m68k.memory_map[base+1].write16 = m68k_unused_16_w; zbank_memory_map[base].read = zbank_memory_map[base+1].read = zbank_unused_r; zbank_memory_map[base].write = zbank_memory_map[base+1].write = zbank_unused_w; } } scd.regs[0x00].byte.l = data; return; } case 0x02: /* PRG-RAM Write Protection */ { scd.regs[0x02>>1].byte.h = data; return; } case 0x03: /* Memory mode */ { m68k_poll_sync(1<<0x03); /* PRG-RAM 128k bank mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ m68k.memory_map[scd.cartridge.boot + 0x02].base = scd.prg_ram + ((data & 0xc0) << 11); m68k.memory_map[scd.cartridge.boot + 0x03].base = m68k.memory_map[scd.cartridge.boot + 0x02].base + 0x10000; /* check current mode */ if (scd.regs[0x03>>1].byte.l & 0x04) { /* DMNA bit */ if (data & 0x02) { /* writing 1 to DMNA in 1M mode will return Word-RAM to SUB-CPU in 2M mode */ scd.dmna = 1; } else { /* writing 0 to DMNA in 1M mode actually set DMNA bit */ data |= 0x02; /* update BK0-1 & DMNA bits */ scd.regs[0x03>>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0xc2) | (data & 0xc2); return; } } else { /* writing 0 in 2M mode does nothing */ if (data & 0x02) { /* Word-RAM is assigned to SUB-CPU */ scd.dmna = 1; /* clear RET bit */ scd.regs[0x03>>1].byte.l = (scd.regs[0x03>>1].byte.l & ~0xc3) | (data & 0xc2); return; } } /* update BK0-1 bits */ scd.regs[0x03>>1].byte.l = (scd.regs[0x02>>1].byte.l & ~0xc0) | (data & 0xc0); return; } case 0x0e: /* MAIN-CPU communication flags */ case 0x0f: /* !LWR is ignored (Space Ace, Dragon's Lair) */ { m68k_poll_sync(1<<0x0e); scd.regs[0x0e>>1].byte.h = data; return; } default: { /* MAIN-CPU communication words */ if ((address & 0x30) == 0x10) { m68k_poll_sync(1 << (address & 0x1f)); /* register LSB */ if (address & 1) { scd.regs[(address >> 1) & 0xff].byte.l = data; return; } /* register MSB */ scd.regs[(address >> 1) & 0xff].byte.h = data; return; } /* invalid address */ m68k_unused_8_w(address, data); return; } } } m68k_unused_8_w(address, data); return; } case 0x30: /* TIME */ { cart.hw.time_w(address, data); return; } case 0x41: /* BOOT ROM */ { if ((config.bios & 1) && (address & 1)) { gen_bankswitch_w(data & 1); return; } m68k_unused_8_w(address, data); return; } case 0x10: /* MEMORY MODE */ case 0x13: /* unknown */ case 0x40: /* TMSS */ case 0x44: /* RADICA */ case 0x50: /* SVP */ { m68k_unused_8_w(address, data); return; } default: /* Invalid address */ { m68k_lockup_w_8(address, data); return; } } } void ctrl_io_write_word(unsigned int address, unsigned int data) { switch ((address >> 8) & 0xFF) { case 0x00: /* I/O chip */ { if (!(address & 0xE0)) { io_68k_write((address >> 1) & 0x0F, data & 0xFF); return; } m68k_unused_16_w(address, data); return; } case 0x11: /* Z80 BUSREQ */ { gen_zbusreq_w((data >> 8) & 1, m68k.cycles); return; } case 0x12: /* Z80 RESET */ { gen_zreset_w((data >> 8) & 1, m68k.cycles); return; } case 0x20: /* MEGA-CD */ { #ifdef LOG_SCD error("[%d][%d]write word CD register %X -> 0x%04X (%X)\n", v_counter, m68k.cycles, address, data, m68k.pc); #endif if (system_hw == SYSTEM_MCD) { /* register index ($A12000-A1203F mirrored up to $A120FF) */ switch (address & 0x3e) { case 0x00: /* SUB-CPU interrupt & control */ { unsigned int halted = s68k.stopped; /* RESET bit */ if (data & 0x01) { /* trigger reset on 0->1 transition */ if (!(scd.regs[0x00].byte.l & 0x01)) { /* reset SUB-CPU */ s68k_pulse_reset(); } /* BUSREQ bit */ if (data & 0x02) { /* SUB-CPU bus requested */ s68k_pulse_halt(); } else { /* SUB-CPU bus released */ s68k_clear_halt(); } } else { /* SUB-CPU is halted while !RESET is asserted */ s68k_pulse_halt(); } /* check if SUB-CPU halt status has changed */ if (s68k.stopped != halted) { /* PRG-RAM (128KB bank) is normally mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ unsigned int base = scd.cartridge.boot + 0x02; /* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */ if ((data & 0x03) != 0x01) { m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = NULL; m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = NULL; m68k.memory_map[base].write8 = m68k.memory_map[base+1].write8 = NULL; m68k.memory_map[base].write16 = m68k.memory_map[base+1].write16 = NULL; zbank_memory_map[base].read = zbank_memory_map[base+1].read = NULL; zbank_memory_map[base].write = zbank_memory_map[base+1].write = NULL; } else { m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = m68k_read_bus_8; m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = m68k_read_bus_16; m68k.memory_map[base].write8 = m68k.memory_map[base+1].write8 = m68k_unused_8_w; m68k.memory_map[base].write16 = m68k.memory_map[base+1].write16 = m68k_unused_16_w; zbank_memory_map[base].read = zbank_memory_map[base+1].read = zbank_unused_r; zbank_memory_map[base].write = zbank_memory_map[base+1].write = zbank_unused_w; } } /* IFL2 bit */ if (data & 0x100) { /* level 2 interrupt enabled ? */ if (scd.regs[0x32>>1].byte.l & 0x04) { /* set IFL2 flag */ scd.regs[0x00].byte.h |= 0x01; /* trigger level 2 interrupt */ scd.pending |= (1 << 2); /* update IRQ level */ s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1); } } /* update LSB only */ scd.regs[0x00].byte.l = data & 0xff; return; } case 0x02: /* Memory Mode */ { m68k_poll_sync(1<<0x03); /* PRG-RAM 128k bank mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */ m68k.memory_map[scd.cartridge.boot + 0x02].base = scd.prg_ram + ((data & 0xc0) << 11); m68k.memory_map[scd.cartridge.boot + 0x03].base = m68k.memory_map[scd.cartridge.boot + 0x02].base + 0x10000; /* check current mode */ if (scd.regs[0x03>>1].byte.l & 0x04) { /* DMNA bit */ if (data & 0x02) { /* writing 1 to DMNA in 1M mode will return Word-RAM to SUB-CPU in 2M mode */ scd.dmna = 1; } else { /* writing 0 to DMNA in 1M mode actually set DMNA bit */ data |= 0x02; /* update WP0-7, BK0-1 & DMNA bits */ scd.regs[0x02>>1].w = (scd.regs[0x02>>1].w & ~0xffc2) | (data & 0xffc2); return; } } else { /* writing 0 in 2M mode does nothing */ if (data & 0x02) { /* Word-RAM is assigned to SUB-CPU */ scd.dmna = 1; /* clear RET bit */ scd.regs[0x02>>1].w = (scd.regs[0x02>>1].w & ~0xffc3) | (data & 0xffc2); return; } } /* update WP0-7 & BK0-1 bits */ scd.regs[0x02>>1].w = (scd.regs[0x02>>1].w & ~0xffc0) | (data & 0xffc0); return; } case 0x06: /* H-INT vector (word access only ?) */ { *(uint16 *)(m68k.memory_map[scd.cartridge.boot].base + 0x72) = data; return; } case 0x0e: /* CPU communication flags */ { m68k_poll_sync(1<<0x0e); /* D8-D15 ignored -> only MAIN-CPU flags are updated (Mortal Kombat) */ scd.regs[0x0e>>1].byte.h = data & 0xff; return; } default: { /* MAIN-CPU communication words */ if ((address & 0x30) == 0x10) { m68k_poll_sync(3 << (address & 0x1e)); scd.regs[(address >> 1) & 0xff].w = data; return; } /* invalid address */ m68k_unused_16_w (address, data); return; } } } m68k_unused_16_w (address, data); return; } case 0x30: /* TIME */ { cart.hw.time_w(address, data); return; } case 0x40: /* TMSS */ { if (config.bios & 1) { gen_tmss_w(address & 3, data); return; } m68k_unused_16_w(address, data); return; } case 0x50: /* SVP */ { if (!(address & 0xFD)) { svp->ssp1601.gr[SSP_XST].byte.h = data; svp->ssp1601.gr[SSP_PM0].byte.h |= 2; svp->ssp1601.emu_status &= ~SSP_WAIT_PM0; return; } m68k_unused_16_w(address, data); return; } case 0x10: /* MEMORY MODE */ case 0x13: /* unknown */ case 0x41: /* BOOT ROM */ case 0x44: /* RADICA */ { m68k_unused_16_w (address, data); return; } default: /* Invalid address */ { m68k_lockup_w_16 (address, data); return; } } } /*--------------------------------------------------------------------------*/ /* VDP */ /*--------------------------------------------------------------------------*/ unsigned int vdp_read_byte(unsigned int address) { switch (address & 0xFD) { case 0x00: /* DATA */ { return (vdp_68k_data_r() >> 8); } case 0x01: /* DATA */ { return (vdp_68k_data_r() & 0xFF); } case 0x04: /* CTRL */ { unsigned int data = (vdp_68k_ctrl_r(m68k.cycles) >> 8) & 3; /* Unused bits return prefetched bus data */ address = m68k.pc; data |= (READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff) & 0xFC); return data; } case 0x05: /* CTRL */ { return (vdp_68k_ctrl_r(m68k.cycles) & 0xFF); } case 0x08: /* HVC */ case 0x0C: { return (vdp_hvc_r(m68k.cycles) >> 8); } case 0x09: /* HVC */ case 0x0D: { return (vdp_hvc_r(m68k.cycles) & 0xFF); } case 0x18: /* Unused */ case 0x19: case 0x1C: case 0x1D: { return m68k_read_bus_8(address); } default: /* Invalid address */ { return m68k_lockup_r_8(address); } } } unsigned int vdp_read_word(unsigned int address) { switch (address & 0xFC) { case 0x00: /* DATA */ { return vdp_68k_data_r(); } case 0x04: /* CTRL */ { unsigned int data = vdp_68k_ctrl_r(m68k.cycles) & 0x3FF; /* Unused bits return prefetched bus data */ address = m68k.pc; data |= (*(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)) & 0xFC00); return data; } case 0x08: /* HVC */ case 0x0C: { return vdp_hvc_r(m68k.cycles); } case 0x18: /* Unused */ case 0x1C: { return m68k_read_bus_16(address); } default: /* Invalid address */ { return m68k_lockup_r_16(address); } } } void vdp_write_byte(unsigned int address, unsigned int data) { switch (address & 0xFC) { case 0x00: /* Data port */ { vdp_68k_data_w(data << 8 | data); return; } case 0x04: /* Control port */ { vdp_68k_ctrl_w(data << 8 | data); return; } case 0x10: /* PSG */ case 0x14: { if (address & 1) { SN76489_Write(m68k.cycles, data); return; } m68k_unused_8_w(address, data); return; } case 0x18: /* Unused */ { m68k_unused_8_w(address, data); return; } case 0x1C: /* TEST register */ { vdp_test_w(data << 8 | data); return; } default: /* Invalid address */ { m68k_lockup_w_8(address, data); return; } } } void vdp_write_word(unsigned int address, unsigned int data) { switch (address & 0xFC) { case 0x00: /* DATA */ { vdp_68k_data_w(data); return; } case 0x04: /* CTRL */ { vdp_68k_ctrl_w(data); return; } case 0x10: /* PSG */ case 0x14: { SN76489_Write(m68k.cycles, data & 0xFF); return; } case 0x18: /* Unused */ { m68k_unused_16_w(address, data); return; } case 0x1C: /* Test register */ { vdp_test_w(data); return; } default: /* Invalid address */ { m68k_lockup_w_16 (address, data); return; } } } /*--------------------------------------------------------------------------*/ /* PICO (incomplete) */ /*--------------------------------------------------------------------------*/ unsigned int pico_read_byte(unsigned int address) { switch (address & 0xFF) { case 0x01: /* VERSION register */ { return (region_code >> 1); } case 0x03: /* IO register */ { return ~input.pad[0]; } case 0x05: /* PEN X coordinate (MSB) */ { return (input.analog[0][0] >> 8); } case 0x07: /* PEN X coordinate (LSB) */ { return (input.analog[0][0] & 0xFF); } case 0x09: /* PEN Y coordinate (MSB) */ { return (input.analog[0][1] >> 8); } case 0x0B: /* PEN Y coordinate (LSB) */ { return (input.analog[0][1] & 0xFF); } case 0x0D: /* PAGE register */ { return (1 << pico_current) - 1; } case 0x10: /* ADPCM data registers (TODO) */ case 0x11: { return 0xff; } case 0x12: /* ADPCM control registers (TODO) */ { return 0x80; } default: { return m68k_read_bus_8(address); } } } unsigned int pico_read_word(unsigned int address) { return (pico_read_byte(address | 1) | (pico_read_byte(address) << 8)); } gx/images/Main_load.png000664 001750 001750 00000026475 12702465756 016212 0ustar00sergiosergio000000 000000 PNG  IHDRP\2sBIT|d pHYs B4tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$ IDATxwx[EZ,[*q8p`YwCX~[wsB&KHH')v^eزU,ɒΑ"]'e7,|G[̜ygw9&8eeeNرc}Njs‚U*>SSS=.|BtzzzD---:.^&455M{{޼ymveفm۶gfl~v/DGGZ%R&)+QQQQ*ٜr&_z5j :::P(Č,RN|XnX|>ZβX,V5(F#`Z!*aa6^o ?CQԽEN4}ecǎںnݺo>((//1'v\p!b|I6 6 `Ybb8.ejEQp\qbH$@>Тig .+c߾}cwq|Ǐ/~͞=;ְ`pwww X,:Nt:e. n. @ $ɀe#$,XL,((d4x<|h7nرc^aaa[{ YMټys`H jsM&Sn0`$I(D" ڏ V|>| y7n|X2nP(Y,8ʅ |>,hH~,rn,\_|~!v؁z*Hǁl6.(((h(d2:tHv .+aaK.0 Y'PV_~',VQ/RRR^7C g& & 8Eg> @ XbV.h\t:q%%%׬Yse5 .^^z鍪$IIҽ111| @˲b6- ,  0>>K,o>zx<ٳՅgO?EKK {1?_3` "'MT~%b@ohhD#OڵVoݺuRbbbL&c^o:e||<6P+|E)Œ3qFڵ qF,^111ŁD,C"==ӦMÞ={ aaa7]EQ0Af\.7iuuu]vq111UuuuwvܪP 1saU*Ufnذa3 Oret@NWil6?_~pjjj~ikk "ku4MeYaR&H iQQQo s<7[&H$BJJ d477'̙3pB\v ϟGpp00qD㡱B^`ԩSsN\p> o> @R.:66.{Kp7BK.Ŗ-[sNXx1BBB؈ǣW^=܃UV!++ 8w\`S* !!!$r-t:BRl6`0(_|իW_ >;8wJJupח2000?Լy\MvZ&qW^|^O. /Gu:) x$IHR#??3f̀dbʕ+σih4TUUZA ??󑐐ڵk8|0B!RRR0aΝ;1c`ɨ@VVn79ɓ'eY9rsALL N> >￱BЖ_r@jooI&/^ŋ{ƍ')++7779sxO~<(((P`H(*4>>gϞUV+)DD`KKKܹsOcƍxw֭RDdd$ytwwcHIIܹs1oͶ@fk(j ˲u^רgkaV9z"El۶Ght777ge&''r D" kK.tO>bP(T*EXXRRRPPP_W0P*j",,  Fll,Z[[hӧO!11aaa;w.pq0 d2x^4 DzA&nC"`ڵ`YR+W144>.jΝcnzmF^_P^^.[|eVԦMxwZ=Jrss${p̙3\llCiӦ_͑z XmrPTT bڴi8{,6oތf466BTz`8rXEaa!QWW, шS5jׇ"DEEaxx8`Q. ;v,ϟz* xwg@ d2A,Ov *xgV^}\V+3_t``ahh(@*AbܖxsBA2 &&EQ())0h4X,0 h4(--bK0n8|˃B@tt4 """h@ju`6ƬYxb\.h4hZt: $Iׯ_G}}=z{{188 P(~lWTU$</ kSRRKҷ8cuuu] Vk}RR`0hAϟ/ ?ݞ u:ntw8NnDFFp@ ::!!! Ezz:.\5k`Æ p~ӟ"77^<ԄjdeeaǎPhmmwߍ۷c׮]Uߏp_RP[".. .D? |>Fe˖a֬Y(++ŋ100r$$$ %%Zѣ?8x<455555hnn \.hX,d*PG4L&x<,ijjzw_~˗/r۶m92"ͺ)))\CCq÷K R鳃E(q>88Jx饗"??!!!( HOOdž ŊXr%> Z >\QF!)) "/g QQQpp:mJ>PPW?w_`(8sLxIIɵ_~^[322:\MQeS|;FJxb>˲˲ IRtӞٳV TPYYO; Ey[[̃k.^x<1> ,ڵk*& ҥKp8~ߡƍ Xk]]Z[[a0044bGgzzz0iҤ^R*8c?歷ZIӴ8ư[7I<h?<,K&8 E>xRRe2Ap:h4 ..3gAشijkk ǃ}СC( n><4MC&$I$Vcٳg_ήh4Sy<"ĘZ 33Ss+@r$$$8u:r_- `׮]OOx<%XniiB@LL1--Z TyGw A$I.0aŸRSS+F7SR @,qSlDr|p0 `Y</cAub E"/66W;f̘Krʔ)cƌ{G6l6R `xxjz͛Z~_7f&L8]w&I$8^{pݺu,f9ĉqfͺ<883/njn?&"?4=IIIuf嬬I&1JKKG>|x믿0L˲|a@4Xqy衇Fcƌ1]t MHjEkkkR|_~eƍ>F~/4My>~`n%q FcP(GdX,NGmWa!! !>OT*W^o˴i쥥U{{={H|obD"?66;**J3zʬ'E|>.!!#ᣥ{sνhvg߿?*%0  P d20 ӥP(ڤR+VԋDJICCC^_uС֘ a4MWw ׋ rHRx=E.chh} Ø_=߯\zedq820X,H$|^P4KRj755- %}hhHh4$IA.'BBBU*Ջ/CBBgϞ`,XmV󡡡Sl6f!I >j[[[wIl IrobvIR.&& (ŵ'Nl` :u*O?OQT`lzE؞\d2.66H$6\^Ԙ]?{ %KR{c6^@F(^MJJ9GbFFƅH~T+J' f|>'hV"8"""RPPP=uv7kjj~ycva2F$I'0 GQWTBCC###5'%%է5l۶X\\r(..F.Qw>w$X(>… |>_O?gZرckoo/)nr_q8OXX[P '&&6\ ՙiiiNёvԩ|esX,p$ >p1n7ItR]dI'n?{BQK5P$KM&}'NiӦ ~aK׷DZBБ`+ STǓQVVb׮]*Œq\nop/|\Z_ IDAT4T*T($IV=~`? MӗV`RyIؙyj4펉FGGTK&L3\۷oc432 û.6hT* Dbp(JgDD5##]d˗/oDܒ~cfOkk+_(jO3yiofo~{$ ݸqΝt䖖lF1(?;,ɬ1116JլT*/\OKKSNU+Wlnkk;>(///ZjïOr7ʣNDEEij )uwwGS%GNdBXX$S"KLV{N8@3nCR] 갰jRٸ~|u,_ZOIM3omѣE6um;oSwަMx6um;oSwަMx6um;oSwަMR;o.|d2mذX,.GOz),iii][nqjM6m+V|SO{b$CZL"xfϞOwdhꩿl6<;gϞ]̎;ˮ_xdd$/>>xȓ'Ov/˗.x?۳g#&)*666He&;vUZZܹ3v?`0p8KHL;wnѣGGLbƏ{衇4G͡i\b]]]z٫+..ZNv9#8#9#|>MOXSt:qFFW_=##Z"\.t:e7`OKNNEEE=zA/^"@FB6LRu8GT A&!88<ۛovIILvqD<>h$''ߒ$)xIeeeŋU.a`磂\+WQ K׮]Kۛ 5 Bl6s@08ի^ݻlii u\ֱcǞNLLzx7L>ł I7<<1cT?~oWW;$$D ki A;dժUm*jCCo?e˖kV{_zYYYիdgg:44p8  MV4M?}j0BϞ={šl6hx`X=Z0hLn 8z'NZ,_AAAc=V2s#055WIx~ &??UT~DDD|VXX-JP2~z>O ˕Jۛ#..;x?Ϟ=;SфD"y*j? dffMLL4nŋz޼WJx ]*Ri+EN͙3g IݻwL6\IIIÕfx$FedCNB/IENDB`gcw0/error.h000664 001750 001750 00000000251 12702465756 014060 0ustar00sergiosergio000000 000000 #ifndef _ERROR_H_ #define _ERROR_H_ /* Function prototypes */ void error_init(void); void error_shutdown(void); void error(char *format, ...); #endif /* _ERROR_H_ */ gx/images/Main_quit.png000664 001750 001750 00000004302 12702465756 016236 0ustar00sergiosergio000000 000000 PNG  IHDR4T͌sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time12/14/096IDATx{]UL[J`U"o HkX-oDh"F*j ԠDԐ`OH@LDP *_ j""ByR mv?ֹNsf 3_rrs={ZkvO@D6{b7`mu8zW c x nޫE!S~^K-IOj 3+^]H;V)`&g."vĹmdN\yGK)lD+.뤚&KRZ?n{Uy0(XOW?Ǐk/UE=8UhOxj;C8QB[|)H|Rd#b9ה~_;$[q#>UJ7 6p"Ix`oF}] '(xñ%#t,.k|SXSx=,/ADljxfLw?Ig hw7\re v,l.^өRjir:X^&\+6_ T9^b _m_}߱nr2`ADnx|C:.0 6:B/CK)yc~DUJ)֦LBE$r? 3=`^% g|AbA%}ewL>D)xrNސLi2!EhڭWůED>BDS;ݦiybe,q8^Ϛ{&/Y8  "B~\I^|@u'#(5?NT}}dNmzf̘Ѳm2>`,EYSJ)?n!r܊[{8[ZcjgKD/OMm5tY[dH ͒~oGR̳3O%|2#dnv\^Fff] wt@[F|t>' ߆8nR'?4UF:g˭Kkpv)e~ f&wҝ\X.ɜUJyN&9q2yi[Z d&;2MQxX'.>ve&I>]jrʭTWA}2ڹLFmZAi-X_y`LA^IO&mvpEl0"É=X?%41JhcH(QB#F:F t%41JhcH(QB#F:ծ "T9Ntn_y&:KK)V ٲre<7Vn ⛔ eAM.OVLhKEtWy:kL=õ Rݷ@V?.SP%1&"*OE2)̍dsrV,Ӗ"yFkt&Ln)%.=%q~)Xq~u8\ R""%GJ)\SR)̕e+jJ)p])\֖m lKRvQ5Ië'bvEӚqxz7_[<r\nM ~qRΈ n|ߕq&΍yXMd-ǟk][EQ[>(#Lb8IENDB`gx/images/ctrl_wiimote.png000664 001750 001750 00000001272 12702465756 017014 0ustar00sergiosergio000000 000000 PNG  IHDR, (_7sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATxջkTAݬ&( hTR, ⫰; ;OTD`cT`_1&BfX,K9pܙfsf,*؄J99LVҺ)_X{Bʰp0ZK ʨ&d.ࢠg\g%l+|n\ Ɇç"i6Y6Y~!k b.r!YC(o Va9z>~ u<].,VKڞhP Q !'Ḑ?qET}&lo 5ǎrZuuC4Q*dYV2M"W[уGJv7^EqHdR2uGD =9.Ycna#'D:9A4N%?o,M֍b'%; Y}Yz*23hxf !L`^ IENDB`gx/sounds/intro.pcm000664 001750 001750 00000155572 12702465756 015524 0ustar00sergiosergio000000 000000 j} I@``; Sbq ? :%Z S {L-L @c[)-  Mhe, 5c|z2o 7B@ Mx vf?c [:6m mv/ d \l  R )7_y*~.?H 8 D*7/YVM  /xG Y[ G-H .q .P)F R  ^  $ I{[Q \X#$  ^F0baJ$ ]QJigube ^>B &'V ]6 = \m#]~ 2]rXq B  =_"`? T/66 dl U7 NE agKF\M 3`  \)"q wG0`  + ` J E 2 dy^t ~%? I|N Y ]d_l?% $~X,  zN-*Q /;{Xh: VP o `E~K l: 2< E }TA.+sbg|(^q = n%  g 7fF5Cn:] Kk J K (x\]jL x hb/Q<  D=rUM ;w <  );2D _UsTL= zat z @ nmB  g?7CJnI3 > G<(kU ?%~ &  /$( L:X p W R u{ r1 " Y0+ m@Li)   K|vgD H] <  : F^@ &K> 5 +a  @X?h 2zY { )96w bsi byRI  ?C ((rbA Y   nd/\}F- LpaGJ2D T _ 1 [}g%NL R (}^  p0 4 D Zzkz*/0 r W`y  &jf+ e- Yx=F Q u ` Vv\@\z  Q '7! BZ\e _1 0[[PS@.x K 6 6U Z z .HlO eK &c y - Q r :XyEK} >N% j <J  v3 E}.] ~ }  Cn %;r 9 v J Y-wpNz N 2R<@ wAx Bo' G@LP< CAKK.jqR bZ B K]1 TP r  X $rSl >*!% Z r !>Z'`*$ yd"@s3X0 ,[g J 7n_z1 QP ~t\ ( .4 * ]| ;E JC~It=@3# 'p  kM ~ WLlF 3#>Y A8Cb -, w }kg%d v x /t4[4/ $;k  O ah S% {[_\x UT % da1@% ZI- OD   9,HI (;DYFAa `O.S g `  C>(s S{^Ya[ Y< n 4Hu|  [LGa P U z; ] ^E q];|DS._ ;  C K  61UMFtz ?  &ej >.i? =N5y | OSS ` 5MdH o: < u UnBF -aWV*|4) 55!7  tBekpJ@g + 20BB  xFt  4%GTy^U-2p1 . ul t4e7 sDLq  z t"tF_Y~ A  4 rV|  |Pt  O   ~  "VmgB$2   4 H w= "Ld;7_=O 0YXYT;   C /% 74x`bRD5j j 6SUb 0Y)]A $yh/  W>U {OMjGV-^> p &L G 7=:] &v4d @] 9h &u$H 4o)| `, b  2 R4 b/Ze 9  nI ANO>gKY0b r`  6ooAg RS`$=#G nO g(s r El1/@r 49V b%[ Ym JF~` ,/hAH zcHP<   2A a!6  KTu fcNz"^b( Z -=#* ryvUZ .US  ",/ F|zYL 4 <,`vz88 r ^70 )r  *B}xU J6  C9J<_@V$V [)f u Gk}?O\  i - BD {n FH Q  {s J^fb d^t mp 6GY8 {I0( +T V &_d;?eM& F j5 75> nrWs:b- e tbI Y,#%'x 55ohN2{  m 1 " c[o| vz#&6#g ^6TQO, )E{q [ `sq- L &# {'9 ywekjK7>al,8$w 3 wsNgK U  6c[g k vaR x }m8 c<] u [0 t9 `G [' s S_nM o7 c e7![d0X  G")] ]/C4eX iwN* ~ B_o\ a# ed/ W?WL ?& V v5 VcSv ^+ue o_kR{>  ZE,7q#e$ip3 A *G9r ! ZN >' U ^2Q 0dg#|L  $ $e[( \q% X G 2o16T  ]8 U 9  ce1$ AVtxu Ky a ~ -d G ( 06 & "~  |i ,7z  =An^ ^`{  %M'ov J p5\^ w6| Xh[f[\ - J it{Eu |H  VRlj 0A-  B An%ef} 'e3c  Ns0A L  N   5 LL>^ D +m &k  2 W[m[`SJ")4 /; xB& z K%Z-  r A M4 l;?bw,vgPh `kw 6\[QT{& #yjU 7_ V' ;wB y D9 7 N]uL} >@M  bo L Y znd hF  K3a ( Jf *+ P VZip1 L # `~g2TS  q  3SGp}Sg ^ :+db) 2  \$z JUkiM  9 YS?BBu l@q ~ `{ ;F  J @ Mf y ]|,&' .E c O$m@(wlE r i lAa u 1Ca z v_q;*`  Rr tlu   # - R [THm T Uu=yD4+ lF a 5o xRo_2Sr= / /<:lQ # Z <*%c<':G N$ \K&^jD4)  # 4+rWs 04 ,  :,nNmoRY  ` M g[R X& : L w  wA?>I 2*R X r[ .Kz+ b ?   m] <>Q $  * 1L %m+U5uY7/AI Q* e :_k;#Wl"3zy cdUh Fj `[tsn,kP=* dQ  78 @Huj ^S;  #JK ,EPbM<  K CP  eX M+0 9v aF X1r"3 0 "y q `():ADI@  b 7lpVA p w /E Z=) ]Fct u Z \( # l k11 p  *lXU6 P C~z^ s &;dr< H#nLUA- 7*% aBD* 4== v EO| z5R  /r C`Ee p- C  o  9 i\Y^XWXY OG  _\tILJK {8  *)=[%h< zs; 63 <CKpW PP F *Q a^Y lF% Q J%0(>H X E ^7V"B gvE  } + k'lR\k ((,Ts G Q{  YKC_c <5 q' ` rH( ~ ;u K^$7w",< *g% `7b  y#rE  .0 Nhn{XC 6 Zf  iYB i}t&  7  F^  +[%"Ki?P  )P 5_l ; <*C N e{  [#?gEQ > ! O 4uvXB _ n ~ )lsMa(* H; H|7[ ]Z$x ve Y } F?M|^dC~{ q | GedNvdmat4 YB P QicBx _  4m% n9c, Z  p ~iT_ 5cU  ~ O , x)r4$qK    > UVS-M5m / OrEv*j)}bk 9@  @ _1 ]FX?_,j<: jU r sY  #rs| Z$ )I~`V I 8.?i  \ UO02f0 c*y2h    ; WAOmhx$as 86  pf { % iWhN | - 1-n \Q//dc/I #+9l )}B>AI  }fg7 @C! j,#/ L m [ u  $p7^_8 bO  '@k   BV'HN kn H%yn zQ 2 OMd Jp$z0HMg P3X d{ uN B ~ e0 * u> j Q)8]F (&CO1wi s(t jo L4 @]phZ/& &1u |Mg ~  c  U[ 7l  )O/ D /Yn; _ U3+UO`? q X? v[ ;__?  K|UrLBA# *5  D{g| V yF/ku l: W8 v ?T I4 ( j l kT o;i y  u1@ 3f  LA; MD lGW s%qcI8e  X o Gc >fvgnJI7|Pz # cSfUP D  W@jin B> GBLz/\  OTu y g "q6X|!ERH , 5  J]r| ?  4A:bF p 'Y&qa 1& < .Nnka $ )  ] T K 2Z@D V~4 *  Tl x[Y$mG 5.E O>J* 4 "Xh@XI )B:\9 W i &~   RS   :@0Rm<\, 2 0t##  yRs bl,MVG N 9 |b'AQE}r" ,[_9 {V s XH  ID?1! IW{ mI ? 1iPsRql ;!Fh#253V  C9p 811  E` vRRr Tfw< ; )% l I = 6sNZ Z$c\9   xy _"\9&aIN] ixCH?nl-nX 2WO ]37 $eWB n S17>_b  F*e 5 w e?#8Ph .B %Wuwy L  fI lcC-q R `Q  y m ;X;  ]tGH +F  ]: U g<t ~!o {ij0  8jNu  w_ a ,UO_Zq E VXOq:B,I Jh/1 dHE * e Kge+DlX#/ W P^fY%C | i E/q;) R3 3wdZ#S  "; 7,Y/.D x TI )B[/8y!: bp)  q@$ /| Trt%d )iHl X #dyVI_ E G %ganv )  Ovx `~.'z V Pa ckG rf~  b   <DK  t'Z_V5=HX 0 ? n fS c|b9SPP=^Gc  \ t_#V/:&% Q1o*S[ }  LK( Kq6i NO UxP=Bn 0 YC K_ Xf /s 4 F"L. Aa H9;Y\A c -a6] ` Xx ls n+js bw $ 6f> r  ' (YI ,  5 P  @',/J Q2  z ^y  98 um N# T   Ci0x(QmB  n vim[ech  X ehD7`-"ck9 [ , j~`NNF k p- e QnG i95 L T -X y  JeGK^ Nr T $cT \o <  { q f >ouMo MaI? -; ] l, C: 3 JKs Y' a  V&o ^$N ]HED{, D p;66A/;Kk`B#B  S lm  [ &uj8?2}' Z )ft B V  y Zk=sq!'Xdt Bi'^Ke  r ) . 6; Q rB( N~' F AuGP sP  +G)%=h~ jEMW. b3-dh ` F 3 249IHIsa Za :(\ ^P5 * 3 $ ~yg&?op" [\&1Hck&]g  C :+|  H ;T5G'S1t<"Z[  i B .(6pY} r   n[*dx2  3 ([ s+9byA  j1Ul'ga# m kG9\~8U } Mjp& +Z { / - o& i S evbZw8 K 6m( mO 68KyA|. B iaj.%  .C^rB  2  q %NNVs)1  nA'$Ph^qk 2s>.  4 7N/: T (7 fI >K %  GY}5j Vk -1d\V_H L 5  jJkm7 a Mv=rR[\= u k Os~la$Hs= 7 *MnWjf:@T:U 8 Q.k 0  9O ?#Tb<' @ A ?DZT F BI7TA I +fBJAZM J }$=N3Z]- ` T Ce @' : f2,N^ 6 Lq1 HC@ 2 lX<0M(7P  = <t   v2 ;{N] k Y&hw2 8gb%J48:  ~!%1fyR Z7{HBH$BH ? #5p`Rg CmT g</~  p}hl>yhEU v#v>z]k{PH2@ U -} KQ @=M 0F=^Y ChYg= 8'"c67Jb z {bS4!62Eo 8v{'6"eG iHD{) K7YT}>t -WMOg+9 >#rgk}Eb7x7.q38-5hi cJ#9r\_G1~M2 \1Aw r  tXo1Oz^' 6_2Q6Y`] cHjkm# m ;dh}cSQ @6D5vm_h~E} n >,q!^WFX koC-~  'm99}s0] + >x<  y)PPt(=`K(x. T Z6lvh P  SLNb1][\?_ $4Co e((y ? DDJHT9d:  -C0 mq h O2lh:e@*fT H@vmq _M/SM BNP*JNrK bW)Y4ip TKA7Y&%eW9 R:`WD]1fs:3HjXNT 4dPa<+0jmC .5M_N R zb?KO| ]rC 4&o"ds /D/I> K]/Pu X1 x0209 'P^O5dy 'm 8Xiy1ji) X;h .Z Ey,nfJ Bg :7DoJb #w(myP Ac I%%W)ZOZ E$G>I< ZqPX6S@Vo$ fm&]fx$E 6Yps " =\%kH +Oc54JnGJ;70Z*G cExaHKkG<g^SFpl DcE #{>z1R'(vm 6650!%yHp 1U@>^1J6 hzRX2d$T^ y ~"hx R FUzDv%S o 2 _C]ylr6Ajfz d$C?A:p@3} zWDnoN,,0 79"   .*Uv? z9;B T )|a 8Jxf[lhI_8d$)q}:5 )?B<+F Pmw4/ ] 8`y"L <9*EJV`\,zitqk e4t%L }Kjx/p%iR+p '%`K:ranXd U3vi!k(O#tI xEXOC7S7t#q y f]  c9HEi=8[7[4  K>aqyV/ `Q"v/ " rw|XRx+E}{/ IzBf|B w>qqUY@7|#-'`"F6L ,[>p4~+x+K' kIaW\B $)GqFohAYIL zTP\Sa & dgf J_7zk H3%E!~ _H :"HW =&)h2/, dUG7zx xIV:k)G]B`jGSV + cU[-P6 vW_ >L;qm1KR "]; iVfoLFbj ]<V, OD z_ k=S)sa[;LK >!tSqw:pcZ? ~ nw7O:Di ~ d]`FV%. gH* 1 VQ)3`+Q ?4n @3r@` XoN }&tvF!}^8GKF$ef C3R0-ly/`'Y-E$*FtC.ib/ OIZEcf=f _Qf,8j)+ZX: "NZ5tk}s1 .etl?\\&] NSiL6 +1F]aRpQ%{qG> M["kht KD-$q<"p; >Y]'{UDHHh<+Q ) ,@6hx`F$msF`hrlSSx _z}{0UvCDmt4_6xY` @znG %XK<aH oo} [ u`whz(! \%b"/  DkA0`@mUML DGL@$L{(itE_&k) 0*@fu<  s-nXws<r+|F S88m"fL/r@Mn  lG4XBhp $Uw;0YKJ _g?4F3}^vKS J]HA+i K;T}UV2Z ' )S~0Dh <C)+3]' G (k2$j .-dR}/B~ pI& #y ,> 2 ;en Arb]| }@50%s_ Znp3}StM} >czKCrXR8Is W-ogTXO q7yN q^Ob?4 uTyUYw  +  (ZibRT+ `X % wzO!pm  r}Hi>I 3 e6:WJ  Ure?b&%{  hy@M  > x  ~r ;cvn l*:m  3&5C=VZP  W _* uMP  Hn3|Wh  uW  'r G Y Y:+Zj?&v xF.eT  F }Q+N [D D u}<1/$Wv @   s7% "xJ \P 18FW<C: F p5>>LA mx Q >"P3U3 M 'j{skGd(B)?Y" K- < i6^3xd Q U'S?Z%/BA  H_S; JD Y VS.}g:M31#  {. M U g Bl3I\1&F }wY0 1 F = rh  fq>6w7 \FVO    P2 %ol i~R r 1<04*@  x,5dPhu L ;XR|~y HT?:!>)d w Q  XL`n[ 9?EI zVxzZ g [xQa#( Xl,UAYh?G k D]+?( 2 / hJ%T8#\* t uw5mO 1 5 C|:k [Sc'ESd& $ O:c{` e F gR2s ^ +N#P]hThTmbE y =mH!]: *itY3r + %h;Uc5sc !R9L T{ oX @> ZP"apY? X [6kB[Vc S5# ]Gk}#@ *M  FI+U6:i ( ?2~q8^rd I: I=)DLdL 1)5^d= \=K Q}" :)ILI ) ,GfKjZ4f+*N b~iQ vlH i_deS5D  u)B9:Z& V |e?ahvRCP ^ #?#qn.D\ tt`@p801rn3eFJ|PED& Q b ~ xkf%&68i  Y]KI# h&<`[J8-ILS ]} jwm\~]6puP +4 E"aX>4`B L}AFDyA6D 0m{aA,=A(Jx  $*Qmz >mPr!)B21( V!u yJ4| k?VQ*E_~M LP4pjDyho t6Q, Vsrt V_ w YY <&5p{PN v 6B9iPZJ*\ =w:,+4RW +ICRz=_7  9: Ym4* m lM5q ck6WvR*vDJIz %4 5hWCk54a &~7ah)4>2AP {U%FFpPGorF59ybh8VU{ZCwnrrX>e4rtZS_C  [E~v#2 X =y3oHt<*Z B^Qkx-y7~t2[| 5,)q5D=e O|uD_5Z894 Z|Z;)Z{ Cvi[|"9GpXV5v"m4F<S '0wR5NCXWE32kI  #vr:THPPH5!g-0:4n ^*0:W4WOXnk@$U&*Q, )U:N :21!vW!umzV]@Z ;dm$nH[).+?) B1 `s.BG< v)fOrj-(Mf}?j&YdzE:SGuXb/^T(pp`VA^  8:}"^<e!}V,2`C*_g5}~d[w>Z"G7|RSv6Ze^3xV[E PE ;M|O {..C[+Il01lk+h69Kvg=FpW=&W63/u}tn#oJB5.xcMhHz:a Covs7- y(INOjYyI}SyO>sd%>A"I1@ +3)\=BaO{k!do=ztt4y@Dl PUx$$L.\&'>xAPEoz}i+F).Z1gInxuk=>C( v{:5awT #=a' uj01W9"z1N1HpkSc.E``S+kEz7=j1R'#Y(/:jls&HqUL^sIw{9dw!a.c4};FT"? 0.:^pboa9: #cm@Nkem nDri9;KgBB"cH Ejn2bt<gr9KSZ=06?mNP{~5{jwb~^ E}u9L\L~ U,Wt#yuOsjQnA}V7[B^;(lS! .G!.u&b~d$s*9v/Fhyr'mb=xpGdD,3.B4g=S1^,uY>M QK04Elkh *;">+7e$^S_QXXKVJBFVHh> C])j[ bVcl6^ H>, ( )Wh%D~`c_pDx iJuxV`& @u!Vkqx 2* Z<,=3 XLIc6dr8u#nd#7Y;28JJX'D^(sq%6BUh+\Jt(jMkj`D(.Hipeiu S(1LW~WOe4hS@ +|SCF+q.)}:8*Bpn!hNg,[\TAYOL?}1$"NYV )$OL/qm :(,u'\Fk&gbL]TA;oA $/wBW*c/:=aT7^/[F@> 0jvl%M >} nv;7b%aX{=|;5W_\i5LBb.UZH%, z jO-oO!0!1~4,2( b G%hdc# gfu]=^->2C|* ~hUstotO"\C3WgVwEbi ]qT1?! \P=cheB+e}S7~f@ =lN 0ipT>]CjTt5HN$U]l}Xi='U)B7m/ w 7 [Ocs7U ob a`8l%akA~rG/yg42 K*bAH3.3'!9%p(Z9F-w3A12b&A@;i/-!?yrx+eUjVr ae`H5L*uo2*M`FjB,p(g OGG|;zO"m/4!e7m*4 ^.;f>=6o?Y)=qZqRW;R9^#.-e-yqVN) Q}**/OqWF@3w>}q8^=7)]d@LFt}NFLR%K>bS SC 5Sfu #.) YcL{:TXo~aN Umq-5=:]D '5u4CJ\[ bCtZWeE"a''KY2C.HF$;BMay4s@79@7_]#~ $v%DkGuYI\[`PKlM-PEjB{;WL(.\:PXf 5`]JY*c1#yG^w% Y lz n-<X.XLPc:{b %Xoj2m4@q9n_qa+m` [V<N<jJvx $q}DF zgudF .|TY/h^._P(-=ba$f*Ni vh!jr$ LnMj ^Z Lxe^_t91Piq.(uOOj {]=#R!d= NGNc/XD`3`^R[o8R0P.__,*wevS/+*pCQfqv1:X^E 'L}  1L!zn7.0nJX0)B1q`$WD]#5g=]r PEJgZdL:@=xXo^`q'QqSU{c\}3D)(>Ph#?R*fD^[[< rK`O#gv{ HN7R5h,E2JMhTi#lHuAWiV2[g*ZLL>[;kw!V"ck#Mx \ 1@AGEp+Isg,d@/J{rRei^_N:l'x/9ui* e d\.Y,h,l[]%2BXSv.f0YA~]f+&.]H#psKV^q"gtt_Hg>mck.u^,(_g+UFkpUZ,5SqP<pGp )35WG8RS -S$vHO=9}#;/n;^sGzm)B|6N>}9PRJ\1 GAA/#=d&i41v8cjj4y2g~4Njh<V)>o nK|Nvpm;*Ss&>W~&ZRKfmdmkz$+ * aO]h}b0@ebjv==1mja2?JY5cy0]cB $s'#Xz~\^ldt8pK?"7wqWPE>.ZqV9l4ApOV~tF7/*n&A,5I)/hc%f-hD(2I1.#5YZ :_  f|.vpg=B=:28~ok.*FNLv+[ :f6V-dYzEp3O~RxtwJ-de;oT3[[s?'Nqvd \E "t| Qkw iw,:>~{ daZJqRqEb5 #^zrlJQCJeqUx-Qi:x^##1^H0z/\zhMm&@4YpL)V(&G #ri9x:l =&Rt~6/u-PaKV<#((zndhsUIby.xhN?i3J/NSx+JhvW&o$? U3 S90Qy.FqQzRev"Ew]$1;=zc&.~Dki2tv7>;4X?I;d3]r^a)SXC7ClSQ#8R j&%8|G.bum3{Y_blQ=ZeR:qqd2$`5A9#:'5KX9zH:tw#($Von":D!7D3 haRX.5Z 'u"$1K<3g3?wG?sT3|-J\C%m?sh)Q1+7;lBF%]cu3Af4:He.`)h9'SwBqfp"dOq&y ]e'_1r=j.Z)w%rR_C{, f WFWvLE c.37=a>JaZ'g/G R;YIT~WPG%Q77Q"^{j<,x% e3cD vSb4pFbF"W%>'7Mf*LCok OF.yS2b>U5&*)e-l&in];ag6Ofch$%N@;|%)`8 ~{cETy|>re5;cBPYk?1D`cCCqMjxis &;~XUg/|qJ.^U4ih}egfbr1\:{^Pxv= F?l 3O GTjT/m<-&R<}]7~J k\w~hj/N? [xQC~36ib y1|#AfP:? 4Fw 4"QM &]o?y5'L-fIzdxo%b* Ks,F~t.6xQYvqr&@J%a;VCfR#pOcT|'ryOZQo\7 Nq, L __ZT6Pz|T3v+u]U:laf}.*REtY'ORys~fL})."$D$OeS!rtl|e ;;+z_/h.ds c_&N|^~|f5>!X'd%$dDe0q - J'5$l9tE8BNNhZ6bpV{) @kR:jqKr7Bt{'z0fL_C18jvs/FA2`ByS5[y|q!4|j:=ZO}jy\ A8g7zLmAm+*[<x# efc0SL)^W)>M@X8pIy+ @*`6?!)f9yg=Bz*Zo&f3@Y!OCzd9 #stc8D~mKS:p;T#gXFr0 MBrO,"4l bsS!w=N)D_zt6r,"Zj)A3UY""sR.1C=kS0V#GOT/0E\/=#rTd/[ ?7+@|W-[^fYz  O?N$3"sq {H7,CC (l+j5GhB*yTYZQcm'F 4ESGlWu;=~1/Q{sM<3]latZTNvK^\wnj@HB#GD qd@ s *$iFE! 8sw}eQWMnEE]e[lV?f4oMv5qHmHrRE61:v!7/J06?-R]|, >=0 TyL,|o( y.<ejWj=Zp^SQ2\V4 go"}c-#f^K-E5s"P{+"-q/H56CGRWzuhrJr`o^U?+X8J6S/ KkuCKbQ6,Dj2HV HssaO=.core/tremor/configure.in000664 001750 001750 00000006355 12702465756 016502 0ustar00sergiosergio000000 000000 dnl Process this file with autoconf to produce a configure script dnl ------------------------------------------------ dnl Initialization and Versioning dnl ------------------------------------------------ AC_INIT(mdct.c) AC_CANONICAL_HOST AC_CANONICAL_TARGET AM_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE(libvorbisidec,1.2.0) dnl Library versioning V_LIB_CURRENT=1 V_LIB_REVISION=2 V_LIB_AGE=0 AC_SUBST(V_LIB_CURRENT) AC_SUBST(V_LIB_REVISION) AC_SUBST(V_LIB_AGE) dnl -------------------------------------------------- dnl Check for programs dnl -------------------------------------------------- dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2" dnl if $CFLAGS is blank cflags_save="$CFLAGS" AC_PROG_CC AC_PROG_CPP CFLAGS="$cflags_save" AM_PROG_LIBTOOL dnl -------------------------------------------------- dnl Set build flags based on environment dnl -------------------------------------------------- dnl Set some target options cflags_save="$CFLAGS" ldflags_save="$LDFLAGS" if test -z "$GCC"; then case $host in arm-*-*) DEBUG="-g -D_ARM_ASSEM_" CFLAGS="-O -D_ARM_ASSEM_" PROFILE="-p -g -O -D_ARM_ASSEM_" ;; *) DEBUG="-g" CFLAGS="-O" PROFILE="-g -p" ;; esac else case $host in arm-*-*) DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char -D_ARM_ASSEM_" CFLAGS="-O2 -D_ARM_ASSEM_ -fsigned-char" PROFILE="-W -pg -g -O2 -D_ARM_ASSEM_ -fsigned-char -fno-inline-functions";; *) DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char" CFLAGS="-O2 -Wall -fsigned-char" PROFILE="-Wall -pg -g -O2 -fsigned-char -fno-inline-functions";; esac fi CFLAGS="$CFLAGS $cflags_save -D_REENTRANT" LDFLAGS="$LDFLAGS $ldflags_save" # Test whenever ld supports -version-script AC_PROG_LD AC_PROG_LD_GNU if test "x$lt_cv_prog_gnu_ld" = "xyes"; then SHLIB_VERSION_ARG="Wl,--version-script=Version_script" dnl Set extra linker options case "$target_os" in linux* | solaris* ) SHLIB_VERSION_ARG="-Wl,--version-script=Version_script" ;; *) ;; esac LDFLAGS="$LDFLAGS $SHLIB_VERSION_ARG" fi dnl -------------------------------------------------- dnl Options dnl -------------------------------------------------- AC_ARG_ENABLE( low-accuracy, [ --enable-low-accuracy enable 32 bit only multiply operations], CFLAGS="$CFLAGS -D_LOW_ACCURACY_" ) dnl -------------------------------------------------- dnl Check for headers dnl -------------------------------------------------- AC_CHECK_HEADER(memory.h,CFLAGS="$CFLAGS -DUSE_MEMORY_H",:) dnl -------------------------------------------------- dnl Check for typedefs, structures, etc dnl -------------------------------------------------- dnl none dnl -------------------------------------------------- dnl Check for library functions dnl -------------------------------------------------- AC_FUNC_ALLOCA AC_FUNC_MEMCMP dnl -------------------------------------------------- dnl Do substitutions dnl -------------------------------------------------- LIBS="$LIBS" AC_SUBST(LIBS) AC_SUBST(DEBUG) AC_SUBST(PROFILE) AC_OUTPUT(Makefile Version_script) gcw0/error.c000664 001750 001750 00000000704 12702465756 014056 0ustar00sergiosergio000000 000000 /* error.c -- Error logging */ #include "osd.h" static FILE *error_log; void error_init(void) { #ifdef LOGERROR error_log = fopen("error.log","w"); #endif } void error_shutdown(void) { #ifdef LOGERROR if(error_log) fclose(error_log); #endif } void error(char *format, ...) { #ifdef LOGERROR if (log_error) { va_list ap; va_start(ap, format); if(error_log) vfprintf(error_log, format, ap); va_end(ap); } #endif } gx/gui/gui.h000664 001750 001750 00000024341 12702465756 014063 0ustar00sergiosergio000000 000000 /**************************************************************************** * gui.c * * generic GUI Engine (using GX rendering) * * Copyright Eke-Eke (2009-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GUI_H #define _GUI_H #define BG_COLOR_MAX 15 /*****************************************************************************/ /* GUI Buttons state */ /*****************************************************************************/ #define BUTTON_VISIBLE 0x01 #define BUTTON_ACTIVE 0x02 #define BUTTON_SELECTED 0x04 #define BUTTON_OVER_SFX 0x08 #define BUTTON_SELECT_SFX 0x10 #define BUTTON_FADE 0x20 #define BUTTON_SLIDE_LEFT 0x40 #define BUTTON_SLIDE_RIGHT 0x80 #define BUTTON_SLIDE_TOP 0x100 #define BUTTON_SLIDE_BOTTOM 0x200 /*****************************************************************************/ /* GUI Image state */ /*****************************************************************************/ #define IMAGE_VISIBLE 0x01 #define IMAGE_REPEAT 0x02 #define IMAGE_FADE 0x04 #define IMAGE_SLIDE_LEFT 0x08 #define IMAGE_SLIDE_RIGHT 0x10 #define IMAGE_SLIDE_TOP 0x20 #define IMAGE_SLIDE_BOTTOM 0x40 /*****************************************************************************/ /* Generic GUI structures */ /*****************************************************************************/ /* Item descriptor*/ typedef struct { gx_texture *texture; /* temporary texture data */ const u8 *data; /* pointer to png image data (items icon only) */ char text[64]; /* item string (items list only) */ char comment[64]; /* item comment */ u16 x; /* item image or text X position (upper left corner) */ u16 y; /* item image or text Y position (upper left corner) */ u16 w; /* item image or text width */ u16 h; /* item image or text height */ } gui_item; /* Button Data descriptor */ typedef struct { gx_texture *texture[2]; /* temporary texture datas */ const u8 *image[2]; /* pointer to png image datas (default) */ } butn_data; /* Button descriptor */ typedef struct { butn_data *data; /* pointer to button image/texture data */ u16 state; /* button state (ACTIVE,VISIBLE,SELECTED...) */ u8 shift[4]; /* direction offsets */ u16 x; /* button image X position (upper left corner) */ u16 y; /* button image Y position (upper left corner) */ u16 w; /* button image pixels width */ u16 h; /* button image pixels height */ } gui_butn; /* Image descriptor */ typedef struct { gx_texture *texture; /* temporary texture data */ const u8 *data; /* pointer to png image data */ u8 state; /* image state (VISIBLE) */ u16 x; /* image X position (upper left corner) */ u16 y; /* image Y position (upper left corner) */ u16 w; /* image width */ u16 h; /* image height */ u8 alpha; /* alpha transparency */ } gui_image; /* Menu descriptor */ typedef struct { char title[64]; /* menu title */ int selected; /* index of selected item */ int offset; /* items list offset */ int max_items; /* total number of items */ int max_buttons; /* total number of buttons */ int max_images; /* total number of background images */ u8 screenshot; /* game screen background */ gui_item *items; /* menu items */ gui_butn *buttons; /* menu buttons */ gui_image *bg_images; /* background images */ gui_item *helpers[2]; /* left & right key comments */ gui_butn *arrows[2]; /* arrows buttons */ void (*cb)(void); /* specific draw callback */ } gui_menu; typedef struct { u32 progress; /* progress counter */ bool refresh; /* messagebox current state */ gui_menu *parent; /* parent menu */ char title[64]; /* box title */ char msg[64]; /* box message */ gx_texture *window; /* pointer to box texture */ gx_texture *top; /* pointer to box title texture */ gx_texture *buttonA; /* pointer to button A texture */ gx_texture *buttonB; /* pointer to button A texture */ gx_texture *throbber; /* pointer to throbber texture */ } gui_message; /* Menu inputs */ struct t_input_menu { u16 keys; #ifdef HW_RVL struct ir_t ir; #endif } m_input; /* Optionbox callback */ typedef void (*optioncallback)(void); /* Generic textures*/ #ifdef HW_RVL extern gx_texture *w_pointer; #endif /* Generic backgrounds */ extern const u8 Bg_layer_png[]; extern const u8 Bg_overlay_png[]; extern const u8 Banner_main_png[]; extern const u8 Banner_bottom_png[]; extern const u8 Banner_top_png[]; extern const u8 Main_logo_png[]; /* Generic frames */ extern const u8 Frame_s1_png[]; extern const u8 Frame_s2_png[]; extern const u8 Frame_s3_png[]; extern const u8 Frame_s1_title_png[]; extern const u8 Frame_s2_title_png[]; extern const u8 Frame_throbber_png[]; /* Generic Buttons */ extern const u8 Button_text_png[]; extern const u8 Button_text_over_png[]; extern const u8 Button_icon_png[]; extern const u8 Button_icon_over_png[]; extern const u8 Button_icon_sm_png[]; extern const u8 Button_icon_sm_over_png[]; extern const u8 Button_up_png[]; extern const u8 Button_up_over_png[]; extern const u8 Button_down_png[]; extern const u8 Button_down_over_png[]; extern const u8 Button_arrow_png[]; extern const u8 Button_arrow_over_png[]; extern const u8 Button_digit_png[]; extern const u8 Button_digit_over_png[]; /* Generic images*/ #ifdef HW_RVL #define Key_A_png Key_A_wii_png #define Key_B_png Key_B_wii_png extern const u8 generic_point_png[]; extern const u8 Key_A_wii_png[]; extern const u8 Key_B_wii_png[]; #else #define Key_A_png Key_A_gcn_png #define Key_B_png Key_B_gcn_png extern const u8 Key_A_gcn_png[]; extern const u8 Key_B_gcn_png[]; #endif extern const u8 Star_full_png[]; extern const u8 Star_empty_png[]; extern const u8 Overlay_bar_png[]; /* Generic Sounds */ extern const u8 button_over_pcm[]; extern const u8 button_select_pcm[]; extern const u8 intro_pcm[]; extern const u32 button_select_pcm_size; extern const u32 button_over_pcm_size; extern const u32 intro_pcm_size; extern u8 SILENT; extern void GUI_InitMenu(gui_menu *menu); extern void GUI_DeleteMenu(gui_menu *menu); extern void GUI_DrawMenu(gui_menu *menu); extern void GUI_DrawMenuFX(gui_menu *menu, u8 speed, u8 out); extern void GUI_SlideMenuTitle(gui_menu *m, int title_offset); extern int GUI_UpdateMenu(gui_menu *menu); extern int GUI_RunMenu(gui_menu *menu); extern void GUI_TextWindow(gui_menu *parent, char *title, char items[][64], u8 nb_items, u8 fontsize); extern int GUI_OptionWindow(gui_menu *parent, char *title, char *infos, char *items[], u8 nb_items); extern void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *option, float step, float min, float max, u8 type); extern void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1, s16 *option_2, s16 step, s16 min, s16 max); extern void GUI_MsgBoxOpen(char *title, char *msg, bool throbber); extern void GUI_MsgBoxUpdate(char *title, char *msg); extern void GUI_MsgBoxClose(void); extern void GUI_WaitPrompt(char *title, char *msg); extern int GUI_WaitConfirm(char *title, char *msg); extern void GUI_FadeOut(); extern GXColor *GUI_GetBgColor(void); extern void GUI_SetBgColor(u8 color); #endif core/sound/sound.c000664 001750 001750 00000017204 12702465756 015300 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sound Hardware * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "blip_buf.h" /* FM output buffer (large enough to hold a whole frame at original chips rate) */ static int fm_buffer[1080 * 2]; static int fm_last[2]; static int *fm_ptr; /* Cycle-accurate FM samples */ static uint32 fm_cycles_ratio; static uint32 fm_cycles_start; static uint32 fm_cycles_count; /* YM chip function pointers */ static void (*YM_Reset)(void); static void (*YM_Update)(int *buffer, int length); static void (*YM_Write)(unsigned int a, unsigned int v); /* Run FM chip until required M-cycles */ INLINE void fm_update(unsigned int cycles) { if (cycles > fm_cycles_count) { /* number of samples to run */ unsigned int samples = (cycles - fm_cycles_count + fm_cycles_ratio - 1) / fm_cycles_ratio; /* run FM chip to sample buffer */ YM_Update(fm_ptr, samples); /* update FM buffer pointer */ fm_ptr += (samples << 1); /* update FM cycle counter */ fm_cycles_count += samples * fm_cycles_ratio; } } void sound_init( void ) { /* Initialize FM chip */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* YM2612 */ YM2612Init(); YM2612Config(config.dac_bits); YM_Reset = YM2612ResetChip; YM_Update = YM2612Update; YM_Write = YM2612Write; /* chip is running a VCLK / 144 = MCLK / 7 / 144 */ fm_cycles_ratio = 144 * 7; } else { /* YM2413 */ YM2413Init(); YM_Reset = YM2413ResetChip; YM_Update = YM2413Update; YM_Write = YM2413Write; /* chip is running a ZCLK / 72 = MCLK / 15 / 72 */ fm_cycles_ratio = 72 * 15; } /* Initialize PSG chip */ SN76489_Init((system_hw == SYSTEM_SG) ? SN_DISCRETE : SN_INTEGRATED); SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); } void sound_reset(void) { /* reset sound chips */ YM_Reset(); SN76489_Reset(); SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); /* reset FM buffer ouput */ fm_last[0] = fm_last[1] = 0; /* reset FM buffer pointer */ fm_ptr = fm_buffer; /* reset FM cycle counters */ fm_cycles_start = fm_cycles_count = 0; } int sound_update(unsigned int cycles) { int delta, preamp, time, l, r, *ptr; /* Run PSG & FM chips until end of frame */ SN76489_Update(cycles); fm_update(cycles); /* FM output pre-amplification */ preamp = config.fm_preamp; /* FM frame initial timestamp */ time = fm_cycles_start; /* Restore last FM outputs from previous frame */ l = fm_last[0]; r = fm_last[1]; /* FM buffer start pointer */ ptr = fm_buffer; /* flush FM samples */ if (config.hq_fm) { /* high-quality Band-Limited synthesis */ do { /* left channel */ delta = ((*ptr++ * preamp) / 100) - l; l += delta; blip_add_delta(snd.blips[0][0], time, delta); /* right channel */ delta = ((*ptr++ * preamp) / 100) - r; r += delta; blip_add_delta(snd.blips[0][1], time, delta); /* increment time counter */ time += fm_cycles_ratio; } while (time < cycles); } else { /* faster Linear Interpolation */ do { /* left channel */ delta = ((*ptr++ * preamp) / 100) - l; l += delta; blip_add_delta_fast(snd.blips[0][0], time, delta); /* right channel */ delta = ((*ptr++ * preamp) / 100) - r; r += delta; blip_add_delta_fast(snd.blips[0][1], time, delta); /* increment time counter */ time += fm_cycles_ratio; } while (time < cycles); } /* reset FM buffer pointer */ fm_ptr = fm_buffer; /* save last FM output for next frame */ fm_last[0] = l; fm_last[1] = r; /* adjust FM cycle counters for next frame */ fm_cycles_count = fm_cycles_start = time - cycles; /* end of blip buffers time frame */ blip_end_frame(snd.blips[0][0], cycles); blip_end_frame(snd.blips[0][1], cycles); /* return number of available samples */ return blip_samples_avail(snd.blips[0][0]); } int sound_context_save(uint8 *state) { int bufferptr = 0; if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { bufferptr = YM2612SaveContext(state); } else { save_param(YM2413GetContextPtr(),YM2413GetContextSize()); } save_param(SN76489_GetContextPtr(),SN76489_GetContextSize()); save_param(&fm_cycles_start,sizeof(fm_cycles_start)); return bufferptr; } int sound_context_load(uint8 *state) { int bufferptr = 0; if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { bufferptr = YM2612LoadContext(state); YM2612Config(config.dac_bits); } else { load_param(YM2413GetContextPtr(),YM2413GetContextSize()); } load_param(SN76489_GetContextPtr(),SN76489_GetContextSize()); load_param(&fm_cycles_start,sizeof(fm_cycles_start)); fm_cycles_count = fm_cycles_start; return bufferptr; } void fm_reset(unsigned int cycles) { /* synchronize FM chip with CPU */ fm_update(cycles); /* reset FM chip */ YM_Reset(); } void fm_write(unsigned int cycles, unsigned int address, unsigned int data) { /* synchronize FM chip with CPU (on data port write only) */ if (address & 1) { fm_update(cycles); } /* write FM register */ YM_Write(address, data); } unsigned int fm_read(unsigned int cycles, unsigned int address) { /* synchronize FM chip with CPU */ fm_update(cycles); /* read FM status (YM2612 only) */ return YM2612Read(); } gx/images/Bg_intro_c2.png000664 001750 001750 00000041612 12702465756 016444 0ustar00sergiosergio000000 000000 PNG  IHDR(4LsBIT|d pHYs  ~tEXtCreation Time02/19/09( tEXtSoftwareMacromedia Fireworks MX*$ IDATxy-gU=>9 AAH W風\epx*$W0hHHr2OzZ]j>A}z=O?{wqw fFIIIIhM333{-jX>S/U UkB]eǪ{?EbUVFь:V p 1U{U9JP:*촋cXnm(opy_kDT,Wgv{/V+UYUݎHw?Su,eTs\}p\љCLk;<e}Xc\#Ɗ GkDmxw6|23UljW/zCUTQzک6Gr:n&mqrI/</Bk`.;9mx"E_F! x4pw|+"I-0k.tŤp x:!xh< BϥQ `(Cmt_{n^ !q = eK#(Z%#"0(@yf5ww p3(WtD;sM3|<~=ч?Jľt9 q{7Q"nn ֚@'}kz= bbW9bz,pePjg\ (,5R=!@7 `E r5;R]_N%,=y̗)))s|R>6C<D,|(nl2YX9-+Srx)q EVzUde=L:/ EoU+◫v(o6|F[%)#no>U& ~0$DUp%sJT$ l#F(&eӨzF XK՗볓X[)¶/m'NzW{~c+~x0W{l16kI\^d@?_(s[pܻEZ̤vQ痉y# xIH+Qtj)cJ#С9{PMvz"#):"\L:U9L'S~P-ܗRwi#޻ _xF}4` w.&J5a9{LYv}Qxu}#J?B[I4=V?IyڤWEe π[u5" K]- 1dTz^Xr%!ԭVgBN၄6MeN4{88L3ZC}fyEOwV} uy0<yPvӬ ld.925: Yؾ xklG#|wn:뚿@][#? ޽L4|p:@iZ \e6RYCi+Bs}_QӸg܆|r7f4/B7< gQ\m4t졾I>M&~nʃMOob;$(544i| Y dg]uGWF0{[#ĊiN:ϓO<-vX1OZ+wD($bp>QV:ͻkjzTv FgP}<Ȉ(dD] ٝ5)jf}IkL\cJIILVw0n)@ch-sܮA P=:xN|%֞Kdukpsܑ8N^j> )ztGlqPSshUo[;݊AY>)mۭ(|lH,魄U'A&s)^Dz6Q.vMqgvzxHğ~sp~i`0CrdSeX#G0.M9?X]?LDߎ?L1C!q'"r|xwi*4§y+mD>,ю Fݧ/H \C.֡>$Sֻ=:`r A1[ y:߉(]MScWFHjz~´H,kdgKg?N/?6DS9vnaYd5~ekDXR@$̮b<2gPV|kgޞ{Dȭarw.2\TrWqi 2•8ݣsPQV&r-f3~i'PP YjVŎN(0vbn vk/P[i"1!Y뾡Ui];o&Os?[\MkXH$FZo'22'%I,(N$v|6];~ >VC5MtX#O!MB.E!1sf% T Mnᔕ=D2r7n{f0nUP:Sֿ9*Bem!h; @.kU'%h>M- `Yہ=7g(;\{ >?HqlP 9ؓ黻N|&/#<"by?K]0k ,o=@pUv{+KrOkNP_y%{u [9(u4 @\'uhc}]IyO@~=v q6rAz~esf:h%&w[&+EsM~-vZtҟD͵.n-[~>k~P!L0Y_L/8Rn ~3KabBpm뙣3eec'moi+KA[4s"B];aKVB" )jKvQP .* n>/" Qι Ah~y#!ZUy /WQL9Y,R,ڕcYYN|R+Ykf(.YF^G$2aj=YsO&gWmt?wPqYz3ݙPS?ԥDXr_.SfMH׾NIq4=.M,zL˚= js DyNⲈ:8HRoĸi׎b}i~y[ cN=5ŋI,(#̉GR:I!v ~/",,RgV{w>R+ >in.;#>~{u5IEpnJj۞0J42=2CI~~s{nX14}\<^4VL3vɴ$ĸ]SBǩgU̇ ݛPr!%Ań2FLj/NJ>waztA㚷b2^>!v6-2r\"t:߾˪ %qRu*761edM!BƆk\=ͥf`z2a|:)>罤EE o?[`n%4.$vT Ⱥ[k8q}Y'&(,)(l(t$/fg$vqx;u<$:䜄B۪ߞ,bYWuyvM{Dq |sy_.GwgPڇO"bHP_D"$OL ϐv i;9"8$|s Zlr'zHhǦ]ˡvOu&KNSۮ F>HZ4~@'ōr2tcn a"A닕>OͿ&8 @g;=`&=#B zF.zOnewI/_FF|RN"Tmw gٽ})O MGӼ#uF8ƶ@Mכ8muS^t$eOݞ;#>d(a&.wZi{9 אGss\S/!)'\if7 fR"&9GS𾈘M:@~X~Nm}$L1uB"[ᚷ#~7gLh}vpMB([gew#z lVΘN2ii׼ݗ3ybD) ?d[U=+}2h}N^LS M#oJ\ 0$_@.UBP]d:+~D+Yک5!~:^m\B$G;FY.'Nɞ4'M&Ӎع '8'GQθFewFZf(L_N̋ACi(p!cy!jP4i/qf˄`SL) y40_8p}!x 1&Eo[x l-:^v9i")ļvˉռtbWVvǫ  @Y/[ #]98K:wnsp}yQ @SDha9HUY3ӪkW "n}C~&+)lXj4 @Qn<e+^}dJu}@wJO&m+ EHgjZm$H]&I½'nz3O v`4"ص."I_6vm4`/#O`+ee΀k\ۄ (4q x<w}Dl|o/k T߼5gą7Zy9~e-HT2SYyVϜJ̹ɭ@P\G;~϶G,W%ܺ2GU?š u@N K?Zuz 'ƺ*OSmjy6jߩ$ISo!|nX$:5 '_@ڬ9,ry`"/ĴaowuTOjF0wwftAv41BkarQJ_!PSoޜϙF[P `w2~ݴ<03H"|xW*BLPhf`v&!3]s]VG3v@&bo*߃*"/ 0$+"d0|:~wckd*" IDATX_+qQ>5y" ҮM\NPe CN,ߦzȼvBQmGDTUmZ5G>7ny_)'8Ap Cb z%AS}nldkn8ogW{|Fv(x$Lt}BSs(P@L܄F4dE~,F{aE  bR\wAuՔ b^LI.gѳn;P ֩ӈrTd)YkO'ۊ=ۘE3hki$Zi2(v?S>"̹{uMlahz E#euii 'L}ּQv"SPo}`OY7^^CAcuٸ(j:]3-߻hDt N:Q$ZkbҠoX uwM^< q׮v-J %,.|)rm,ǧrb],X GtJ\!+}Fˡ~(`ԃ.%6{꬚& zߜݻJl"+aʟc6E݇f >dUi}8qBq/e;yէu^*mKm7z曪2O9~jln=DhfA^`$ylOB% ꢶ>lLCԵmFkyJ!ApN@YUR׼ ƕ!( A4s uAZPSfS״ct2(uprAjy!y3 GNzVo'r!.< )vDrgRvV|aD\IY{٥uҴ*"b%/NEB#;r$|9kӨuﲖբٖNg0]۪O/K~wzxղZV&7 cO4.hDS HS!daJ̅3Y ::ؐ]*/f Ц,-GLέFY ggu]ny!$ze+ZZ^GqQ}rdP:SuB+טd[԰RN.rkV`|{ >;N64qz^l)T,J"ч9zP=(u iW`#.\\qpA[&(_  rA֥g_]}Ǡ(H"PIS*Y׈| {ߛo]L}8dLDM>\!C hn<XS 4.r-2}* y ѶlD1<7SSh_R{Ŕ%ԜIq!*.mرq#~6ju/h.mGԁטo'vę4;(IcB=L?pqJrvY7|d NP(Z4ᒆKUH{` NH|#B#z Ё[@Id| L4}}!P"kuIP|Aws$w;s]NqӐ̽>dmh2I<8odŚ7LW2\0ɹAu1Cyl&(V%WI]6i"kyEy"ȋq^UVosS5:p1* ݕG5\ %g*>3xXBwʑH16ds.~7${ ]e{1/NrP֙mEY>N MDm@,"Ho!S:qׇi `)ol*_ɴzuhӤYh>k֤qШ׉wke׎u[^LY1I@a(}wgp2R$(|쭄[oRʂEN./w~HR+Oq Mm# t%.ǟ(<|V2[C)i޽Ms) wVBx80p+Ǡ;=[滑^CX3PqSq+y01ԭZnZ*u#d!l]E}rOJzc49O7BЦc'!gCR4&0Er]/nxxGߺl4-=k))Чy,P!+~k?'V,@`ӌŴ8=b)kMLTCLbڊp{B:b<>Cx 6Z.X.::zV\̵S Ey6 |g18Gju!vȂ BRMwmSq6+ RbN1 Sb.z[YOA(rGC4TE2 מ E["8#,]뢾.)#(l(]i=',(< Yk#k.cPS=8}ƒtN^}f_e&T\qsD4͡dMl鷡GǻK]G˧ܝJ-X4Lw{FFkJ{gPW)H:ք*o҆t{gS#@S V ٢1.-qd;J& %X!.ףyでQd+ZdiCaJꩿ/}^l~(Ł@sH(귟=iޮ%˽$˝9C=.Ҙ)rdIr4dW#m$@`] 0wǔq=@lRF.șF_;mqDrS$Otf:~B {6اAcHent*m%\+ƩC솺xlKVȥD"TV~}ϧ2Ե>0YpJ4  w!x1M>-mΓRXAݤi`.K6)8iC|ֿ9.tfrrok#1 iC65i˧5k^ k$khr7v5!_VcpV&w4Q67D0ןY-Me[\S]bY#ʿR2j_B2K\]=/mշv!TZVclV_ Bo^~&]9 z_܏[_MRA{VZTYaWPub(4^WAAB.<%)b 7+c ٜTVb=Hm K͢:d+ߐ#5ڕvKm=)O֤FH$U>-֛&Go;0\pE/ qu5 q܏F5aM=hn%rМOI*GWZwu Iw=P}Go"4þD7E:]UNEp}>~`II)qnaV1ꡔ-Ώi]/~*}KD3)0*DqLk &0֔<4u21?`{V !휵|.H>FRN7vwϋ5TRwR698[O5WvTanq-PlSb z!%{=V K((є-骧'miY$s1?O܍(#[~ E _xrÄh;K>w,,u| 1- ?K PƶΣVu!v[M.paAy!Ō?|YۨkG3ޮz x1+Jwv!$Wʔ C[a,^ O"A"u 1!*cnkEZ SwwX][K h`9@P.3JX~o#ܧ~rКOhɁ|ܳF#x-8BY}-\A~U꯭[}GcN4eV܏s-/",c(.mwg=W1d=C9Sٟ2GXO񮃄F%3ƼHȰKXMݵ=ڄ G{pLuJ,Ĥ4[~k24̾\ hqqS廋ms}l[M461Fx@)gHɼdmU^GCR!F"v%k @9y}MIUi8PiShn6zonQ) ^ KK[/#PNN?§%k!_A9x(DDy#"+\/K෫b} ԙ6Ng%Euѯֺm0Jn]p>=sH]S7Y|- * u>NXsْ<@Z x2~Y<_7 M|I$1m=Ruv/3uP߉Eyz֪ T*/Gת@F͂ݯyqPmkTPnq2J'`(+o4)ڸ-F@Vn.cuO !qd:0a[ -a>ZowÄY}Iͬٚv)%o-t=3.:'gbN <=Lb/Z^j!&u<"͛,3G} e-i=*ٔ]Ph]IR>Czg[.2d3~x9!KttjB{QJ9C'W:0vk Uf7%U>[c#i/%@oSRֶ@q"~lN@y?q~yuqb1yq2Fp$%"z oBzw5_+]'R q6źLJ}~Ÿ,:;HuB} "&eq^L}NIXLG?:k[qd݁wPm>k:C=E. {7գFOq>mɲJ9*xwk8Mw1j]BuML9T u[?I%뾍:f,;<MW߽-5Ydu69ǬJ cަq9C2 g<ɓヤ,XhMe\^swាq:ֶ֚eBBHj[AْIq,}B^NOw*A-Wt-> +ѻxD ^>a3kػӻo:-aQ}I=WA1>)o_Mݗ޾ ~lʗ`w3T}z/f.f<`em+xmu`ǡk*CZm;ԕ&vB]PfN.hΫVQzga9->ˁ.D<7[!4;D>Hn"V֏H JVY`<6FR,#$?7Q'wu齺opkwpU}WsPIPNwyBu:Lի$DyHc8B>OL 5FuH6>K0YJ:Kt7jbwQ6fj²qI;m@tQ&2b|; fwJ$Ңr~Zg4sܸ`kZ%2*׵YׂTpv[]<Ȥ%/,o`bR@!h^JV7i~ljنG(.ܕ\ 0g >G}3ڪ($@8NB+P<`Wǭ'i1B-KuMkU}mT^*hc4wWzx[%h{%wKqϧVQȂ Ӷb_-=q$*Ss-:鄵 g{܌@ᶲxo{GFs{~9NXx ZhԭLdVJYb1& 0m!5esh+a~r<"T?bdF_Iwdtn&f1/i>;?-41_h*G l@Ys'* ]|sIDATMsuF}Y4+eH 濳*5T]x{$VpHz:q>!kl7D|M@N*o7=M$$@un@`%aFh"ppE D¸_W[[Wv8rpD^I]RFM[Au+l{,sRYb}'a8t"YU[} +y/$[2j=(w7F{"&m&mGV6]ㄶWkY) 2 hDQTuk~az(RT%IbN {Aᧉ^ s7bNYF7S~} )Q ccfN4S$.˫s$L9Dk ":&(II_Ezou: vPWZkVu䮬\2lCe[kʓeQ -7 &'O~(o@" u' J6j4`el&m&mG:pafu+֧7iFXdyDXBkljM A3TMIIII'rD,؇ Xb (IIII%/IENDB`gx/gui/gui.c000664 001750 001750 00000157155 12702465756 014070 0ustar00sergiosergio000000 000000 /**************************************************************************** * gui.c * * generic GUI Engine (using GX rendering) * * Copyright Eke-Eke (2009-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gui.h" #include "font.h" #ifdef HW_RVL gx_texture *w_pointer; #endif u8 SILENT = 0; /* message box */ static gui_message message_box; static lwp_t msgboxthread; /* background color (black) */ static const GXColor bg_color = {0x00,0x00,0x00,0xff}; /****************************************************************************/ /* Generic GUI routines */ /*****************************************************************************/ /* Allocate Menu texture images data */ void GUI_InitMenu(gui_menu *menu) { int i; gui_item *item; gui_butn *button; gui_image *image; /* background elements */ for (i=0; imax_images; i++) { image = &menu->bg_images[i]; image->texture = gxTextureOpenPNG(image->data,0); } for (i=0; i<2; i++) { /* key helpers */ item = menu->helpers[i]; if (item) item->texture = gxTextureOpenPNG(item->data,0); /* arrows */ button = menu->arrows[i]; if (button) { if (!button->data->texture[0]) button->data->texture[0] = gxTextureOpenPNG(button->data->image[0],0); if (!button->data->texture[1]) button->data->texture[1] = gxTextureOpenPNG(button->data->image[1],0); /* initial state */ button->state &= ~BUTTON_VISIBLE; if (((i==0) && (menu->offset != 0)) || ((i==1) && (menu->offset + menu->max_buttons) < menu->max_items)) button->state |= BUTTON_VISIBLE; } } /* menu buttons */ for (i=0; imax_buttons; i++) { button = &menu->buttons[i]; if (button->data) { if (!button->data->texture[0]) button->data->texture[0] = gxTextureOpenPNG(button->data->image[0],0); if (!button->data->texture[1]) button->data->texture[1] = gxTextureOpenPNG(button->data->image[1],0); } } /* menu items */ for (i=0; imax_items; i++) { item = &menu->items[i]; if (item->data) item->texture = gxTextureOpenPNG(item->data,0); } /* update message box */ message_box.parent = menu; } /* Release Menu allocated memory */ void GUI_DeleteMenu(gui_menu *menu) { int i; gui_butn *button; gui_item *item; gui_image *image; /* background elements */ for (i=0; imax_images; i++) { image = &menu->bg_images[i]; gxTextureClose(&image->texture); } for (i=0; i<2; i++) { /* key helpers */ item = menu->helpers[i]; if (item) gxTextureClose(&item->texture); /* arrows */ button = menu->arrows[i]; if (button) { gxTextureClose(&button->data->texture[0]); gxTextureClose(&button->data->texture[1]); } } /* menu buttons */ for (i=0; imax_buttons; i++) { button = &menu->buttons[i]; if (button->data) { gxTextureClose(&button->data->texture[0]); gxTextureClose(&button->data->texture[1]); } } /* menu items */ for (i=0; imax_items; i++) { item = &menu->items[i]; gxTextureClose(&item->texture); } } extern void gxSnapshot(void); /* Draw Menu */ void GUI_DrawMenu(gui_menu *menu) { int i; gui_item *item; gui_butn *button; gui_image *image; /* background color */ if (menu->screenshot) { gxClearScreen((GXColor)BLACK); gxDrawScreenshot(menu->screenshot); } else { gxClearScreen(bg_color); } /* background elements */ for (i=0; imax_images; i++) { image = &menu->bg_images[i]; if (image->state & IMAGE_VISIBLE) { if (image->state & IMAGE_REPEAT) gxDrawTextureRepeat(image->texture,image->x,image->y,image->w,image->h,image->alpha); else gxDrawTexture(image->texture,image->x,image->y,image->w,image->h,image->alpha); } } /* menu title */ FONT_write(menu->title, 22,10,56,640,(GXColor)WHITE); /* draw buttons + items */ for (i=0; imax_buttons; i++) { button = &menu->buttons[i]; if (button->state & BUTTON_VISIBLE) { /* item select (text or image) */ item = (menu->items) ? (&menu->items[menu->offset + i]) : NULL; /* draw button + items */ if ((i == menu->selected) || (button->state & BUTTON_SELECTED)) { if (button->data) gxDrawTexture(button->data->texture[1],button->x-4,button->y-4,button->w+8,button->h+8,255); if (item) { if (item->texture) { gxDrawTexture(item->texture, item->x-4,item->y-4,item->w+8,item->h+8,255); FONT_writeCenter(item->text,18,button->x+4,item->x-4,button->y+(button->h - 36)/2+18,(GXColor)DARK_GREY); } else { FONT_writeCenter(item->text,18,item->x-4,item->x+item->w+4,button->y+(button->h-18)/2+18,(GXColor)DARK_GREY); } } } else { if (button->data) gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); if (item) { if (item->texture) { gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); FONT_writeCenter(item->text,16,button->x+8,item->x,button->y+(button->h - 32)/2+16,(GXColor)DARK_GREY); } else { FONT_writeCenter(item->text,16,item->x,item->x+item->w,button->y+(button->h - 16)/2+16,(GXColor)DARK_GREY); } } } } } /* draw arrow */ for (i=0; i<2; i++) { button = menu->arrows[i]; if (button) { if (button->state & BUTTON_VISIBLE) { if (menu->selected == (menu->max_buttons + i)) gxDrawTexture(button->data->texture[1],button->x-2,button->y-2,button->w+4,button->h+4,255); else gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); } } } /* left comment */ item = menu->helpers[0]; if (item) { if (item->data && strlen(item->comment)) { gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); FONT_write(item->comment,16,item->x+item->w+6,item->y+(item->h-16)/2 + 16,640,(GXColor)WHITE); } } /* right comment */ item = menu->helpers[1]; if (item) { if (item->data && strlen(item->comment)) { gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); FONT_alignRight(item->comment,16,item->x-6,item->y+(item->h-16)/2+16,(GXColor)WHITE); } } if (menu->cb) menu->cb(); } /* Draw Menu with transitions effects */ void GUI_DrawMenuFX(gui_menu *menu, u8 speed, u8 out) { int i,temp,xoffset,yoffset; int max_offset = 0; u8 item_alpha = 255; GXColor text_color = DARK_GREY; gui_item *item; gui_butn *button; gui_image *image; /* find maximal offset */ for (i=0; imax_images; i++) { image = &menu->bg_images[i]; if (image->state & IMAGE_SLIDE_LEFT) { temp = image->x + image->w; if (max_offset < temp) max_offset = temp; } else if (image->state & IMAGE_SLIDE_RIGHT) { temp = 640 - image->x; if (max_offset < temp) max_offset = temp; } if (image->state & IMAGE_SLIDE_TOP) { temp = image->y + image->h; if (max_offset < temp) max_offset = temp; } else if (image->state & IMAGE_SLIDE_BOTTOM) { temp = 480 - image->y; if (max_offset < temp) max_offset = temp; } } temp = max_offset; /* Alpha steps */ int alpha = 0; int alpha_step = (255 * speed) / max_offset; if (out) { alpha = 255; alpha_step = -alpha_step; } /* Let's loop until final position has been reached */ while (temp > 0) { /* background color */ if (menu->screenshot) { gxClearScreen((GXColor)BLACK); if (alpha >= menu->screenshot) gxDrawScreenshot(menu->screenshot); else gxDrawScreenshot(255 - alpha); } else { gxClearScreen(bg_color); } /* background images */ for (i=0; imax_images; i++) { image = &menu->bg_images[i]; /* X offset */ if (image->state & IMAGE_SLIDE_LEFT) xoffset = out ? (temp - max_offset) : (-temp); else if (image->state & IMAGE_SLIDE_RIGHT) xoffset = out ? (max_offset - temp) : (temp); else xoffset = 0; /* Y offset */ if (image->state & IMAGE_SLIDE_TOP) yoffset = out ? (temp - max_offset) : (-temp); else if (image->state & IMAGE_SLIDE_BOTTOM) yoffset = out ? (max_offset - temp) : (temp); else yoffset = 0; /* draw image */ if ((image->state & IMAGE_FADE) && ((out && (image->alpha > alpha)) || (!out && (image->alpha < alpha)))) { /* FADE In-Out */ if (image->state & IMAGE_VISIBLE) { if (image->state & IMAGE_REPEAT) gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha); else gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha); } } else { if (image->state & IMAGE_VISIBLE) { if (image->state & IMAGE_REPEAT) gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha); else gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha); } } } /* menu title */ if ((menu->bg_images[2].state & IMAGE_SLIDE_TOP) || (menu->bg_images[3].state & IMAGE_SLIDE_TOP)) FONT_write(menu->title, 22,10,out ? (56 + temp - max_offset) : (56 - temp),640,(GXColor)WHITE); else FONT_write(menu->title, 22,10,56,640,(GXColor)WHITE); /* draw buttons + items */ for (i=0; imax_buttons; i++) { button = &menu->buttons[i]; if (button->state & BUTTON_VISIBLE) { /* X offset */ if (button->state & BUTTON_SLIDE_LEFT) xoffset = out ? (temp - max_offset) : (-temp); else if (button->state & BUTTON_SLIDE_RIGHT) xoffset = out ? (max_offset - temp) : (temp); else xoffset = 0; /* Y offset */ if (button->state & BUTTON_SLIDE_TOP) yoffset = out ? (temp - max_offset) : (-temp); else if (button->state & BUTTON_SLIDE_BOTTOM) yoffset = out ? (max_offset - temp) : (temp); else yoffset = 0; /* Alpha transparency */ if (button->state & BUTTON_FADE) { item_alpha = alpha; text_color.a = alpha; } else { item_alpha = 255; text_color.a = 255; } /* item select (text or image) */ item = (menu->items) ? (&menu->items[menu->offset + i]) : NULL; /* draw button + items */ if ((i == menu->selected) || (button->state & BUTTON_SELECTED)) { if (button->data) gxDrawTexture(button->data->texture[1],button->x+xoffset-4,button->y+yoffset-4,button->w+8,button->h+8,item_alpha); if (item) { if (item->texture) { gxDrawTexture(item->texture, item->x+xoffset-4,item->y+yoffset-4,item->w+8,item->h+8,item_alpha); FONT_writeCenter(item->text,18,button->x+xoffset+4,item->x+xoffset-4,button->y+yoffset+(button->h - 36)/2+18,text_color); } else { FONT_writeCenter(item->text,18,item->x+xoffset+2,item->x+item->w+xoffset+2,button->y+yoffset+(button->h-18)/2+18,text_color); } } } else { if (button->data) gxDrawTexture(button->data->texture[0],button->x+xoffset,button->y+yoffset,button->w, button->h,item_alpha); if (item) { if (item->texture) { gxDrawTexture(item->texture,item->x+xoffset,item->y+yoffset,item->w,item->h,item_alpha); FONT_writeCenter(item->text,16,button->x+xoffset+8,item->x+xoffset,button->y+yoffset+(button->h - 32)/2+16,text_color); } else { FONT_writeCenter(item->text,16,item->x+xoffset,item->x+item->w+xoffset,button->y+yoffset+(button->h - 16)/2+16,text_color); } } } } } /* draw arrow */ for (i=0; i<2; i++) { button = menu->arrows[i]; if (button) { if (button->state & BUTTON_VISIBLE) { if (menu->selected == (menu->max_buttons + i)) gxDrawTexture(button->data->texture[1],button->x-2,button->y-2,button->w+4,button->h+4,255); else gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); } } } if (!(menu->bg_images[3].state & IMAGE_SLIDE_BOTTOM) && !(menu->bg_images[4].state & IMAGE_SLIDE_BOTTOM)) { /* left comment */ item = menu->helpers[0]; if (item) { if (item->data && strlen(item->comment)) { gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); FONT_write(item->comment,16,item->x+item->w+6,item->y+(item->h-16)/2 + 16,640,(GXColor)WHITE); } } /* right comment */ item = menu->helpers[1]; if (item) { if (item->data && strlen(item->comment)) { gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); FONT_alignRight(item->comment,16,item->x-6,item->y+(item->h-16)/2+16,(GXColor)WHITE); } } } if (menu->cb) menu->cb(); /* update offset */ temp -= speed; /* update alpha */ alpha += alpha_step; if (alpha > 255) alpha = 255; else if (alpha < 0) alpha = 0; /* copy EFB to XFB */ gxSetScreen(); } /* final position */ if (!out) { GUI_DrawMenu(menu); gxSetScreen(); } else if (menu->screenshot) { gxClearScreen((GXColor)BLACK); gxDrawScreenshot(255); gxSetScreen(); } } /* Basic menu title slide effect */ void GUI_SlideMenuTitle(gui_menu *m, int title_offset) { #ifdef HW_RVL gui_butn *button; int i,x,y; #endif char title[64]; strcpy(title,m->title); while (title_offset > 0) { /* update title */ strcpy(m->title,title+title_offset); m->title[strlen(title)-title_offset-1] = 0; /* draw menu */ GUI_DrawMenu(m); #ifdef HW_RVL /* keep pointer active */ if (m_input.ir.valid) { /* get cursor position */ x = m_input.ir.x; y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* check for valid buttons */ m->selected = m->max_buttons + 2; for (i=0; imax_buttons; i++) { button = &m->buttons[i]; if ((button->state & BUTTON_ACTIVE)&&(x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) { m->selected = i; break; } } for (i=0; i<2; i++) { button = m->arrows[i]; if (button) { if (button->state & BUTTON_VISIBLE) { if ((x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) { m->selected = m->max_buttons + i; break; } } } } } #endif gxSetScreen(); usleep(6000); title_offset--; } strcpy(m->title,title); } /* Update current menu */ int GUI_UpdateMenu(gui_menu *menu) { u16 p; int ret = 0; int selected = menu->selected; int max_items = menu->max_items; int max_buttons = menu->max_buttons; gui_butn *button; #ifdef HW_RVL if (Shutdown) { GUI_DeleteMenu(menu); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); } else if (m_input.ir.valid) { /* get cursor position */ int x = m_input.ir.x; int y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* check for valid buttons */ selected = max_buttons + 2; int i; for (i=0; ibuttons[i]; if ((button->state & BUTTON_ACTIVE) && (button->state & BUTTON_VISIBLE)) { if((x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) { selected = i; break; } } } for (i=0; i<2; i++) { button = menu->arrows[i]; if (button) { if ((button->state & BUTTON_ACTIVE) && (button->state & BUTTON_VISIBLE)) { if ((x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) { selected = max_buttons + i; break; } } } } } else { /* reinitialize selection */ if (selected >= menu->max_buttons) { selected = 0; while ((selected < (menu->max_buttons + 2)) && (!(menu->buttons[selected].state & BUTTON_ACTIVE) || !(menu->buttons[selected].state & BUTTON_VISIBLE))) selected++; } } #endif /* update screen */ gxSetScreen(); /* update menu */ p = m_input.keys; if (selected < max_buttons) { button = &menu->buttons[selected]; if (p & PAD_BUTTON_UP) { selected -= button->shift[0]; if (selected < 0) { selected = 0; if (menu->offset) menu->offset --; } } else if (p & PAD_BUTTON_DOWN) { selected += button->shift[1]; if (selected >= max_buttons) { selected = max_buttons - 1; if ((menu->offset + selected) < (max_items - 1)) menu->offset ++; } } else if (p & PAD_BUTTON_LEFT) { selected -= button->shift[2]; if (selected < 0) { selected = 0; if (menu->offset) menu->offset --; } } else if (p & PAD_BUTTON_RIGHT) { selected += button->shift[3]; if (selected >= max_buttons) { selected = max_buttons - 1; if ((menu->offset + selected) < (max_items - 1)) menu->offset ++; } } } if (p & PAD_BUTTON_A) { if (selected < max_buttons) ret = 1; /* menu clicked */ else if (selected == max_buttons) menu->offset --; /* up arrow */ else if (selected == (max_buttons+1)) menu->offset ++; /* down arrow */ } else if ((p & PAD_BUTTON_B) || (p & PAD_TRIGGER_Z)) { /* quit menu */ ret = -1; } /* selected item has changed ? */ if (menu->selected != selected) { if (selected < max_buttons) { /* sound fx */ button = &menu->buttons[selected]; if (button->state & BUTTON_OVER_SFX) { ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); } } else if (selected < (max_buttons + 2)) { /* sound fx */ button = menu->arrows[selected-max_buttons]; if (button->state & BUTTON_OVER_SFX) { ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); } } /* update selection */ menu->selected = selected; } /* update helper comment */ if (menu->helpers[1]) { if ((menu->offset + selected) < max_items) { gui_item *item = &menu->items[menu->offset + selected]; strcpy(menu->helpers[1]->comment,item->comment); } else { strcpy(menu->helpers[1]->comment,""); } } if (ret > 0) { if (selected < max_buttons) { /* sound fx */ button = &menu->buttons[selected]; if (button->state & BUTTON_SELECT_SFX) { ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_select_pcm,button_select_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); } } } return ret; } /* Generic routine to render & update menus */ int GUI_RunMenu(gui_menu *menu) { int update = 0; /* update menu */ while (!update) { GUI_DrawMenu(menu); update = GUI_UpdateMenu(menu); /* update arrows buttons status (items list) */ if (menu->arrows[0]) { if (menu->offset > 0) menu->arrows[0]->state |= BUTTON_VISIBLE; else menu->arrows[0]->state &= ~BUTTON_VISIBLE; } if (menu->arrows[1]) { if ((menu->offset + menu->max_buttons) < menu->max_items) menu->arrows[1]->state |= BUTTON_VISIBLE; else menu->arrows[1]->state &= ~BUTTON_VISIBLE; } } if (update == 2) return (-2-menu->offset-menu->selected); else if (update == 1) return (menu->offset + menu->selected); else return -1; } /* Text Window */ void GUI_TextWindow(gui_menu *parent, char *title, char items[][64], u8 nb_items, u8 fontsize) { int i, quit = 0; #ifdef HW_RVL int x,y; #endif /* initialize window */ gx_texture *window = gxTextureOpenPNG(Frame_s1_png,0); gx_texture *top = gxTextureOpenPNG(Frame_s1_title_png,0); /* window position */ int xwindow = (640 - window->width) /2; int ywindow = (480 - window->height)/2; /* text position */ int ypos = ywindow + top->height + (window->height - top->height - fontsize*nb_items) / 2 + fontsize/2; /* disable helper comment */ const u8 *data = NULL; if (parent->helpers[1]) { data = parent->helpers[1]->data; parent->helpers[1]->data = NULL; } /* slide in */ int yoffset = ywindow + window->height; while (yoffset > 0) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw text */ for (i=0; iwidth,ypos+i*fontsize-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset -= 60; } /* draw menu + text window */ while (quit == 0) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); /* draw text */ for (i=0; iwidth,ypos+i*fontsize,(GXColor)WHITE); } #ifdef HW_RVL if (Shutdown) { gxTextureClose(&window); gxTextureClose(&top); gxTextureClose(&w_pointer); GUI_DeleteMenu(parent); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); } else if (m_input.ir.valid) { /* get cursor position */ x = m_input.ir.x; y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); } #endif /* update screen */ gxSetScreen(); /* wait for exit buttons */ if (m_input.keys) quit = 1; } /* reset initial vertical offset */ /* slide out */ yoffset = 0; while (yoffset < (ywindow + window->height)) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw text */ for (i=0; iwidth,ypos+i*fontsize-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset += 60; } /* restore helper comment */ if (parent->helpers[1]) parent->helpers[1]->data = data; /* final position */ GUI_DrawMenu(parent); gxSetScreen(); /* close textures */ gxTextureClose(&window); gxTextureClose(&top); } /* Option Window (returns selected item) */ int GUI_OptionWindow(gui_menu *parent, char *title, char *infos, char *items[], u8 nb_items) { int i, ret, quit = 0; int old, selected = 0; s16 p; butn_data button; #ifdef HW_RVL int x,y; #endif /* initialize buttons data */ button.texture[0] = gxTextureOpenPNG(Button_text_png,0); button.texture[1] = gxTextureOpenPNG(Button_text_over_png,0); /* initialize texture window */ gx_texture *window = gxTextureOpenPNG(Frame_s1_png,0); gx_texture *top = gxTextureOpenPNG(Frame_s1_title_png,0); /* get initial positions */ int w = button.texture[0]->width; int h = button.texture[0]->height; int xwindow = (640 - window->width)/2; int ywindow = (480 - window->height)/2; int xpos = xwindow + (window->width - w)/2; int ypos = (window->height - top->height - (h*nb_items) - (nb_items-1)*20)/2; ypos = ypos + ywindow + top->height; /* disable helper comment */ const u8 *data = NULL; if (parent->helpers[1]) { data = parent->helpers[1]->data; parent->helpers[1]->data = 0; } /* slide in */ int yoffset = ywindow + window->height; while (yoffset > 0) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw buttons + text */ for (i=0; iwidth,ywindow+window->height-16-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset -= 60; } /* draw menu */ while (quit == 0) { /* draw parent menu (should have been initialized first) */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); /* draw infos */ FONT_writeCenter(infos,16,xwindow,xwindow+window->width,ywindow+window->height-16,(GXColor)WHITE); /* draw buttons + text */ for (i=0; iwidth/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* check for valid buttons */ selected = -1; for (i=0; i=xpos)&&(x<=(xpos+w))&&(y>=ypos+i*(20 + h))&&(y<=(ypos+i*(20+h)+h))) { selected = i; break; } } } else { /* reinitialize selection */ if (selected == -1) selected = 0; } #endif /* update screen */ gxSetScreen(); /* update selection */ if (p & PAD_BUTTON_UP) { if (selected > 0) selected --; } else if (p & PAD_BUTTON_DOWN) { if (selected < (nb_items -1)) selected ++; } /* sound fx */ if (selected != old) { if (selected >= 0) { ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); } } if (p & PAD_BUTTON_A) { if (selected >= 0) { quit = 1; ret = selected; } } else if (p & PAD_BUTTON_B) { quit = 1; ret = -1; } } /* slide out */ yoffset = 0; while (yoffset < (ywindow + window->height)) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window + header */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* draw title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw infos */ FONT_writeCenter(infos,16,xwindow,xwindow+window->width,ywindow+window->height-16-yoffset,(GXColor)WHITE); /* draw buttons + text */ for (i=0; ihelpers[1]) parent->helpers[1]->data = data; /* final position */ GUI_DrawMenu(parent); gxSetScreen(); /* close textures */ gxTextureClose(&window); gxTextureClose(&top); gxTextureClose(&button.texture[0]); gxTextureClose(&button.texture[1]); return ret; } /* Option Box */ void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *option, float step, float min, float max, u8 type) { gx_texture *arrow[2]; arrow[0] = gxTextureOpenPNG(Button_arrow_png,0); arrow[1] = gxTextureOpenPNG(Button_arrow_over_png,0); gx_texture *window = gxTextureOpenPNG(Frame_s2_png,0); gx_texture *top = gxTextureOpenPNG(Frame_s2_title_png,0); /* window position */ int xwindow = 166; int ywindow = 160; /* arrows position */ int xleft = 206; int xright = 392; int yleft = 238; int yright = 238; /* disable action button helper */ if (parent->helpers[1]) parent->helpers[1]->data = 0; /* slide in */ char msg[16]; int yoffset = ywindow + window->height; while (yoffset > 0) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* display title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset -= 60; } /* display option box */ int quit = 0; int modified = 0; int selected = -1; s16 p; #ifdef HW_RVL int x,y; #endif while (!quit) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow,window->width,window->height,225); gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); /* display title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); /* option type */ if (type) { /* integer type */ if (*(s16 *)option < 0) sprintf(msg,"-%d",abs(*(s16 *)option)); else sprintf(msg,"%d",abs(*(s16 *)option)); } else { /* float type */ if (*(float *)option < 0.0) sprintf(msg,"-%1.2f",fabs(*(float *)option)); else sprintf(msg,"%1.2f",fabs(*(float *)option)); } /* draw option text */ FONT_writeCenter(msg,24,xwindow,xwindow+window->width,272,(GXColor)WHITE); /* update inputs */ p = m_input.keys; /* draw buttons */ if (selected < 0) { /* nothing selected */ gxDrawTexture(arrow[0],xleft,yleft,arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[0],xright,yright,arrow[0]->width,arrow[0]->height,180.0,255); } #ifdef HW_RVL else if (selected) { /* right button selected */ gxDrawTexture(arrow[0],xleft,yleft,arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[1],xright-4,yright-4,arrow[1]->width+8,arrow[1]->height+8,180.0,255); } else { /* left button selected */ gxDrawTexture(arrow[1],xleft-4,yleft-4,arrow[1]->width+8,arrow[1]->height+8,255); gxDrawTextureRotate(arrow[0],xright,yright,arrow[0]->width,arrow[0]->height,180.0,255); } selected = -1; if (Shutdown) { gxTextureClose(&arrow[0]); gxTextureClose(&arrow[1]); gxTextureClose(&window); gxTextureClose(&top); gxTextureClose(&w_pointer); GUI_DeleteMenu(parent); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); } else if (m_input.ir.valid) { /* get cursor position */ x = m_input.ir.x; y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* check for valid buttons */ if ((x>=xleft)&&(x<=(xleft+arrow[0]->width))&&(y>=yleft)&&(y<=(yleft+arrow[0]->height))) { selected = 0; if (p & PAD_BUTTON_A) p |= PAD_BUTTON_LEFT; } else if ((x>=xright)&&(x<=(xright+arrow[0]->width))&&(y>=yright)&&(y<=(yright+arrow[0]->height))) { selected = 1; if (p & PAD_BUTTON_A) p |= PAD_BUTTON_RIGHT; } } #endif /* update screen */ gxSetScreen(); /* check input */ if (p&PAD_BUTTON_LEFT) { /* decrement option value */ if (type) { /* integer type */ *(s16 *)option -= (s16)step; if (*(s16 *)option < (s16)min) *(s16 *)option = (s16)max; } else { /* float type */ *(float *)option -= step; if (*(float *)option < min) *(float *)option = max; } modified = 1; } else if (p&PAD_BUTTON_RIGHT) { /* increment option value */ if (type) { /* integer type */ *(s16 *)option += (s16)step; if (*(s16 *)option > (s16)max) *(s16 *)option = (s16)min; } else { /* float type */ *(float *)option += step; if (*(float *)option > max) *(float *)option = min; } modified = 1; } else if (p & PAD_BUTTON_B) { quit = 1; } if (modified) { modified = 0; /* play sound effect */ ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); /* option callback */ if (cb) cb(); } } /* slide out */ yoffset = 0; ; while (yoffset < (ywindow + window->height)) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); /* display title */ FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset += 60; } /* restore action button helper */ if (parent->helpers[1]) parent->helpers[1]->data = Key_A_png; /* final position */ GUI_DrawMenu(parent); gxSetScreen(); /* close textures */ gxTextureClose(&arrow[0]); gxTextureClose(&arrow[1]); gxTextureClose(&window); gxTextureClose(&top); } /* Option Box with two parameters */ void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1, s16 *option_2, s16 step, s16 min, s16 max) { gx_texture *arrow[2]; arrow[0] = gxTextureOpenPNG(Button_arrow_png,0); arrow[1] = gxTextureOpenPNG(Button_arrow_over_png,0); gx_texture *window = gxTextureOpenPNG(Frame_s2_png,0); /* window position */ int xwindow = 166; int ywindow = 160; /* arrows position */ int arrow_pos[4][2] = { {144,218}, {452,218}, {298,138}, {298,298} }; /* disable action button helper */ if (parent->helpers[1]) parent->helpers[1]->data = 0; /* slide in */ char msg[16]; int yoffset = ywindow + window->height; while (yoffset > 0) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); /* update display */ gxSetScreen(); /* slide speed */ yoffset -= 60; } /* display option box */ int quit = 0; int modified = 0; s16 p; #ifdef HW_RVL int selected = -1; int i,x,y; #endif while (!quit) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow,window->width,window->height,225); /* draw options text */ if (*option_1 < 0) sprintf(msg,"%s: -%02d",text_1,abs(*option_1)); else sprintf(msg,"%s: +%02d",text_1,abs(*option_1)); FONT_writeCenter(msg,24,xwindow,xwindow+window->width,240,(GXColor)WHITE); if (*option_2 < 0) sprintf(msg,"%s: -%02d",text_2,abs(*option_2)); else sprintf(msg,"%s: +%02d",text_2,abs(*option_2)); FONT_writeCenter(msg,24,xwindow,xwindow+window->width,264,(GXColor)WHITE); /* update inputs */ p = m_input.keys; /* draw buttons */ #ifdef HW_RVL switch (selected) { case 0: /* left button */ gxDrawTexture(arrow[1],arrow_pos[0][0]-4,arrow_pos[0][1]-4,arrow[0]->width+8,arrow[0]->height+8,255); gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); if (p & PAD_BUTTON_A) p |= PAD_BUTTON_LEFT; break; case 1: /* right button */ gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[1],arrow_pos[1][0]-4,arrow_pos[1][1]-4,arrow[0]->width+8,arrow[0]->height+8,180.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); if (p & PAD_BUTTON_A) p |= PAD_BUTTON_RIGHT; break; case 2: /* up button */ gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); gxDrawTextureRotate(arrow[1],arrow_pos[2][0]-4,arrow_pos[2][1]-4,arrow[0]->width+8,arrow[0]->height+8,90.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); if (p & PAD_BUTTON_A) p |= PAD_BUTTON_UP; break; case 3: /* down button */ gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); gxDrawTextureRotate(arrow[1],arrow_pos[3][0]-4,arrow_pos[3][1]-4,arrow[0]->width+8,arrow[0]->height+8,270.0,255); if (p & PAD_BUTTON_A) p |= PAD_BUTTON_DOWN; break; default: /* nothing selected */ gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); break; } if (Shutdown) { gxTextureClose(&arrow[0]); gxTextureClose(&arrow[1]); gxTextureClose(&window); gxTextureClose(&w_pointer); GUI_DeleteMenu(parent); GUI_FadeOut(); shutdown(); SYS_ResetSystem(SYS_POWEROFF, 0, 0); } /* update selection */ selected = -1; if (m_input.ir.valid) { /* get cursor position */ x = m_input.ir.x; y = m_input.ir.y; /* draw wiimote pointer */ gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); /* check for valid buttons */ for (i=0; i<4; i++) { if ((x>=arrow_pos[i][0])&&(x<=(arrow_pos[i][0]+arrow[0]->width))&&(y>=arrow_pos[i][1])&&(y<=(arrow_pos[i][1]+arrow[0]->height))) selected = i; } } #else gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); #endif /* update screen */ gxSetScreen(); if (p&PAD_BUTTON_LEFT) { /* decrement option 1 value */ *option_1 -= step; if (*option_1 < min) *option_1 = max; modified = 1; } else if (p&PAD_BUTTON_RIGHT) { /* decrement option 1 value */ *option_1 += step; if (*option_1 > max) *option_1 = min; modified = 1; } else if (p&PAD_BUTTON_UP) { /* decrement option 2 value */ *option_2 -= step; if (*option_2 < min) *option_2 = max; modified = 1; } else if (p&PAD_BUTTON_DOWN) { /* increment option 2 value */ *option_2 += step; if (*option_2 > max) *option_2 = min; modified = 1; } else if (p & PAD_BUTTON_B) { quit = 1; } if (modified) { modified = 0; /* play sound effect */ ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); } } /* slide out */ yoffset = 0; ; while (yoffset < (ywindow + window->height)) { /* draw parent menu */ GUI_DrawMenu(parent); /* draw window */ gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); /* update display */ gxSetScreen(); /* slide speed */ yoffset += 60; } /* restore action button helper */ if (parent->helpers[1]) parent->helpers[1]->data = Key_A_png; /* final position */ GUI_DrawMenu(parent); gxSetScreen(); /* close textures */ gxTextureClose(&arrow[0]); gxTextureClose(&arrow[1]); gxTextureClose(&window); } /* Interactive Message Box */ /* Message Box displays a message until a specific action is completed */ /* Message Box LWP Thread */ static void *MsgBox_Thread(gui_message *message_box) { while (message_box->refresh) { /* draw parent menu */ if (message_box->parent) { GUI_DrawMenu(message_box->parent); } else { gxClearScreen(bg_color); } /* draw window */ gxDrawTexture(message_box->window,166,160,message_box->window->width,message_box->window->height,230); gxDrawTexture(message_box->top,166,160,message_box->top->width,message_box->top->height,255); /* draw title */ if (message_box->title) FONT_writeCenter(message_box->title,20,166,166+message_box->window->width,160+(message_box->top->height-20)/2+20,(GXColor)WHITE); /* draw box message */ if (message_box->msg) FONT_writeCenter(message_box->msg,18,166,166+message_box->window->width,248,(GXColor)WHITE); /* draw throbber */ if (message_box->throbber) gxDrawTextureRotate(message_box->throbber,166+(message_box->window->width-message_box->throbber->width)/2,160+message_box->window->height-message_box->throbber->height-20,message_box->throbber->width,message_box->throbber->height,(message_box->progress * 360.0) / 100.0, 255); /* draw exit message */ if (message_box->buttonA) { if (message_box->buttonB) { FONT_writeCenter(" Confirm Cancel ",18,166,166+message_box->window->width,248+18+8,(GXColor)WHITE); gxDrawTexture(message_box->buttonA, 166+56, 248+8+(18-message_box->buttonA->height)/2,message_box->buttonA->width, message_box->buttonA->height,255); gxDrawTexture(message_box->buttonB, 166+166, 248+8+(18-message_box->buttonB->height)/2,message_box->buttonB->width, message_box->buttonB->height,255); } else { FONT_writeCenter("Press to continue.",18,166,166+message_box->window->width,248+18+4,(GXColor)WHITE); gxDrawTexture(message_box->buttonA, 166+116, 248+4+(18-message_box->buttonA->height)/2,message_box->buttonA->width, message_box->buttonA->height,255); } } /* update display */ gxSetScreen(); /* update progression */ message_box->progress++; if (message_box->progress > 100) message_box->progress = 0; usleep(10); } return 0; } /* update current Message Box */ void GUI_MsgBoxUpdate(char *title, char *msg) { if (title) strncpy(message_box.title,title,64); if (msg) strncpy(message_box.msg,msg,64); } /* setup current Message Box */ void GUI_MsgBoxOpen(char *title, char *msg, bool throbber) { if (SILENT) return; /* update text */ GUI_MsgBoxUpdate(title,msg); /* ensure we are not already running */ if (!message_box.refresh) { /* initialize default textures */ message_box.window = gxTextureOpenPNG(Frame_s2_png,0); message_box.top = gxTextureOpenPNG(Frame_s2_title_png,0); if (throbber) message_box.throbber = gxTextureOpenPNG(Frame_throbber_png,0); /* window position */ int xwindow = 166; int ywindow = 160; int ypos = 248; /* disable helper comments */ if (message_box.parent) { if (message_box.parent->helpers[0]) message_box.parent->helpers[0]->data = 0; if (message_box.parent->helpers[1]) message_box.parent->helpers[1]->data = 0; } /* slide in */ int yoffset = ywindow + message_box.window->height; while (yoffset > 0) { /* draw parent menu */ if (message_box.parent) { GUI_DrawMenu(message_box.parent); } else { gxClearScreen(bg_color); } /* draw window */ gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230); gxDrawTexture(message_box.top,xwindow,ywindow-yoffset,message_box.top->width,message_box.top->height,255); /* draw title */ if (title) FONT_writeCenter(title,20,xwindow,xwindow+message_box.window->width,ywindow+(message_box.top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw box message */ if (msg) FONT_writeCenter(msg,18,xwindow,xwindow+message_box.window->width,ypos-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset -= 60; } /* create LWP thread for MessageBox refresh */ message_box.refresh = TRUE; LWP_CreateThread (&msgboxthread, (void *)MsgBox_Thread, &message_box, NULL, 0, 70); } } /* Close current messagebox */ void GUI_MsgBoxClose(void) { if (message_box.refresh) { /* suspend MessageBox refresh */ message_box.refresh = FALSE; LWP_JoinThread(msgboxthread, NULL); /* window position */ int xwindow = 166; int ywindow = 160; int ypos = 248; /* slide out */ int yoffset = 0; while (yoffset < (ywindow + message_box.window->height)) { /* draw parent menu */ if (message_box.parent) { GUI_DrawMenu(message_box.parent); } else { gxClearScreen(bg_color); } /* draw window */ gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230); gxDrawTexture(message_box.top,xwindow,ywindow-yoffset,message_box.top->width,message_box.top->height,255); /* draw title */ if (message_box.title) FONT_writeCenter(message_box.title,20,xwindow,xwindow+message_box.window->width,ywindow+(message_box.top->height-20)/2+20-yoffset,(GXColor)WHITE); /* draw text */ if (message_box.msg) FONT_writeCenter(message_box.msg,18,xwindow,xwindow+message_box.window->width,ypos-yoffset,(GXColor)WHITE); /* update display */ gxSetScreen(); /* slide speed */ yoffset += 60; } if (message_box.parent) { /* restore helper comment */ if (message_box.parent->helpers[0]) message_box.parent->helpers[0]->data = Key_B_png; if (message_box.parent->helpers[1]) message_box.parent->helpers[1]->data = Key_A_png; /* final position */ GUI_DrawMenu(message_box.parent); } else { gxClearScreen(bg_color); } gxSetScreen(); /* clear all textures */ gxTextureClose(&message_box.window); gxTextureClose(&message_box.top); gxTextureClose(&message_box.buttonA); gxTextureClose(&message_box.buttonB); gxTextureClose(&message_box.throbber); } } void GUI_WaitPrompt(char *title, char *msg) { if (SILENT) return; /* clear unused texture */ gxTextureClose(&message_box.throbber); /* open or update message box */ GUI_MsgBoxOpen(title, msg, 0); /* allocate texture */ message_box.buttonA = gxTextureOpenPNG(Key_A_png,0); /* wait for button A */ while (m_input.keys & PAD_BUTTON_A) VIDEO_WaitVSync(); while (!(m_input.keys & PAD_BUTTON_A)) VIDEO_WaitVSync(); /* always close message box */ GUI_MsgBoxClose(); } int GUI_WaitConfirm(char *title, char *msg) { /* clear unused texture */ gxTextureClose(&message_box.throbber); /* open or update message box */ GUI_MsgBoxOpen(title, msg, 0); /* allocate texture */ message_box.buttonA = gxTextureOpenPNG(Key_A_png,0); message_box.buttonB = gxTextureOpenPNG(Key_B_png,0); /* wait for button A or Button B*/ while (m_input.keys & (PAD_BUTTON_A | PAD_BUTTON_B)) VIDEO_WaitVSync(); while (!(m_input.keys & (PAD_BUTTON_A | PAD_BUTTON_B))) VIDEO_WaitVSync(); int ret = m_input.keys & PAD_BUTTON_A; /* always close message box */ GUI_MsgBoxClose(); return ret; } /* Basic Fading */ void GUI_FadeOut() { int alpha = 0; while (alpha < 256) { gxDrawRectangle(0, 0, 640, 480, alpha, (GXColor)BLACK); gxSetScreen(); alpha +=3; } } core/io_ctrl.h000664 001750 001750 00000006074 12702465756 014463 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * I/O controller * * Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _IO_CTRL_H_ #define _IO_CTRL_H_ #define IO_RESET_HI 0x10 #define IO_CONT1_HI 0x20 #define REGION_JAPAN_NTSC 0x00 #define REGION_JAPAN_PAL 0x40 #define REGION_USA 0x80 #define REGION_EUROPE 0xC0 /* Global variables */ extern uint8 io_reg[0x10]; extern uint8 region_code; /* Function prototypes */ extern void io_init(void); extern void io_reset(void); extern void io_68k_write(unsigned int offset, unsigned int data); extern unsigned int io_68k_read(unsigned int offset); extern void io_z80_write(unsigned int offset, unsigned int data, unsigned int cycles); extern unsigned int io_z80_read(unsigned int offset); extern void io_gg_write(unsigned int offset, unsigned int data); extern unsigned int io_gg_read(unsigned int offset); #endif /* _IO_CTRL_H_ */ core/sound/sound.h000664 001750 001750 00000005240 12702465756 015302 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sound Hardware * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _SOUND_H_ #define _SOUND_H_ /* Function prototypes */ extern void sound_init(void); extern void sound_reset(void); extern int sound_context_save(uint8 *state); extern int sound_context_load(uint8 *state); extern int sound_update(unsigned int cycles); extern void fm_reset(unsigned int cycles); extern void fm_write(unsigned int cycles, unsigned int address, unsigned int data); extern unsigned int fm_read(unsigned int cycles, unsigned int address); #endif /* _SOUND_H_ */ core/input_hw/graphic_board.h000664 001750 001750 00000004443 12702465756 017447 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Graphic board support * * Copyright (C) 2017 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GRAPHIC_H_ #define _GRAPHIC_H_ /* Function prototypes */ extern void graphic_board_reset(int port); extern unsigned char graphic_board_read(void); extern void graphic_board_write(unsigned char data, unsigned char mask); #endif core/tremor/res012.c000664 001750 001750 00000022065 12702465756 015345 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: residue backend 0, 1 and 2 implementation ********************************************************************/ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "registry.h" #include "codebook.h" #include "misc.h" #include "os.h" #include "block.h" typedef struct { vorbis_info_residue0 *info; int map; int parts; int stages; codebook *fullbooks; codebook *phrasebook; codebook ***partbooks; int partvals; int **decodemap; } vorbis_look_residue0; void res0_free_info(vorbis_info_residue *i){ vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; if(info){ memset(info,0,sizeof(*info)); _ogg_free(info); } } void res0_free_look(vorbis_look_residue *i){ int j; if(i){ vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; for(j=0;jparts;j++) if(look->partbooks[j])_ogg_free(look->partbooks[j]); _ogg_free(look->partbooks); for(j=0;jpartvals;j++) _ogg_free(look->decodemap[j]); _ogg_free(look->decodemap); memset(look,0,sizeof(*look)); _ogg_free(look); } } static int ilog(unsigned int v){ int ret=0; while(v){ ret++; v>>=1; } return(ret); } static int icount(unsigned int v){ int ret=0; while(v){ ret+=v&1; v>>=1; } return(ret); } /* vorbis_info is for range checking */ vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ int j,acc=0; vorbis_info_residue0 *info=(vorbis_info_residue0 *)_ogg_calloc(1,sizeof(*info)); codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; info->begin=oggpack_read(opb,24); info->end=oggpack_read(opb,24); info->grouping=oggpack_read(opb,24)+1; info->partitions=oggpack_read(opb,6)+1; info->groupbook=oggpack_read(opb,8); for(j=0;jpartitions;j++){ int cascade=oggpack_read(opb,3); if(oggpack_read(opb,1)) cascade|=(oggpack_read(opb,5)<<3); info->secondstages[j]=cascade; acc+=icount(cascade); } for(j=0;jbooklist[j]=oggpack_read(opb,8); if(info->groupbook>=ci->books)goto errout; for(j=0;jbooklist[j]>=ci->books)goto errout; return(info); errout: res0_free_info(info); return(NULL); } vorbis_look_residue *res0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, vorbis_info_residue *vr){ vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; int j,k,acc=0; int dim; int maxstage=0; look->info=info; look->map=vm->mapping; look->parts=info->partitions; look->fullbooks=ci->fullbooks; look->phrasebook=ci->fullbooks+info->groupbook; dim=look->phrasebook->dim; look->partbooks=(codebook ***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); for(j=0;jparts;j++){ int stages=ilog(info->secondstages[j]); if(stages){ if(stages>maxstage)maxstage=stages; look->partbooks[j]=(codebook **)_ogg_calloc(stages,sizeof(*look->partbooks[j])); for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; #ifdef TRAIN_RES look->training_data[k][j]=calloc(look->partbooks[j][k]->entries, sizeof(***look->training_data)); #endif } } } look->partvals=look->parts; for(j=1;jpartvals*=look->parts; look->stages=maxstage; look->decodemap=(int **)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); for(j=0;jpartvals;j++){ long val=j; long mult=look->partvals/look->parts; look->decodemap[j]=(int *)_ogg_malloc(dim*sizeof(*look->decodemap[j])); for(k=0;kparts; look->decodemap[j][k]=deco; } } return(look); } /* a truncated packet here just means 'stop working'; it's not an error */ static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl, ogg_int32_t **in,int ch, long (*decodepart)(codebook *, ogg_int32_t *, oggpack_buffer *,int,int)){ long i,j,k,l,s; vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; vorbis_info_residue0 *info=look->info; /* move all this setup out later */ int samples_per_partition=info->grouping; int partitions_per_word=look->phrasebook->dim; int max=vb->pcmend>>1; int end=(info->endend:max); int n=end-info->begin; if(n>0){ int partvals=n/samples_per_partition; int partwords=(partvals+partitions_per_word-1)/partitions_per_word; int ***partword=(int ***)alloca(ch*sizeof(*partword)); for(j=0;jstages;s++){ /* each loop decodes on partition codeword containing partitions_pre_word partitions */ for(i=0,l=0;iphrasebook,&vb->opb); if(temp==-1)goto eopbreak; partword[j][l]=look->decodemap[temp]; if(partword[j][l]==NULL)goto errout; } } /* now we decode residual values for the partitions */ for(k=0;kbegin+i*samples_per_partition; if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; if(stagebook){ if(decodepart(stagebook,in[j]+offset,&vb->opb, samples_per_partition,-8)==-1)goto eopbreak; } } } } } } errout: eopbreak: return(0); } int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, ogg_int32_t **in,int *nonzero,int ch){ int i,used=0; for(i=0;iinfo; /* move all this setup out later */ int samples_per_partition=info->grouping; int partitions_per_word=look->phrasebook->dim; int max=(vb->pcmend*ch)>>1; int end=(info->endend:max); int n=end-info->begin; if(n>0){ int partvals=n/samples_per_partition; int partwords=(partvals+partitions_per_word-1)/partitions_per_word; int **partword=(int **)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); int beginoff=info->begin/ch; for(i=0;istages;s++){ for(i=0,l=0;iphrasebook,&vb->opb); if(temp==-1)goto eopbreak; partword[l]=look->decodemap[temp]; if(partword[l]==NULL)goto errout; } /* now we decode residual values for the partitions */ for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; if(stagebook){ if(vorbis_book_decodevv_add(stagebook,in, i*samples_per_partition+beginoff,ch, &vb->opb, samples_per_partition,-8)==-1) goto eopbreak; } } } } } errout: eopbreak: return(0); } vorbis_func_residue residue0_exportbundle={ &res0_unpack, &res0_look, &res0_free_info, &res0_free_look, &res0_inverse }; vorbis_func_residue residue1_exportbundle={ &res0_unpack, &res0_look, &res0_free_info, &res0_free_look, &res1_inverse }; vorbis_func_residue residue2_exportbundle={ &res0_unpack, &res0_look, &res0_free_info, &res0_free_look, &res2_inverse }; gx/images/Ctrl_gamepad.png000664 001750 001750 00000010513 12702465756 016673 0ustar00sergiosergio000000 000000 PNG  IHDRD\זDsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time03/16/14)H~IDATx}WY?wݻf7KiiNL___:n J# VY;耴UQP*G0$ m $- @چycyٗ/yrwݛ4:y|<9gZK(E; u P 2[3{I͎<xrcT4!?#g:G=f8Q I_>|؁z_Eѻ~3w!KK&"(F0;3>1٥xx]o(=W Ul^@~gA)*ؽ,;<,]RFPr|3(ڳ?glkv]j]FZ`zO#'cyqĒ;. \2 #`١4 M{]q߁e U!Ҡaw<)]SR&d,B5~x5 +?Dp>hP(f ,e󿂜d I/s,,&/H Kp`j}9G$bvːD$PVA`?E|i"-HCxEٽVchx X^O&\y~g J <<=WC|4j( 3D}3i0DhĴ+Pc[&TDή `xŔ?_&3|ʭ[(㦰 +e0E-F hd{5+w^kw= <pCtxp-G#Q)]U7q&ĎOonrK3}bw8-OF rXcƑ ϢjB);Ih}[N[+JʥN)[=EP`H7.LGekx(}'JmuQBcبSdjۑ/"f2~e>,Vh9]+WnSX#hҞb(WѢ 1c rgG}p?{YJzK8w鴊 LV\DCo5 f;Vo8z4fF3r$2+ \m7@L}tۋ|_4@ZMỬDiibDɞsgd7vQ0SA`Ot Ē}T l<a u1G_~9soqBp:ր))L2 cٙ2yw̎)!fB_1=?@==40ܑw8 s!7r!jtq0;JbhtTgۿu_~ 9Df  bŗ) uF0ݰ9oA@#β݋{8mpC3l}mzQgEN)/Z?J:AQ`u_-wrI=(2/eU 4d-߲)_2VZhY"9] /`c805&Lg̈́SNOE4;;V)ߎUG~ȡ@hC[w C3:TDv)w):)S |ΚVk<=J3(D_gw"AsPǭ{[P94Y]A$]!ێDwܬWLڊ2zk}@ZۭU4,zy@a^`15j5 VwK 3dQ1dE#I.[ʾ]^2a>d85i)z5` YNkz֣pzQvkQY.A_'ŦO}ƩChE l5I:luE "Df+a;aGNq19k>h-CN;G7W0=@|#lM /;E{"姐ᾦ͎2bE]6060 &mAm]{[6`1}}p@PYcVVNчIH1a߬@9`ߵGəOV 1m/7pVn7)Eľ%LM' #OD/ FX; at6@}B3]n h3EJu?}ViBۋV)(L~ iOd󔓆x@.dN%$,?n )룓XsI ]bߞ-c| 9UH' kHV%#ⵏ ' .Cz4,0} il&^# SϢ`׷1vvݼ>7/vŀx !yUklEWYclr>C~2duv0<A`-wVhĸ{3PQ!x[c Fu%kشr8e 7ŀdco",wFMABT $, _T 3AxZQOpہ@oax]~x F+j\Lg(V؇".p;`y Ǭ1ǝ*\c`;pLvCŠK2NU(gE3hk#%Ö±: ]'A !܏$ʈנٲWxwyx`: {'g*t9mA=~=,/Em9JbV[UX!y/^`rPDSR sYODgY0 {)ų3G{'KxG^^DQ{\6j*zk+(ϡx/#$.saGvlz6\f4l{Dc좖ِ[4 <ӷL^Yy٤;̹PJIR1@ĎP~Q\m}(_R E{(漟'q<ia!y~%,KdxΡa\r.;=(}al;}L[vyv GY(?%F4VEC(;Ђ/^+^ i& i& i& i& i& i& i& i& i& i& i+wI܄6Nt,d}$IS/s(I~r$MӝIXe!.7>2Gߣ ч6n1@ۢg;N$IFN4}4I܅4M Il6g stؘ::~<qOiFOYW]v{*0lNӴwG7Yuuzy Z>ww:'I9:;M~3\1VlY3$χY#Ҙv;4?܊i깳ߚ-Y1Co7P{$B0җcng΀:tJ]fboDL? @4ݞ$=VNr[$7S#7w)a2g5!:ܓ$Ƀѻ;rtɕYC$Ir#z\~IENDB`core/io_ctrl.c000664 001750 001750 00000036631 12702465756 014460 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * I/O controller (Genesis & Master System modes) * * Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gamepad.h" #include "lightgun.h" #include "mouse.h" #include "activator.h" #include "xe_1ap.h" #include "teamplayer.h" #include "paddle.h" #include "sportspad.h" #include "graphic_board.h" uint8 io_reg[0x10]; uint8 region_code = REGION_USA; static struct port_t { void (*data_w)(unsigned char data, unsigned char mask); unsigned char (*data_r)(void); } port[3]; static void dummy_write(unsigned char data, unsigned char mask) { } static unsigned char dummy_read(void) { return 0x7F; } /***************************************************************************** * I/O chip initialization * * * *****************************************************************************/ void io_init(void) { /* Initialize connected peripherals */ input_init(); /* Initialize IO Ports handlers & connected peripherals */ switch (input.system[0]) { case SYSTEM_GAMEPAD: { port[0].data_w = (input.dev[0] == DEVICE_PAD2B) ? dummy_write : gamepad_1_write; port[0].data_r = gamepad_1_read; break; } case SYSTEM_MOUSE: { port[0].data_w = mouse_write; port[0].data_r = mouse_read; break; } case SYSTEM_ACTIVATOR: { port[0].data_w = activator_1_write; port[0].data_r = activator_1_read; break; } case SYSTEM_XE_1AP: { port[0].data_w = xe_1ap_1_write; port[0].data_r = xe_1ap_1_read; break; } case SYSTEM_WAYPLAY: { port[0].data_w = wayplay_1_write; port[0].data_r = wayplay_1_read; break; } case SYSTEM_TEAMPLAYER: { port[0].data_w = teamplayer_1_write; port[0].data_r = teamplayer_1_read; break; } case SYSTEM_MASTERTAP: { port[0].data_w = mastertap_1_write; port[0].data_r = mastertap_1_read; break; } case SYSTEM_LIGHTPHASER: { port[0].data_w = dummy_write; port[0].data_r = phaser_1_read; break; } case SYSTEM_PADDLE: { port[0].data_w = paddle_1_write; port[0].data_r = paddle_1_read; break; } case SYSTEM_SPORTSPAD: { port[0].data_w = sportspad_1_write; port[0].data_r = sportspad_1_read; break; } case SYSTEM_GRAPHIC_BOARD: { port[0].data_w = graphic_board_write; port[0].data_r = graphic_board_read; break; } default: { port[0].data_w = dummy_write; port[0].data_r = dummy_read; break; } } switch (input.system[1]) { case SYSTEM_GAMEPAD: { port[1].data_w = (input.dev[4] == DEVICE_PAD2B) ? dummy_write : gamepad_2_write; port[1].data_r = gamepad_2_read; break; } case SYSTEM_MOUSE: { port[1].data_w = mouse_write; port[1].data_r = mouse_read; break; } case SYSTEM_XE_1AP: { port[1].data_w = xe_1ap_2_write; port[1].data_r = xe_1ap_2_read; break; } case SYSTEM_ACTIVATOR: { port[1].data_w = activator_2_write; port[1].data_r = activator_2_read; break; } case SYSTEM_MENACER: { port[1].data_w = dummy_write; port[1].data_r = menacer_read; break; } case SYSTEM_JUSTIFIER: { port[1].data_w = justifier_write; port[1].data_r = justifier_read; break; } case SYSTEM_WAYPLAY: { port[1].data_w = wayplay_2_write; port[1].data_r = wayplay_2_read; break; } case SYSTEM_TEAMPLAYER: { port[1].data_w = teamplayer_2_write; port[1].data_r = teamplayer_2_read; break; } case SYSTEM_MASTERTAP: { port[1].data_w = mastertap_2_write; port[1].data_r = mastertap_2_read; break; } case SYSTEM_LIGHTPHASER: { port[1].data_w = dummy_write; port[1].data_r = phaser_2_read; break; } case SYSTEM_PADDLE: { port[1].data_w = paddle_2_write; port[1].data_r = paddle_2_read; break; } case SYSTEM_SPORTSPAD: { port[1].data_w = sportspad_2_write; port[1].data_r = sportspad_2_read; break; } case SYSTEM_GRAPHIC_BOARD: { port[1].data_w = graphic_board_write; port[1].data_r = graphic_board_read; break; } default: { port[1].data_w = dummy_write; port[1].data_r = dummy_read; break; } } /* External Port (unconnected) */ port[2].data_w = dummy_write; port[2].data_r = dummy_read; } void io_reset(void) { /* Reset I/O registers */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { io_reg[0x00] = region_code | (config.bios & 1); io_reg[0x01] = 0x00; io_reg[0x02] = 0x00; io_reg[0x03] = 0x00; io_reg[0x04] = 0x00; io_reg[0x05] = 0x00; io_reg[0x06] = 0x00; io_reg[0x07] = 0xFF; io_reg[0x08] = 0x00; io_reg[0x09] = 0x00; io_reg[0x0A] = 0xFF; io_reg[0x0B] = 0x00; io_reg[0x0C] = 0x00; io_reg[0x0D] = 0xFB; io_reg[0x0E] = 0x00; io_reg[0x0F] = 0x00; /* CD unit detection */ if (system_hw != SYSTEM_MCD) { io_reg[0x00] |= 0x20; } } else { /* Game Gear specific registers */ io_reg[0x00] = 0x80 | (region_code >> 1); io_reg[0x01] = 0x00; io_reg[0x02] = 0xFF; io_reg[0x03] = 0x00; io_reg[0x04] = 0xFF; io_reg[0x05] = 0x00; io_reg[0x06] = 0xFF; /* initial !RESET input */ io_reg[0x0D] = IO_RESET_HI; /* default !CONT input */ if (system_hw != SYSTEM_PBC) { io_reg[0x0D] |= IO_CONT1_HI; } /* Control registers */ io_reg[0x0E] = 0x00; io_reg[0x0F] = 0xFF; /* on SG-1000 & Mark-III, TH is not connected (always return 1) */ if (system_hw < SYSTEM_SMS) { io_reg[0x0F] = 0xF5; } } /* Reset connected peripherals */ input_reset(); } /***************************************************************************** * I/O ports access from 68k (Genesis mode) * * * *****************************************************************************/ void io_68k_write(unsigned int offset, unsigned int data) { switch (offset) { case 0x01: /* Port A Data */ case 0x02: /* Port B Data */ case 0x03: /* Port C Data */ { io_reg[offset] = data; port[offset-1].data_w(data, io_reg[offset + 3]); return; } case 0x04: /* Port A Ctrl */ case 0x05: /* Port B Ctrl */ case 0x06: /* Port C Ctrl */ { if (data != io_reg[offset]) { io_reg[offset] = data; port[offset-4].data_w(io_reg[offset-3], data); } return; } case 0x07: /* Port A TxData */ case 0x0A: /* Port B TxData */ case 0x0D: /* Port C TxData */ { io_reg[offset] = data; return; } case 0x09: /* Port A S-Ctrl */ case 0x0C: /* Port B S-Ctrl */ case 0x0F: /* Port C S-Ctrl */ { io_reg[offset] = data & 0xF8; return; } default: /* Read-only ports */ { return; } } } unsigned int io_68k_read(unsigned int offset) { switch(offset) { case 0x01: /* Port A Data */ case 0x02: /* Port B Data */ case 0x03: /* Port C Data */ { unsigned int mask = 0x80 | io_reg[offset + 3]; unsigned int data = port[offset-1].data_r(); return (io_reg[offset] & mask) | (data & ~mask); } default: /* return register value */ { return io_reg[offset]; } } } /***************************************************************************** * I/O ports access from Z80 * * * *****************************************************************************/ void io_z80_write(unsigned int offset, unsigned int data, unsigned int cycles) { /* I/O Control register */ if (offset) { /* Bit Function -------------- D7 : Port B TH pin output level (1=high, 0=low) D6 : Port B TR pin output level (1=high, 0=low) D5 : Port A TH pin output level (1=high, 0=low) D4 : Port A TR pin output level (1=high, 0=low) D3 : Port B TH pin direction (1=input, 0=output) D2 : Port B TR pin direction (1=input, 0=output) D1 : Port A TH pin direction (1=input, 0=output) D0 : Port A TR pin direction (1=input, 0=output) */ /* Send TR/TH state to connected peripherals */ port[0].data_w((data << 1) & 0x60, (~data << 5) & 0x60); port[1].data_w((data >> 1) & 0x60, (~data << 3) & 0x60); /* Japanese model specific */ if (region_code == REGION_JAPAN_NTSC) { /* Reading TH & TR pins always return 0 when set as output */ data &= 0x0F; } /* Check for TH low-to-high transitions on both ports */ if ((!(io_reg[0x0F] & 0x80) && (data & 0x80)) || (!(io_reg[0x0F] & 0x20) && (data & 0x20))) { /* Latch new HVC */ hvc_latch = hctab[cycles % MCYCLES_PER_LINE] | 0x10000; } /* Update I/O Control register */ io_reg[0x0F] = data; } else { /* Memory Control register */ io_reg[0x0E] = data; /* Switch cartridge & BIOS ROM */ sms_cart_switch(~data); } } unsigned int io_z80_read(unsigned int offset) { /* Read port A & port B input data */ unsigned int data = (port[0].data_r()) | (port[1].data_r() << 8); /* I/O control register value */ unsigned int ctrl = io_reg[0x0F]; /* I/O ports */ if (offset) { /* Bit Function -------------- D7 : Port B TH pin input D6 : Port A TH pin input D5 : CONT input (0 on Mega Drive hardware, 1 otherwise) D4 : RESET button (1: default, 0: pressed, only on Master System hardware) D3 : Port B TR pin input D2 : Port B TL pin input D1 : Port B Right pin input D0 : Port B Left pin input */ data = ((data >> 10) & 0x0F) | (data & 0x40) | ((data >> 7) & 0x80) | io_reg[0x0D]; /* clear !RESET input */ io_reg[0x0D] |= IO_RESET_HI; /* Adjust port B TH state if configured as output */ if (!(ctrl & 0x08)) { data &= ~0x80; data |= (ctrl & 0x80); } /* Adjust port A TH state if configured as output */ if (!(ctrl & 0x02)) { data &= ~0x40; data |= ((ctrl & 0x20) << 1); } /* Adjust port B TR state if configured as output */ if (!(ctrl & 0x04)) { data &= ~0x08; data |= ((ctrl & 0x40) >> 3); } } else { /* Bit Function -------------- D7 : Port B Down pin input D6 : Port B Up pin input D5 : Port A TR pin input D4 : Port A TL pin input D3 : Port A Right pin input D2 : Port A Left pin input D1 : Port A Down pin input D0 : Port A Up pin input */ data = (data & 0x3F) | ((data >> 2) & 0xC0); /* Adjust port A TR state if configured as output */ if (!(ctrl & 0x01)) { data &= ~0x20; data |= ((ctrl & 0x10) << 1); } } return data; } /***************************************************************************** * Game Gear communication ports access * * * *****************************************************************************/ void io_gg_write(unsigned int offset, unsigned int data) { switch (offset) { case 1: /* Parallel data register */ io_reg[1] = data; return; case 2: /* Data direction register and NMI enable */ io_reg[2] = data; return; case 3: /* Transmit data buffer */ io_reg[3] = data; return; case 5: /* Serial control (bits 0-2 are read-only) */ io_reg[5] = data & 0xF8; return; case 6: /* PSG Stereo output control */ io_reg[6] = data; SN76489_Config(Z80.cycles, config.psg_preamp, config.psgBoostNoise, data); return; default: /* Read-only */ return; } } unsigned int io_gg_read(unsigned int offset) { switch (offset) { case 0: /* Mode Register */ return (io_reg[0] & ~(input.pad[0] & INPUT_START)); case 1: /* Parallel data register (not connected) */ return ((io_reg[1] & ~(io_reg[2] & 0x7F)) | (io_reg[2] & 0x7F)); case 2: /* Data direction register and NMI enable */ return io_reg[2]; case 3: /* Transmit data buffer */ return io_reg[3]; case 4: /* Receive data buffer */ return io_reg[4]; case 5: /* Serial control */ return io_reg[5]; default: /* Write-Only */ return 0xFF; } } core/ntsc/md_ntsc.h000664 001750 001750 00000013716 12702465756 015427 0ustar00sergiosergio000000 000000 /* Sega Genesis/Mega Drive NTSC video filter */ /* md_ntsc 0.1.2 */ #ifndef MD_NTSC_H #define MD_NTSC_H #include "md_ntsc_config.h" #ifdef __cplusplus extern "C" { #endif /* Image parameters, ranging from -1.0 to 1.0. Actual internal values shown in parenthesis and should remain fairly stable in future versions. */ typedef struct md_ntsc_setup_t { /* Basic parameters */ double hue; /* -1 = -180 degrees +1 = +180 degrees */ double saturation; /* -1 = grayscale (0.0) +1 = oversaturated colors (2.0) */ double contrast; /* -1 = dark (0.5) +1 = light (1.5) */ double brightness; /* -1 = dark (0.5) +1 = light (1.5) */ double sharpness; /* edge contrast enhancement/blurring */ /* Advanced parameters */ double gamma; /* -1 = dark (1.5) +1 = light (0.5) */ double resolution; /* image resolution */ double artifacts; /* artifacts caused by color changes */ double fringing; /* color artifacts caused by brightness changes */ double bleed; /* color bleed (color resolution reduction) */ float const* decoder_matrix; /* optional RGB decoder matrix, 6 elements */ unsigned char* palette_out; /* optional RGB palette out, 3 bytes per color */ } md_ntsc_setup_t; /* Video format presets */ extern md_ntsc_setup_t const md_ntsc_composite; /* color bleeding + artifacts */ extern md_ntsc_setup_t const md_ntsc_svideo; /* color bleeding only */ extern md_ntsc_setup_t const md_ntsc_rgb; /* crisp image */ extern md_ntsc_setup_t const md_ntsc_monochrome;/* desaturated + artifacts */ enum { md_ntsc_palette_size = 512 }; /* Initializes and adjusts parameters. Can be called multiple times on the same md_ntsc_t object. Can pass NULL for either parameter. */ typedef struct md_ntsc_t md_ntsc_t; void md_ntsc_init( md_ntsc_t* ntsc, md_ntsc_setup_t const* setup ); /* Filters one row of pixels. Input pixel format is set by MD_NTSC_IN_FORMAT and output RGB depth is set by MD_NTSC_OUT_DEPTH. Both default to 16-bit RGB. In_row_width is the number of pixels to get to the next input row. */ void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline); /* Number of output pixels written by blitter for given input width. */ #define MD_NTSC_OUT_WIDTH( in_width ) \ (((in_width) - 3) / md_ntsc_in_chunk * md_ntsc_out_chunk + md_ntsc_out_chunk) /* Number of input pixels that will fit within given output width. Might be rounded down slightly; use MD_NTSC_OUT_WIDTH() on result to find rounded value. */ #define MD_NTSC_IN_WIDTH( out_width ) \ ((out_width) / md_ntsc_out_chunk * md_ntsc_in_chunk - md_ntsc_in_chunk + 3) /* Interface for user-defined custom blitters */ enum { md_ntsc_in_chunk = 4 }; /* number of input pixels read per chunk */ enum { md_ntsc_out_chunk = 8 }; /* number of output pixels generated per chunk */ enum { md_ntsc_black = 0 }; /* palette index for black */ /* Begin outputting row and start three pixels. First pixel will be cut off a bit. Declares variables, so must be before first statement in a block (unless you're using C++). */ #define MD_NTSC_BEGIN_ROW( ntsc, pixel0, pixel1, pixel2, pixel3 ) \ md_ntsc_rgb_t raw_;\ unsigned const md_pixel0_ = (pixel0);\ md_ntsc_rgb_t const* kernel0 = MD_NTSC_IN_FORMAT( ntsc, md_pixel0_ );\ unsigned const md_pixel1_ = (pixel1);\ md_ntsc_rgb_t const* kernel1 = MD_NTSC_IN_FORMAT( ntsc, md_pixel1_ );\ unsigned const md_pixel2_ = (pixel2);\ md_ntsc_rgb_t const* kernel2 = MD_NTSC_IN_FORMAT( ntsc, md_pixel2_ );\ unsigned const md_pixel3_ = (pixel3);\ md_ntsc_rgb_t const* kernel3 = MD_NTSC_IN_FORMAT( ntsc, md_pixel3_ );\ md_ntsc_rgb_t const* kernelx0;\ md_ntsc_rgb_t const* kernelx1 = kernel0;\ md_ntsc_rgb_t const* kernelx2 = kernel0;\ md_ntsc_rgb_t const* kernelx3 = kernel0 /* Begin input pixel */ #define MD_NTSC_COLOR_IN( index, ntsc, color ) \ MD_NTSC_COLOR_IN_( index, color, MD_NTSC_IN_FORMAT, ntsc ) /* Generate output pixel */ #define MD_NTSC_RGB_OUT( x, rgb_out ) {\ raw_ =\ kernel0 [x+ 0] + kernel1 [(x+6)%8+16] + kernel2 [(x+4)%8 ] + kernel3 [(x+2)%8+16] +\ kernelx0 [x+ 8] + kernelx1 [(x+6)%8+24] + kernelx2 [(x+4)%8+8] + kernelx3 [(x+2)%8+24];\ MD_NTSC_CLAMP_( raw_, 0 );\ MD_NTSC_RGB_OUT_( rgb_out, 0 );\ } /* private */ enum { md_ntsc_entry_size = 2 * 16 }; typedef unsigned long md_ntsc_rgb_t; struct md_ntsc_t { md_ntsc_rgb_t table [md_ntsc_palette_size] [md_ntsc_entry_size]; }; #define MD_NTSC_BGR9( ntsc, n ) (ntsc)->table [n & 0x1FF] #define MD_NTSC_RGB16( ntsc, n ) \ (md_ntsc_rgb_t*) ((char*) (ntsc)->table +\ ((n << 9 & 0x3800) | (n & 0x0700) | (n >> 8 & 0x00E0)) *\ (md_ntsc_entry_size * sizeof (md_ntsc_rgb_t) / 32)) #define MD_NTSC_RGB15( ntsc, n ) \ (md_ntsc_rgb_t*) ((char*) (ntsc)->table +\ ((n << 8 & 0x1C00) | (n & 0x0380) | (n >> 8 & 0x0070)) *\ (md_ntsc_entry_size * sizeof (md_ntsc_rgb_t) / 16)) /* common ntsc macros */ #define md_ntsc_rgb_builder ((1L << 21) | (1 << 11) | (1 << 1)) #define md_ntsc_clamp_mask (md_ntsc_rgb_builder * 3 / 2) #define md_ntsc_clamp_add (md_ntsc_rgb_builder * 0x101) #define MD_NTSC_CLAMP_( io, shift ) {\ md_ntsc_rgb_t sub = (io) >> (9-(shift)) & md_ntsc_clamp_mask;\ md_ntsc_rgb_t clamp = md_ntsc_clamp_add - sub;\ io |= clamp;\ clamp -= sub;\ io &= clamp;\ } #define MD_NTSC_COLOR_IN_( index, color, ENTRY, table ) {\ unsigned color_;\ kernelx##index = kernel##index;\ kernel##index = (color_ = (color), ENTRY( table, color_ ));\ } /* x is always zero except in snes_ntsc library */ #if MD_NTSC_OUT_DEPTH == 15 #define MD_NTSC_RGB_OUT_( rgb_out, x ) {\ rgb_out = (raw_>>(14-x)& 0x7C00)|(raw_>>(9-x)&0x03E0)|(raw_>>(4-x)&0x001F);\ } #elif MD_NTSC_OUT_DEPTH == 16 #define MD_NTSC_RGB_OUT_( rgb_out, x ) {\ rgb_out = (raw_>>(13-x)& 0xF800)|(raw_>>(8-x)&0x07E0)|(raw_>>(4-x)&0x001F);\ } #endif #ifdef __cplusplus } #endif #endif core/input_hw/graphic_board.c000664 001750 001750 00000006345 12702465756 017445 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Graphic Board support * * Copyright (C) 2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; uint8 Counter; uint8 Port; } board; void graphic_board_reset(int port) { input.analog[0][0] = 128; input.analog[0][1] = 128; board.State = 0x7f; board.Counter = 0; board.Port = port; } unsigned char graphic_board_read(void) { uint8 data; if (board.State & 0x20) { return 0x60; } switch (board.Counter & 7) { case 0: data = ~input.pad[board.Port]; break; case 1: data = 0x0f; break; case 2: data = 0x0f; break; case 3: data = input.analog[board.Port][0] >> 4; break; case 4: data = input.analog[board.Port][0]; break; case 5: data = input.analog[board.Port][1] >> 4; break; case 6: data = input.analog[board.Port][1]; break; case 7: data = 0x0f; break; } return (board.State & ~0x1f) | (data & 0x0f); } void graphic_board_write(unsigned char data, unsigned char mask) { data = (board.State & ~mask) | (data & mask); if ((data ^ board.State) & 0x20) { board.Counter = 0; } else if ((data ^ board.State) & 0x40) { board.Counter++; } board.State = data; } sdl/000700 001750 001750 00000000000 12703321515 012447 5ustar00sergiosergio000000 000000 core/ntsc/md_ntsc.c000664 001750 001750 00000011413 12702465756 015412 0ustar00sergiosergio000000 000000 /* md_ntsc 0.1.2. http://www.slack.net/~ant/ */ /* Modified for use with Genesis Plus GX -- EkeEke */ #include "shared.h" #include "md_ntsc.h" /* Copyright (C) 2006 Shay Green. This module is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ md_ntsc_setup_t const md_ntsc_monochrome = { 0,-1, 0, 0,.2, 0, 0,-.2,-.2,-1, 0, 0 }; md_ntsc_setup_t const md_ntsc_composite = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; md_ntsc_setup_t const md_ntsc_svideo = { 0, 0, 0, 0, 0, 0,.2, -1, -1, 0, 0, 0 }; md_ntsc_setup_t const md_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.7, -1, -1,-1, 0, 0 }; #define alignment_count 2 #define burst_count 1 #define rescale_in 1 #define rescale_out 1 #define artifacts_mid 0.40f #define fringing_mid 0.30f #define std_decoder_hue 0 #define gamma_size 8 #define artifacts_max 1.00f #define LUMA_CUTOFF 0.1974 #include "md_ntsc_impl.h" /* 2 input pixels -> 4 composite samples */ pixel_info_t const md_ntsc_pixels [alignment_count] = { { PIXEL_OFFSET( -4, -9 ), { 0.1f, 0.9f, 0.9f, 0.1f } }, { PIXEL_OFFSET( -2, -7 ), { 0.1f, 0.9f, 0.9f, 0.1f } }, }; static void correct_errors( md_ntsc_rgb_t color, md_ntsc_rgb_t* out ) { unsigned i; for ( i = 0; i < rgb_kernel_size / 4; i++ ) { md_ntsc_rgb_t error = color - out [i ] - out [i + 2 +16] - out [i + 4 ] - out [i + 6 +16] - out [i + 8] - out [(i+10)%16+16] - out [(i+12)%16] - out [(i+14)%16+16]; CORRECT_ERROR( i + 6 + 16 ); /*DISTRIBUTE_ERROR( 2+16, 4, 6+16 );*/ } } void md_ntsc_init( md_ntsc_t* ntsc, md_ntsc_setup_t const* setup ) { int entry; init_t impl; if ( !setup ) setup = &md_ntsc_composite; init( &impl, setup ); for ( entry = 0; entry < md_ntsc_palette_size; entry++ ) { float bb = impl.to_float [entry >> 6 & 7]; float gg = impl.to_float [entry >> 3 & 7]; float rr = impl.to_float [entry & 7]; float y, i, q = RGB_TO_YIQ( rr, gg, bb, y, i ); int r, g, b = YIQ_TO_RGB( y, i, q, impl.to_rgb, int, r, g ); md_ntsc_rgb_t rgb = PACK_RGB( r, g, b ); if ( setup->palette_out ) RGB_PALETTE_OUT( rgb, &setup->palette_out [entry * 3] ); if ( ntsc ) { gen_kernel( &impl, y, i, q, ntsc->table [entry] ); correct_errors( rgb, ntsc->table [entry] ); } } } #ifndef CUSTOM_BLITTER void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input, int in_width, int vline) { int const chunk_count = in_width / md_ntsc_in_chunk - 1; /* use palette entry 0 for unused pixels */ MD_NTSC_IN_T border = table[0]; MD_NTSC_BEGIN_ROW( ntsc, border, MD_NTSC_ADJ_IN( table[*input++] ), MD_NTSC_ADJ_IN( table[*input++] ), MD_NTSC_ADJ_IN( table[*input++] ) ); md_ntsc_out_t* restrict line_out = (md_ntsc_out_t*)(&bitmap.data[(vline * bitmap.pitch)]); int n; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 0, *line_out++ ); MD_NTSC_RGB_OUT( 1, *line_out++ ); MD_NTSC_COLOR_IN( 1, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 2, *line_out++ ); MD_NTSC_RGB_OUT( 3, *line_out++ ); MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 4, *line_out++ ); MD_NTSC_RGB_OUT( 5, *line_out++ ); MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 6, *line_out++ ); MD_NTSC_RGB_OUT( 7, *line_out++ ); } /* finish final pixels */ MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); MD_NTSC_RGB_OUT( 0, *line_out++ ); MD_NTSC_RGB_OUT( 1, *line_out++ ); MD_NTSC_COLOR_IN( 1, ntsc, border ); MD_NTSC_RGB_OUT( 2, *line_out++ ); MD_NTSC_RGB_OUT( 3, *line_out++ ); MD_NTSC_COLOR_IN( 2, ntsc, border ); MD_NTSC_RGB_OUT( 4, *line_out++ ); MD_NTSC_RGB_OUT( 5, *line_out++ ); MD_NTSC_COLOR_IN( 3, ntsc, border ); MD_NTSC_RGB_OUT( 6, *line_out++ ); MD_NTSC_RGB_OUT( 7, *line_out++ ); } #endif gx/images/Ctrl_mouse.png000664 001750 001750 00000007415 12702465756 016434 0ustar00sergiosergio000000 000000 PNG  IHDR@XE(sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=aIDATx{WQ?=sw^;3Y7  Fb.)J ʀ`,K*T*ETH+IDHbvCvd'#ΝxT$}̺q\8$Vwn6p.kka 4N  _PY` swz9n2ٱ:M!w 3x'p0%!wh?d̪4$CL>fx8ʝq~ݏ3ZS6װffsP!>#q"9^4ar;}"ڼ  0~w{  Ff6L-QҼ0s0F3;EgCppcFmDq7EҹZ^3{3H"\Q5| ih}qxs~cAăG9}&BA(0x9)秐o9 ݿ FIY n; "et9d[PF0w_q6\f րTJ$ЉzHG0~Ѯ2Dƞ8 8r-bx.9Q2u }qAEic8u.2,U̬x25;P/wyGD=yV$޸^TP@F WxPۉb6(Pb~2bTg@Ӡ]Iݍ4L`Ry&u(,nGϠެ٬Ԑ5[*3>O9d< A9+> b~ FT/^8߇A3?SefES_LCp/#9]:aT4Oޅ, x x 4b~-*"Їڃ{ (~(2d2x_5[2toYp;~=v)߆ E⨎)Q 7ۀ;krCP >4 ImHض`jT_t/-cR X~i=E܋fD3z(Fc ud#0 'w٦MY ܀d/A* % ZB .m~r,}Hܹ3pNs̖@{zP/!|a}RrXQljiӕ SGjd^YCs/3}{i3kkHA4. #_*;I)S@H1NIkq TC|?3;h?as.>;4bL'i&U`CYJ=P>Dqd5*3ko.AT".{3@ 챃x=dH\'Cg+9: ktw&aK{B:Bt<| `f5f!p7ŔXoiF>^\ifuB>nf[߇zu3ɤ TBWc:#,~#:ZcXH<ue=}MK?df"}h<@*Y`hV}& q={ 43>H!sy-2xl06'Qw p Ox`iBe< +C(ƒIYP}vٟHp!wOL(42A$(҈1Jv X5HG2AiqHr/{* SW}/ W: VTC2 }O&Qu`yݿ nFIiq8`4ΧF T+Fi hPm#nicOj13c/ f(^%ː:nԻq=6׻)m&4}Y0p9&!vmH#ѾN/Kjy;ȦE} q%a<.g1BzLr2 D6܃^je:MkW!fdzUZUΧd4; 'P*}1$TV~rd؁0`PBknȵ hJ=`h &Eո`̴z`WTФRݿfB <0Z;3dd9FCvZ0m9Q'hG@z"J c@B=MPxZj?> tPb4tp٣2GN࿁P]` 1lpݍOCN+G۬RgUdca8jmOٿYMQZV AΝBՉ`f__ 4[=3h{>h 񹟲pi^/Nwmo4/GK[E N?s[og_l?}"A @'zOjfMaFS/@&8?TvjZ([_fS..GqcB7]u}Ξ9^A(ي潛5ffk_lBga(߁^v)Z-U7*k+ތMisJ\#<#fv5r׹ w99vx"A@u=k46fafy/FF+Ah/h3fx2(_ٕ{.1ܮK鶹`<LCYσF .7?fnu[51qۢ?[N;2g*ۀK_9 xi IENDB`psp2/000700 001750 001750 00000000000 12703321515 012551 5ustar00sergiosergio000000 000000 gx/images/Button_icon_sm_over.png000664 001750 001750 00000011462 12702465756 020332 0ustar00sergiosergio000000 000000 PNG  IHDR4 83xsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09IDATx{Tŝ?uoߞ' 303<20<QĕhltxQ7J|envM<4'c6&u 9# D hx#әQUǝifoU]taΝ=^~)[lt:]y^2_JR'Di+I'BM!RBb= |tE|\Zjի|k}ʗRR*uBxFp/^렭(RipG !ңG_M//TTTײevRBzV^^4 J\1axa Ӡn{ʧUj$'( 4KG53NCS+؎BhJ F*h1 %[K_Bm)z>5ZaÆ3<?|˗/a2eYFqfc% ;C<;{Z-;=[|\OQV֗ ֔RPPݻ?7iEAAt5۶m+*.V[*hn~UV8(<_j߾y=)kkk׮]K'LTpE@ٓf2uoUS:t555TVVo(.ٶm+uuXv-naW5R*jV}}Cm?OH k֬y>nY,K ÓTLJeJ3e f͚ŸqNC@KK /"~l͝*UJ|_z؎Rmt%`mm,*|fMhche4 Ӽ͈5tU<>k֬{Ѱk;A9Px䥵&/(U8sQ[[ۖ)\YC1qK+_6P)4?er\ƌsCwR t%Zk~3LTK|_QJ|4P8Η1Jx {,ZheY1s[A%y$mQTTtC72t@ĆKwέQ5i'hIZi555]}O#ŋ1iDs˓vsxdy_wߝ#_֙}ihn}ndh.--}(lٲo6M;4y>_4?Y0pΝ{jCEg R"ch?7̃]~)iC1xt>XWWӸe=<.ن6m Ǘ?p4rd'#aQqz)|085t]R@xDZX,/G ,cV* fý"nW^Msv8UhЂ֚"~缱/{BmOaZ3 !֭[,cP9e)P6YY榛n0գ3 +9ǟ}'1GX,… g10<*NxEՓ5 !pe_Y%H9_w@ jh'͛0 Sӯ :ͻy>?]P>).j=~ۡ (h˲;D2b(g0邋۷o0.lj: τ2n\ 4 xb0,X00B5Cmt1c\ÙG1L=%cǎ=̡{#$0\k_.0aD[L˂zRJSIEb7(\CDɗ=FɄ)$GKH~틝 ߐRZ R h>]Y!:#_4D+J0Oee^I %E@K:q2݄@v6 ZWa(<%*`~g߾]X#AS( C>yV;%ih Zkihm)>Ф3 Ttf^jX`@S&&m!H%ٽ_ZCaihHNنNoQ|wI{'䃘iTOf j Lp cX6B'0E=)Nwx Ӯ]p$>4tR;}_npc5c}ǣNhhRҾmJHRضM:>nm;R`c1fx>>>hUWW?kݺPl< e=5f+k^{&cZl#S8JfW<'O@P#RxH%왍(=`u;%` >Ν;y`Ж|64mmmC y:{3ʘ_437[Es8aHlf S:nd0_*0G ^'iZÒD"qM͉nuuu@[3/!f+~ʡg6"ۯϙ:39}dTEw Iqؠŋ? К,}%N~]םnfcvǺKj9rGb_/NٵW|^|0>,t6&z>GAm\`2$Lb6dci [bV Jmq4N~qi|#\<6V=| #TBkLӷ(hpΜ9Cv{)X6s6ZIvP#՛,3fuc|>r@F pMzpvMhE){Ķmlܸuk_cp̣[cylt1w9s۶m۟= =q $fh9cPy0>;tPBUJQkB̡%`gHG h&vdҥ[͆qcqT=tnR>~э)OVJHkIx 8o8>9L6 ۶3S8a8Bdxr =YpiTRZVX)p vÂ,6h%zq>c 6 42/%1 PBG8e:8l2v8jj3bFRٿ ())u]vNz~mvn7L!?v`n?9,~q0C?)O> !悎k.6}z ܦ~7,_&HIR,+3۠$ AY }{0|W^4`]&R !A:J,Mx</**0oDqW]p4y:CDM{ f='-QtcFd$lhMA^J`hXD12MwH=B4mؼOa !@\11yav9⵴ 6nž Th4?u]a[O%;iۋ.b1M"MULүTQ[QGRݡ541no2hjIa۩+w] >2ʏj={^c$@u'@=6ZIJy00M3^PPpA,-}"#;$].Al @kݠKl~tZFKuIENDB`core/tremor/floor0.c000664 001750 001750 00000030221 12702465756 015523 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: floor backend 0 implementation ********************************************************************/ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "registry.h" #include "codebook.h" #include "misc.h" #include "block.h" #define LSP_FRACBITS 14 typedef struct { long n; int ln; int m; int *linearmap; vorbis_info_floor0 *vi; ogg_int32_t *lsp_look; } vorbis_look_floor0; /*************** LSP decode ********************/ #include "lsp_lookup.h" /* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in 16.16 format returns in m.8 format */ static long ADJUST_SQRT2[2]={8192,5792}; STIN ogg_int32_t vorbis_invsqlook_i(long a,long e){ long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); long d=a&INVSQ_LOOKUP_I_MASK; /* 0.10 */ long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ ((INVSQ_LOOKUP_IDel[i]*d)>>INVSQ_LOOKUP_I_SHIFT); /* result 1.16 */ val*=ADJUST_SQRT2[e&1]; e=(e>>1)+21; return(val>>e); } /* interpolated lookup based fromdB function, domain -140dB to 0dB only */ /* a is in n.12 format */ STIN ogg_int32_t vorbis_fromdBlook_i(long a){ int i=(-a)>>(12-FROMdB2_SHIFT); if(i<0) return 0x7fffffff; if(i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT] * FROMdB2_LOOKUP[i&FROMdB2_MASK]; } /* interpolated lookup based cos function, domain 0 to PI only */ /* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ STIN ogg_int32_t vorbis_coslook_i(long a){ int i=a>>COS_LOOKUP_I_SHIFT; int d=a&COS_LOOKUP_I_MASK; return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> COS_LOOKUP_I_SHIFT); } /* interpolated lookup based cos function */ /* a is in 0.16 format, where 0==0, 2^^16==PI, return .LSP_FRACBITS */ STIN ogg_int32_t vorbis_coslook2_i(long a){ a=a&0x1ffff; if(a>0x10000)a=0x20000-a; { int i=a>>COS_LOOKUP_I_SHIFT; int d=a&COS_LOOKUP_I_MASK; a=((COS_LOOKUP_I[i]<> (COS_LOOKUP_I_SHIFT-LSP_FRACBITS+14); } return(a); } static const int barklook[28]={ 0,100,200,301, 405,516,635,766, 912,1077,1263,1476, 1720,2003,2333,2721, 3184,3742,4428,5285, 6376,7791,9662,12181, 15624,20397,27087,36554 }; /* used in init only; interpolate the long way */ STIN ogg_int32_t toBARK(int n){ int i; for(i=0;i<27;i++) if(n>=barklook[i] && n>10)*0x517d)>>14; #endif /* safeguard against a malicious stream */ if(val<0 || (val>>COS_LOOKUP_I_SHIFT)>=COS_LOOKUP_I_SZ){ memset(curve,0,sizeof(*curve)*n); return; } ilsp[i]=vorbis_coslook_i(val); } i=0; while(i>16); qi=((qi*qi)>>16); if(m&1){ qexp= qexp*2-28*((m+1)>>1)+m; pi*=(1<<14)-((wi*wi)>>14); qi+=pi>>14; }else{ qexp= qexp*2-13*m; pi*=(1<<14)-wi; qi*=(1<<14)+wi; qi=(qi+pi)>>14; } if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ qi>>=1; qexp++; }else lsp_norm_asm(&qi,&qexp); #else qi*=labs(ilsp[0]-wi); pi*=labs(ilsp[1]-wi); for(j=3;j>25])) if(!(shift=MLOOP_2[(pi|qi)>>19])) shift=MLOOP_3[(pi|qi)>>16]; qi=(qi>>shift)*labs(ilsp[j-1]-wi); pi=(pi>>shift)*labs(ilsp[j]-wi); qexp+=shift; } if(!(shift=MLOOP_1[(pi|qi)>>25])) if(!(shift=MLOOP_2[(pi|qi)>>19])) shift=MLOOP_3[(pi|qi)>>16]; /* pi,qi normalized collectively, both tracked using qexp */ if(m&1){ /* odd order filter; slightly assymetric */ /* the last coefficient */ qi=(qi>>shift)*labs(ilsp[j-1]-wi); pi=(pi>>shift)<<14; qexp+=shift; if(!(shift=MLOOP_1[(pi|qi)>>25])) if(!(shift=MLOOP_2[(pi|qi)>>19])) shift=MLOOP_3[(pi|qi)>>16]; pi>>=shift; qi>>=shift; qexp+=shift-14*((m+1)>>1); pi=((pi*pi)>>16); qi=((qi*qi)>>16); qexp=qexp*2+m; pi*=(1<<14)-((wi*wi)>>14); qi+=pi>>14; }else{ /* even order filter; still symmetric */ /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't worth tracking step by step */ pi>>=shift; qi>>=shift; qexp+=shift-7*m; pi=((pi*pi)>>16); qi=((qi*qi)>>16); qexp=qexp*2+m; pi*=(1<<14)-wi; qi*=(1<<14)+wi; qi=(qi+pi)>>14; } /* we've let the normalization drift because it wasn't important; however, for the lookup, things must be normalized again. We need at most one right shift or a number of left shifts */ if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ qi>>=1; qexp++; }else while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ qi<<=1; qexp--; } #endif amp=vorbis_fromdBlook_i(ampi* /* n.4 */ vorbis_invsqlook_i(qi,qexp)- /* m.8, m+n<=8 */ ampoffseti); /* 8.12[0] */ #ifdef _LOW_ACCURACY_ amp>>=9; #endif curve[i]= MULT31_SHIFT15(curve[i],amp); while(map[++i]==k) curve[i]= MULT31_SHIFT15(curve[i],amp); } } /*************** vorbis decode glue ************/ static void floor0_free_info(vorbis_info_floor *i){ vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; if(info){ memset(info,0,sizeof(*info)); _ogg_free(info); } } static void floor0_free_look(vorbis_look_floor *i){ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; if(look){ if(look->linearmap)_ogg_free(look->linearmap); if(look->lsp_look)_ogg_free(look->lsp_look); memset(look,0,sizeof(*look)); _ogg_free(look); } } static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; int j; vorbis_info_floor0 *info=(vorbis_info_floor0 *)_ogg_malloc(sizeof(*info)); info->order=oggpack_read(opb,8); info->rate=oggpack_read(opb,16); info->barkmap=oggpack_read(opb,16); info->ampbits=oggpack_read(opb,6); info->ampdB=oggpack_read(opb,8); info->numbooks=oggpack_read(opb,4)+1; if(info->order<1)goto err_out; if(info->rate<1)goto err_out; if(info->barkmap<1)goto err_out; if(info->numbooks<1)goto err_out; for(j=0;jnumbooks;j++){ info->books[j]=oggpack_read(opb,8); if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; } return(info); err_out: floor0_free_info(info); return(NULL); } /* initialize Bark scale and normalization lookups. We could do this with static tables, but Vorbis allows a number of possible combinations, so it's best to do it computationally. The below is authoritative in terms of defining scale mapping. Note that the scale depends on the sampling rate as well as the linear block and mapping sizes */ static vorbis_look_floor *floor0_look (vorbis_dsp_state *vd,vorbis_info_mode *mi, vorbis_info_floor *i){ int j; vorbis_info *vi=vd->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; vorbis_look_floor0 *look=(vorbis_look_floor0 *)_ogg_calloc(1,sizeof(*look)); look->m=info->order; look->n=ci->blocksizes[mi->blockflag]/2; look->ln=info->barkmap; look->vi=info; /* the mapping from a linear scale to a smaller bark scale is straightforward. We do *not* make sure that the linear mapping does not skip bark-scale bins; the decoder simply skips them and the encoder may do what it wishes in filling them. They're necessary in some mapping combinations to keep the scale spacing accurate */ look->linearmap=(int *)_ogg_malloc((look->n+1)*sizeof(*look->linearmap)); for(j=0;jn;j++){ int val=(look->ln* ((toBARK(info->rate/2*j/look->n)<<11)/toBARK(info->rate/2)))>>11; if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ look->linearmap[j]=val; } look->linearmap[j]=-1; look->lsp_look=(ogg_int32_t *)_ogg_malloc(look->ln*sizeof(*look->lsp_look)); for(j=0;jln;j++) look->lsp_look[j]=vorbis_coslook2_i(0x10000*j/look->ln); return look; } static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; vorbis_info_floor0 *info=look->vi; int j,k; int ampraw=oggpack_read(&vb->opb,info->ampbits); if(ampraw>0){ /* also handles the -1 out of data case */ long maxval=(1<ampbits)-1; int amp=((ampraw*info->ampdB)<<4)/maxval; int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; codebook *b=ci->fullbooks+info->books[booknum]; ogg_int32_t last=0; ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1)); for(j=0;jm;j+=b->dim) if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim,-24)==-1)goto eop; for(j=0;jm;){ for(k=0;kdim;k++,j++)lsp[j]+=last; last=lsp[j-1]; } lsp[look->m]=amp; return(lsp); } } eop: return(NULL); } static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, void *memo,ogg_int32_t *out){ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; vorbis_info_floor0 *info=look->vi; if(memo){ ogg_int32_t *lsp=(ogg_int32_t *)memo; ogg_int32_t amp=lsp[look->m]; /* take the coefficients back to a spectral envelope curve */ vorbis_lsp_to_curve(out,look->linearmap,look->n,look->ln, lsp,look->m,amp,info->ampdB,look->lsp_look); return(1); } memset(out,0,sizeof(*out)*look->n); return(0); } /* export hooks */ vorbis_func_floor floor0_exportbundle={ &floor0_unpack,&floor0_look,&floor0_free_info, &floor0_free_look,&floor0_inverse1,&floor0_inverse2 }; gx/images/Star_full.png000664 001750 001750 00000001742 12702465756 016250 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~tEXtCreation Time02/19/09( tEXtSoftwareMacromedia Fireworks MX*$6IDATxSMHa~Zwgwvrյd\RY HOAAH^PV]`aQhH\6"tK9/y}w@D0.JdLOO59 On;q.á/,,PEE;38 ǍrTWWpdg<ň(}vb뤪:tv,ˢXGaO% 4v?nyf˨++LZ O9555%%% aAm6Xq8~~?MӰ;;K>>2@VŨKQQ$~7߿7588Q*++[κ8~(HDDv*z5M5jmm].gsYsjQ<'UU?(:Lc#P]]*wcs'[ZZ$) |8N(zq+IIX2\d&Q[[;yB lh&"!箃WIENDB`gx/images/Ctrl_lightphaser.png000664 001750 001750 00000007462 12702465756 017620 0ustar00sergiosergio000000 000000 PNG  IHDRX\r"sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=IDATx[pUW$@PJi!ܪT tǙZ㌶ꃒ8:^Fxg|'GAk^Z{[mZK R( H=ۇ9 Cv{=9gZ.k\Er^"T@DQ1uV`9p{re\1s(0 ܂4t8 Wϻ{jcuwIjZCel98 V(bE2=؋AePla7 qca` Jo.Cƭs$z+3l1͔DmH>K} #A%5{k EFq.j4S"؎cLᄂ6qV_DS~if8׾ioCltDL)y'^rR<@!V!gq<B֠~52 d\!wqF^,K u(q;݈"  W0N"G܇EܾеՉ"7+]D?Gi#rlY|u[㽏t#4ϒM3FGi䉬EX~Q5l)R^4  ow!mD=nd r]t-w.F|[(H24̻98{1 I:>qufHk{ C.4PK]?Aָ2 -=C[:_߶~FQT}N'qW?E+$ H"G@-D<[/B\yd#n92~uHsO];ڪϖYf~`0Y@m1{n^-p5F`»uK:4hJ4hMgnpLGdm!@g+HhWe܈flWQ` jI>~:@c#JH?2j|Ws*'Y(ס#QɭS]L@nkmiFd8[@ uc5E^qw<ӵ}'ꇐWƮ#f`(N"o iQw.@Џ$8?i U;ί@;z4~LlGAqKЃհH~ۼ"EQqICss If`k 8w mm-/V݈ߟAbхz/w{ҞWQ~Ҳ &U@25(ց N'rDL՟vmq^qRьyPU_Ax ݹBY"in|yCF;U_,H Fq{F=@j` Hshm4ƸǻiSs-xObaf+$ۜ]puimodPZߔ"E$elwm+ @yT%l2=h|r'Wߛdt^V, GJ]Dɕj65Gt\D]HN0:0',AH(`{ DD#7mݛfSeuxgAžsqQ@jD &MA>)qfa{h ؇]DKx{hںh#gCmx$%~EؒШX;E蔠 FG1ax$)".Fu[Z 0 M ݇(5qJPlM x޶lvƌhKyv$(I ؂^ "*0N-v4xzbϰxΝi -Hl p)0 [h0AtjB8εQ,=ӱ:gtZ] aF ܭۮŏ߄wSrGz+IENDB`gx/images/Key_DPAD.png000664 001750 001750 00000002245 12702465756 015634 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/19/10IDATxnG rI&`,KpmE p J#nҥIč.h R7evwvS(Vh x>3?( n:O<ُG)%RJ|}DQbxt޺;P׷vwwq ,<{lLo^0 sggtt:s||R2ͶјL/8::b8"Z~zniiZES{/_u:,˺n{?a8B`&BdYsf7w=4M[۶ISIwcʒ.cEDxuN,KL&H)G( #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "mdct.h" #include "codec_internal.h" #include "codebook.h" #include "window.h" #include "registry.h" #include "misc.h" /* simplistic, wasteful way of doing this (unique lookup for each mode/submapping); there should be a central repository for identical lookups. That will require minor work, so I'm putting it off as low priority. Why a lookup for each backend in a given mode? Because the blocksize is set by the mode, and low backend lookups may require parameters from other areas of the mode/mapping */ typedef struct { vorbis_info_mode *mode; vorbis_info_mapping0 *map; vorbis_look_floor **floor_look; vorbis_look_residue **residue_look; vorbis_func_floor **floor_func; vorbis_func_residue **residue_func; int ch; long lastframe; /* if a different mode is called, we need to invalidate decay */ } vorbis_look_mapping0; static void mapping0_free_info(vorbis_info_mapping *i){ vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; if(info){ memset(info,0,sizeof(*info)); _ogg_free(info); } } static void mapping0_free_look(vorbis_look_mapping *look){ int i; vorbis_look_mapping0 *l=(vorbis_look_mapping0 *)look; if(l){ for(i=0;imap->submaps;i++){ l->floor_func[i]->free_look(l->floor_look[i]); l->residue_func[i]->free_look(l->residue_look[i]); } _ogg_free(l->floor_func); _ogg_free(l->residue_func); _ogg_free(l->floor_look); _ogg_free(l->residue_look); memset(l,0,sizeof(*l)); _ogg_free(l); } } static vorbis_look_mapping *mapping0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, vorbis_info_mapping *m){ int i; vorbis_info *vi=vd->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)_ogg_calloc(1,sizeof(*look)); vorbis_info_mapping0 *info=look->map=(vorbis_info_mapping0 *)m; look->mode=vm; look->floor_look=(vorbis_look_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_look)); look->residue_look=(vorbis_look_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_look)); look->floor_func=(vorbis_func_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_func)); look->residue_func=(vorbis_func_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_func)); for(i=0;isubmaps;i++){ int floornum=info->floorsubmap[i]; int resnum=info->residuesubmap[i]; look->floor_func[i]=_floor_P[ci->floor_type[floornum]]; look->floor_look[i]=look->floor_func[i]-> look(vd,vm,ci->floor_param[floornum]); look->residue_func[i]=_residue_P[ci->residue_type[resnum]]; look->residue_look[i]=look->residue_func[i]-> look(vd,vm,ci->residue_param[resnum]); } look->ch=vi->channels; return(look); } static int ilog(unsigned int v){ int ret=0; if(v)--v; while(v){ ret++; v>>=1; } return(ret); } /* also responsible for range checking */ static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ int i; vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)_ogg_calloc(1,sizeof(*info)); codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; memset(info,0,sizeof(*info)); if(oggpack_read(opb,1)) info->submaps=oggpack_read(opb,4)+1; else info->submaps=1; if(oggpack_read(opb,1)){ info->coupling_steps=oggpack_read(opb,8)+1; for(i=0;icoupling_steps;i++){ int testM=info->coupling_mag[i]=oggpack_read(opb,ilog(vi->channels)); int testA=info->coupling_ang[i]=oggpack_read(opb,ilog(vi->channels)); if(testM<0 || testA<0 || testM==testA || testM>=vi->channels || testA>=vi->channels) goto err_out; } } if(oggpack_read(opb,2)>0)goto err_out; /* 2,3:reserved */ if(info->submaps>1){ for(i=0;ichannels;i++){ info->chmuxlist[i]=oggpack_read(opb,4); if(info->chmuxlist[i]>=info->submaps)goto err_out; } } for(i=0;isubmaps;i++){ int temp=oggpack_read(opb,8); if(temp>=ci->times)goto err_out; info->floorsubmap[i]=oggpack_read(opb,8); if(info->floorsubmap[i]>=ci->floors)goto err_out; info->residuesubmap[i]=oggpack_read(opb,8); if(info->residuesubmap[i]>=ci->residues)goto err_out; } return info; err_out: mapping0_free_info(info); return(NULL); } static int seq=0; static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ vorbis_dsp_state *vd=vb->vd; vorbis_info *vi=vd->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; private_state *b=(private_state *)vd->backend_state; vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l; vorbis_info_mapping0 *info=look->map; int i,j; long n=vb->pcmend=ci->blocksizes[vb->W]; ogg_int32_t **pcmbundle=(ogg_int32_t **)alloca(sizeof(*pcmbundle)*vi->channels); int *zerobundle=(int *)alloca(sizeof(*zerobundle)*vi->channels); int *nonzero =(int *)alloca(sizeof(*nonzero)*vi->channels); void **floormemo=(void **)alloca(sizeof(*floormemo)*vi->channels); /* time domain information decode (note that applying the information would have to happen later; we'll probably add a function entry to the harness for that later */ /* NOT IMPLEMENTED */ /* recover the spectral envelope; store it in the PCM vector for now */ for(i=0;ichannels;i++){ int submap=info->chmuxlist[i]; floormemo[i]=look->floor_func[submap]-> inverse1(vb,look->floor_look[submap]); if(floormemo[i]) nonzero[i]=1; else nonzero[i]=0; memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); } /* channel coupling can 'dirty' the nonzero listing */ for(i=0;icoupling_steps;i++){ if(nonzero[info->coupling_mag[i]] || nonzero[info->coupling_ang[i]]){ nonzero[info->coupling_mag[i]]=1; nonzero[info->coupling_ang[i]]=1; } } /* recover the residue into our working vectors */ for(i=0;isubmaps;i++){ int ch_in_bundle=0; for(j=0;jchannels;j++){ if(info->chmuxlist[j]==i){ if(nonzero[j]) zerobundle[ch_in_bundle]=1; else zerobundle[ch_in_bundle]=0; pcmbundle[ch_in_bundle++]=vb->pcm[j]; } } look->residue_func[i]->inverse(vb,look->residue_look[i], pcmbundle,zerobundle,ch_in_bundle); } /* channel coupling */ for(i=info->coupling_steps-1;i>=0;i--){ ogg_int32_t *pcmM=vb->pcm[info->coupling_mag[i]]; ogg_int32_t *pcmA=vb->pcm[info->coupling_ang[i]]; for(j=0;j0) if(ang>0){ pcmM[j]=mag; pcmA[j]=mag-ang; }else{ pcmA[j]=mag; pcmM[j]=mag+ang; } else if(ang>0){ pcmM[j]=mag; pcmA[j]=mag+ang; }else{ pcmA[j]=mag; pcmM[j]=mag-ang; } } } /* compute and apply spectral envelope */ for(i=0;ichannels;i++){ ogg_int32_t *pcm=vb->pcm[i]; int submap=info->chmuxlist[i]; look->floor_func[submap]-> inverse2(vb,look->floor_look[submap],floormemo[i],pcm); } /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ /* only MDCT right now.... */ for(i=0;ichannels;i++){ ogg_int32_t *pcm=vb->pcm[i]; mdct_backward(n,pcm,pcm); } /* window the data */ for(i=0;ichannels;i++){ ogg_int32_t *pcm=vb->pcm[i]; if(nonzero[i]) _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); else for(j=0;jchannels; /* all done! */ return(0); } /* export hooks */ vorbis_func_mapping mapping0_exportbundle={ &mapping0_unpack, &mapping0_look, &mapping0_free_info, &mapping0_free_look, &mapping0_inverse }; gx/images/CD_ready_off.png000664 001750 001750 00000001505 12702465756 016616 0ustar00sergiosergio000000 000000 PNG  IHDR0PsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time11/18/12{xIDATxՖ3+Q?{(t&(&ԔҠRP`hT<1 IeRM٘Qp_}omS<ܙgs= Ԕ BR]NLLHmllLi)%RJ%WVWQ,Y^^fppM!D">@>gqqDh4ThDTuNNN8==777o]4+666< T100GM&`rrsJ&Ie8pPj...X]]Ų,yl|~~Tdhhȗ@uM!///DU `xx҅^^^>3BJAgg'@uL&֟h`0ӿE3IENDB`core/tremor/registry.c000664 001750 001750 00000003351 12702465756 016176 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: registry for floor, res backends and channel mappings ********************************************************************/ #include "ivorbiscodec.h" #include "codec_internal.h" #include "registry.h" #include "misc.h" /* seems like major overkill now; the backend numbers will grow into the infrastructure soon enough */ extern vorbis_func_floor floor0_exportbundle; extern vorbis_func_floor floor1_exportbundle; extern vorbis_func_residue residue0_exportbundle; extern vorbis_func_residue residue1_exportbundle; extern vorbis_func_residue residue2_exportbundle; extern vorbis_func_mapping mapping0_exportbundle; vorbis_func_floor *_floor_P[]={ &floor0_exportbundle, &floor1_exportbundle, }; vorbis_func_residue *_residue_P[]={ &residue0_exportbundle, &residue1_exportbundle, &residue2_exportbundle, }; vorbis_func_mapping *_mapping_P[]={ &mapping0_exportbundle, }; core/genesis.c000664 001750 001750 00000041030 12702465756 014447 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Internal Hardware & Bus controllers * * Support for SG-1000, Mark-III, Master System, Game Gear, Mega Drive & Mega CD hardware * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #ifdef USE_DYNAMIC_ALLOC external_t *ext; #else /* External Hardware (Cartridge, CD unit, ...) */ external_t ext; #endif uint8 boot_rom[0x800]; /* Genesis BOOT ROM */ uint8 work_ram[0x10000]; /* 68K RAM */ uint8 zram[0x2000]; /* Z80 RAM */ uint32 zbank; /* Z80 bank window address */ uint8 zstate; /* Z80 bus state (d0 = BUSACK, d1 = /RESET) */ uint8 pico_current; /* PICO current page */ static uint8 tmss[4]; /* TMSS security register */ /*--------------------------------------------------------------------------*/ /* Init, reset, shutdown functions */ /*--------------------------------------------------------------------------*/ void gen_init(void) { int i; /* initialize Z80 */ z80_init(0,z80_irq_callback); /* 8-bit / 16-bit modes */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* initialize main 68k */ m68k_init(); m68k.aerr_enabled = config.addr_error; /* initialize main 68k memory map */ /* $800000-$DFFFFF : illegal access by default */ for (i=0x80; i<0xe0; i++) { m68k.memory_map[i].base = work_ram; /* for VDP DMA */ m68k.memory_map[i].read8 = m68k_lockup_r_8; m68k.memory_map[i].read16 = m68k_lockup_r_16; m68k.memory_map[i].write8 = m68k_lockup_w_8; m68k.memory_map[i].write16 = m68k_lockup_w_16; zbank_memory_map[i].read = zbank_lockup_r; zbank_memory_map[i].write = zbank_lockup_w; } /* $C0xxxx, $C8xxxx, $D0xxxx, $D8xxxx : VDP ports */ for (i=0xc0; i<0xe0; i+=8) { m68k.memory_map[i].read8 = vdp_read_byte; m68k.memory_map[i].read16 = vdp_read_word; m68k.memory_map[i].write8 = vdp_write_byte; m68k.memory_map[i].write16 = vdp_write_word; zbank_memory_map[i].read = zbank_read_vdp; zbank_memory_map[i].write = zbank_write_vdp; } /* $E00000-$FFFFFF : Work RAM (64k) */ for (i=0xe0; i<0x100; i++) { m68k.memory_map[i].base = work_ram; m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; m68k.memory_map[i].write8 = NULL; m68k.memory_map[i].write16 = NULL; /* Z80 can ONLY write to 68k RAM, not read it */ zbank_memory_map[i].read = zbank_unused_r; zbank_memory_map[i].write = NULL; } if (system_hw == SYSTEM_PICO) { /* additional registers mapped to $800000-$80FFFF */ m68k.memory_map[0x80].read8 = pico_read_byte; m68k.memory_map[0x80].read16 = pico_read_word; m68k.memory_map[0x80].write8 = m68k_unused_8_w; m68k.memory_map[0x80].write16 = m68k_unused_16_w; /* there is no I/O area (Notaz) */ m68k.memory_map[0xa1].read8 = m68k_read_bus_8; m68k.memory_map[0xa1].read16 = m68k_read_bus_16; m68k.memory_map[0xa1].write8 = m68k_unused_8_w; m68k.memory_map[0xa1].write16 = m68k_unused_16_w; /* initialize page index (closed) */ pico_current = 0; } else { /* $A10000-$A1FFFF : I/O & Control registers */ m68k.memory_map[0xa1].read8 = ctrl_io_read_byte; m68k.memory_map[0xa1].read16 = ctrl_io_read_word; m68k.memory_map[0xa1].write8 = ctrl_io_write_byte; m68k.memory_map[0xa1].write16 = ctrl_io_write_word; zbank_memory_map[0xa1].read = zbank_read_ctrl_io; zbank_memory_map[0xa1].write = zbank_write_ctrl_io; /* initialize Z80 memory map */ /* $0000-$3FFF is mapped to Z80 RAM (8K mirrored) */ /* $4000-$FFFF is mapped to hardware but Z80 PC should never point there */ for (i=0; i<64; i++) { z80_readmap[i] = &zram[(i & 7) << 10]; } /* initialize Z80 memory handlers */ z80_writemem = z80_memory_w; z80_readmem = z80_memory_r; /* initialize Z80 port handlers */ z80_writeport = z80_unused_port_w; z80_readport = z80_unused_port_r; } /* $000000-$7FFFFF : external hardware area */ if (system_hw == SYSTEM_MCD) { /* initialize SUB-CPU */ s68k_init(); /* initialize CD hardware */ scd_init(); } else { /* Cartridge hardware */ md_cart_init(); } } else { /* initialize cartridge hardware & Z80 memory handlers */ sms_cart_init(); /* initialize Z80 ports handlers */ switch (system_hw) { /* Master System compatibility mode */ case SYSTEM_PBC: { z80_writeport = z80_md_port_w; z80_readport = z80_md_port_r; break; } /* Game Gear hardware */ case SYSTEM_GG: case SYSTEM_GGMS: { /* initialize cartridge hardware & Z80 memory handlers */ sms_cart_init(); /* initialize Z80 ports handlers */ z80_writeport = z80_gg_port_w; z80_readport = z80_gg_port_r; break; } /* Master System hardware */ case SYSTEM_SMS: case SYSTEM_SMS2: { z80_writeport = z80_ms_port_w; z80_readport = z80_ms_port_r; break; } /* Mark-III hardware */ case SYSTEM_MARKIII: { z80_writeport = z80_m3_port_w; z80_readport = z80_m3_port_r; break; } /* SG-1000 hardware */ case SYSTEM_SG: case SYSTEM_SGII: { z80_writeport = z80_sg_port_w; z80_readport = z80_sg_port_r; break; } } } } void gen_reset(int hard_reset) { /* System Reset */ if (hard_reset) { /* clear RAM (TODO: use random bit patterns for all systems, like on real hardware) */ memset(work_ram, 0x00, sizeof (work_ram)); memset(zram, 0x00, sizeof (zram)); } else { /* reset YM2612 (on hard reset, this is done by sound_reset) */ fm_reset(0); } /* 68k & Z80 could be anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */ m68k.cycles = Z80.cycles = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX)); /* 68k cycles should be a multiple of 7 */ m68k.cycles = (m68k.cycles / 7) * 7; /* Z80 cycles should be a multiple of 15 */ Z80.cycles = (Z80.cycles / 15) * 15; /* 8-bit / 16-bit modes */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { if (system_hw == SYSTEM_MCD) { /* FRES is only asserted on Power ON */ if (hard_reset) { /* reset CD hardware */ scd_reset(1); } } /* reset MD cartridge hardware */ md_cart_reset(hard_reset); /* Z80 bus is released & Z80 is reseted */ m68k.memory_map[0xa0].read8 = m68k_read_bus_8; m68k.memory_map[0xa0].read16 = m68k_read_bus_16; m68k.memory_map[0xa0].write8 = m68k_unused_8_w; m68k.memory_map[0xa0].write16 = m68k_unused_16_w; zstate = 0; /* assume default bank is $000000-$007FFF */ zbank = 0; /* TMSS support */ if ((config.bios & 1) && (system_hw == SYSTEM_MD) && hard_reset) { int i; /* clear TMSS register */ memset(tmss, 0x00, sizeof(tmss)); /* VDP access is locked by default */ for (i=0xc0; i<0xe0; i+=8) { m68k.memory_map[i].read8 = m68k_lockup_r_8; m68k.memory_map[i].read16 = m68k_lockup_r_16; m68k.memory_map[i].write8 = m68k_lockup_w_8; m68k.memory_map[i].write16 = m68k_lockup_w_16; zbank_memory_map[i].read = zbank_lockup_r; zbank_memory_map[i].write = zbank_lockup_w; } /* check if BOOT ROM is loaded */ if (system_bios & SYSTEM_MD) { /* save default cartridge slot mapping */ cart.base = m68k.memory_map[0].base; /* BOOT ROM is mapped at $000000-$0007FF */ m68k.memory_map[0].base = boot_rom; } } /* reset MAIN-CPU */ m68k_pulse_reset(); } else { /* RAM state at power-on is undefined on some systems */ if ((system_hw == SYSTEM_MARKIII) || ((system_hw & SYSTEM_SMS) && (region_code == REGION_JAPAN_NTSC))) { /* some korean games rely on RAM to be initialized with values different from $00 or $ff */ memset(work_ram, 0xf0, sizeof(work_ram)); } /* reset cartridge hardware */ sms_cart_reset(); /* halt 68k (/VRES is forced low) */ m68k_pulse_halt(); } /* reset Z80 */ z80_reset(); /* some Z80 registers need to be initialized on Power ON */ if (hard_reset) { /* Power Base Converter specific */ if (system_hw == SYSTEM_PBC) { /* startup code logic (verified on real hardware): */ /* 21 01 E1 : LD HL, $E101 25 -- -- : DEC H F9 -- -- : LD SP,HL C7 -- -- : RST $00 01 01 -- : LD BC, $xx01 */ Z80.hl.w.l = 0xE001; Z80.sp.w.l = 0xDFFF; Z80.r = 4; } /* Master System & Game Gear specific */ else if (system_hw & (SYSTEM_SMS | SYSTEM_GG)) { /* check if BIOS is not being used */ if ((!(config.bios & 1) || !(system_bios & (SYSTEM_SMS | SYSTEM_GG)))) { /* a few Master System (Ace of Aces, Shadow Dancer) & Game Gear (Ecco the Dolphin, Evander Holyfield Real Deal Boxing) games crash if SP is not properly initialized */ Z80.sp.w.l = 0xDFF0; } } } } /*-----------------------------------------------------------------------*/ /* OS ROM / TMSS register control functions (Genesis mode) */ /*-----------------------------------------------------------------------*/ void gen_tmss_w(unsigned int offset, unsigned int data) { int i; /* write TMSS register */ WRITE_WORD(tmss, offset, data); /* VDP requires "SEGA" value to be written in TMSS register */ if (memcmp((char *)tmss, "SEGA", 4) == 0) { for (i=0xc0; i<0xe0; i+=8) { m68k.memory_map[i].read8 = vdp_read_byte; m68k.memory_map[i].read16 = vdp_read_word; m68k.memory_map[i].write8 = vdp_write_byte; m68k.memory_map[i].write16 = vdp_write_word; zbank_memory_map[i].read = zbank_read_vdp; zbank_memory_map[i].write = zbank_write_vdp; } } else { for (i=0xc0; i<0xe0; i+=8) { m68k.memory_map[i].read8 = m68k_lockup_r_8; m68k.memory_map[i].read16 = m68k_lockup_r_16; m68k.memory_map[i].write8 = m68k_lockup_w_8; m68k.memory_map[i].write16 = m68k_lockup_w_16; zbank_memory_map[i].read = zbank_lockup_r; zbank_memory_map[i].write = zbank_lockup_w; } } } void gen_bankswitch_w(unsigned int data) { /* check if BOOT ROM is loaded */ if (system_bios & SYSTEM_MD) { if (data & 1) { /* enable cartridge ROM */ m68k.memory_map[0].base = cart.base; } else { /* enable internal BOOT ROM */ m68k.memory_map[0].base = boot_rom; } } } unsigned int gen_bankswitch_r(void) { /* check if BOOT ROM is loaded */ if (system_bios & SYSTEM_MD) { return (m68k.memory_map[0].base == cart.base); } return 0xff; } /*-----------------------------------------------------------------------*/ /* Z80 Bus controller chip functions (Genesis mode) */ /* ----------------------------------------------------------------------*/ void gen_zbusreq_w(unsigned int data, unsigned int cycles) { if (data) /* !ZBUSREQ asserted */ { /* check if Z80 is going to be stopped */ if (zstate == 1) { /* resynchronize with 68k */ z80_run(cycles); /* enable 68k access to Z80 bus */ m68k.memory_map[0xa0].read8 = z80_read_byte; m68k.memory_map[0xa0].read16 = z80_read_word; m68k.memory_map[0xa0].write8 = z80_write_byte; m68k.memory_map[0xa0].write16 = z80_write_word; } /* update Z80 bus status */ zstate |= 2; } else /* !ZBUSREQ released */ { /* check if Z80 is going to be restarted */ if (zstate == 3) { /* resynchronize with 68k */ Z80.cycles = cycles; /* disable 68k access to Z80 bus */ m68k.memory_map[0xa0].read8 = m68k_read_bus_8; m68k.memory_map[0xa0].read16 = m68k_read_bus_16; m68k.memory_map[0xa0].write8 = m68k_unused_8_w; m68k.memory_map[0xa0].write16 = m68k_unused_16_w; } /* update Z80 bus status */ zstate &= 1; } } void gen_zreset_w(unsigned int data, unsigned int cycles) { if (data) /* !ZRESET released */ { /* check if Z80 is going to be restarted */ if (zstate == 0) { /* resynchronize with 68k */ Z80.cycles = cycles; /* reset Z80 & YM2612 */ z80_reset(); fm_reset(cycles); } /* check if 68k access to Z80 bus is granted */ else if (zstate == 2) { /* enable 68k access to Z80 bus */ m68k.memory_map[0xa0].read8 = z80_read_byte; m68k.memory_map[0xa0].read16 = z80_read_word; m68k.memory_map[0xa0].write8 = z80_write_byte; m68k.memory_map[0xa0].write16 = z80_write_word; /* reset Z80 & YM2612 */ z80_reset(); fm_reset(cycles); } /* update Z80 bus status */ zstate |= 1; } else /* !ZRESET asserted */ { /* check if Z80 is going to be stopped */ if (zstate == 1) { /* resynchronize with 68k */ z80_run(cycles); } /* check if 68k had access to Z80 bus */ else if (zstate == 3) { /* disable 68k access to Z80 bus */ m68k.memory_map[0xa0].read8 = m68k_read_bus_8; m68k.memory_map[0xa0].read16 = m68k_read_bus_16; m68k.memory_map[0xa0].write8 = m68k_unused_8_w; m68k.memory_map[0xa0].write16 = m68k_unused_16_w; } /* stop YM2612 */ fm_reset(cycles); /* update Z80 bus status */ zstate &= 2; } } void gen_zbank_w (unsigned int data) { zbank = ((zbank >> 1) | ((data & 1) << 23)) & 0xFF8000; } /*-----------------------------------------------------------------------*/ /* Z80 interrupt callback */ /* ----------------------------------------------------------------------*/ int z80_irq_callback (int param) { return -1; } gx/gx_audio.h000664 001750 001750 00000004571 12702465756 014315 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_audio.c * * Genesis Plus GX audio support * * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _GC_AUDIO_H_ #define _GC_AUDIO_H_ extern u32 audioSync; extern void gx_audio_Init(void); extern void gx_audio_Shutdown(void); extern void gx_audio_Start(void); extern void gx_audio_Stop(void); extern int gx_audio_Update(int status); #endif libretro/msvc/msvc-2003-xbox1/msvc-2003-xbox1.vcproj000664 001750 001750 00000043467 12702465756 022737 0ustar00sergiosergio000000 000000 gx/gx_audio.c000664 001750 001750 00000016452 12702465756 014311 0ustar00sergiosergio000000 000000 /**************************************************************************** * gx_audio.c * * Genesis Plus GX audio support * * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /* Length is dimensionned for at least one frame of emulation */ #define SOUND_BUFFER_LEN 4096 /* Number of sound buffers */ #define SOUND_BUFFER_NUM 3 /* DMA soundbuffers (required to be 32-bytes aligned) */ static u8 soundbuffer[SOUND_BUFFER_NUM][SOUND_BUFFER_LEN] ATTRIBUTE_ALIGN(32); /* Current work soundbuffer */ static int bufferIndex; static int bufferSize; /* Background music */ static u8 *Bg_music_ogg = NULL; static u32 Bg_music_ogg_size = 0; /* Frame Sync */ u32 audioSync; static u32 audioWait; /***************************************************************************************/ /* Audio engine */ /***************************************************************************************/ /* Audio DMA callback */ static void ai_callback(void) { audioWait = 0; } /* AUDIO engine initialization */ void gx_audio_Init(void) { /* Initialize AUDIO processing library (ASNDLIB) */ /* AUDIO & DSP hardware are initialized */ /* Default samplerate is set to 48kHz */ ASND_Init(); /* Load background music from FAT device */ char fname[MAXPATHLEN]; sprintf(fname,"%s/Bg_music.ogg",DEFAULT_PATH); FILE *f = fopen(fname,"rb"); if (f) { struct stat filestat; stat(fname, &filestat); Bg_music_ogg_size = filestat.st_size; Bg_music_ogg = memalign(32,Bg_music_ogg_size); if (Bg_music_ogg) { fread(Bg_music_ogg,1,Bg_music_ogg_size,f); } fclose(f); } } /* AUDIO engine shutdown */ void gx_audio_Shutdown(void) { PauseOgg(1); StopOgg(); ASND_Pause(1); ASND_End(); if (Bg_music_ogg) { free(Bg_music_ogg); } } /*** gx_audio_Update This function retrieves samples for the frame then set the next DMA parameters Parameters will be taken in account only when current DMA operation is over To keep audio & video synchronized, DMA from external memory to audio interface is started once by video update function when first frame is ready to be displayed, then anytime video mode is changed and emulation resynchronized to video hardware. Once started, audio DMA restarts automatically when all samples have been played. At that time: - if DMA settings have not been updated, previous sound buffer will be played again - if DMA settings are updated too fast, one sound buffer frame might be skipped Therefore, in order to maintain perfect audio playback without any sound skipping or lagging, we need to make sure frame emulation is completed and this function is called before previous DMA transfer is finished and after it has been started. This is done by synchronizing frame emulation with audio DMA interrupt (which happens anytime audio DMA restarts). When video sync is enabled, to keep emulation in sync with both video AND audio, an appropriate number of samples is rendered per frame by adjusting emulator output samplerate. ***/ int gx_audio_Update(int status) { /* Current available soundbuffer */ s16 *sb = (s16 *)(soundbuffer[bufferIndex]); /* Make sure current audio frame has not already been updated */ if (status & AUDIO_UPDATE) { /* Retrieve audio samples (size must be multiple of 32 bytes) */ bufferSize = audio_update(sb) * 4; DCStoreRange((void *)sb, bufferSize); /* Mark current audio frame as being updated */ status &= ~AUDIO_UPDATE; } /* Wait until previous audio frame is started before pushing current audio frame into DMA */ if ((status & AUDIO_WAIT) && !audioWait) { /* Update audio DMA settings for current frame */ AUDIO_InitDMA((u32)sb, bufferSize); /* Next soundbuffer */ bufferIndex = (bufferIndex + 1) % SOUND_BUFFER_NUM; /* Set audio wait flag */ audioWait = audioSync; /* Current audio frame is ready for upcoming DMA */ status &= ~AUDIO_WAIT; } return status; } /*** gx_audio_Start This function restarts the audio engine This is called when coming back from Main Menu ***/ void gx_audio_Start(void) { /* shutdown background music */ PauseOgg(1); StopOgg(); /* shutdown menu audio processing */ ASND_Pause(1); ASND_End(); AUDIO_StopDMA(); AUDIO_RegisterDMACallback(NULL); DSP_Halt(); /* DMA Interrupt callback */ AUDIO_RegisterDMACallback(ai_callback); /* emulation is synchronized with audio hardware by default */ audioSync = AUDIO_WAIT; /* reset emulation audio processing */ memset(soundbuffer, 0, sizeof(soundbuffer)); audioWait = 0; bufferSize = 0; bufferIndex = 0; } /*** gx_audio_Stop This function stops current Audio DMA process This is called when going back to Main Menu ***/ void gx_audio_Stop(void) { /* restart menu audio processing */ DSP_Unhalt(); ASND_Init(); ASND_Pause(0); /* play background music */ if (Bg_music_ogg && !Shutdown) { PauseOgg(0); PlayOgg((char *)Bg_music_ogg, Bg_music_ogg_size, 0, OGG_INFINITE_TIME); SetVolumeOgg(((int)config.bgm_volume * 255) / 100); } } gx/images/Bg_intro_c3.png000664 001750 001750 00000026266 12702465756 016455 0ustar00sergiosergio000000 000000 PNG  IHDRѸc$sBIT|d pHYs  ~tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$ IDATx{tUU: (L 00':*pl #M*"J2Ȉ ѻ&?AxI <;~QtU]tg9u]]g>  " l(P*U E TA(|Vш<塠0p[^9;;wJ BZZqݻcTUU!//NBzz:M?^ ;;[{IIIByǏGnn.jkkQ\\,'`#Gb}[z5=Z u#//cǎEBBْuG;}reg:?#G̙3xu{>xu+N5PBy)P( PPNmPn) ɸz*jNPB ޯ7 fo( mP( PP B(@BQ*U E TA(nyl!<l!(a[V'BP9f#ۂ-wX!҆ȩ .`3Z-{.Z 2=֯.;~pt^bBxp'-0,gF@f@syawǀPK.qKX9[6[L./#FAln-p6؄Ģ|#lhGzZ.q sH=s%EV,ਹjXy,ŎNT1ZDMᄦ8 O1_ORDƒ;l!Q1p\vH$^{:Ջѳ@W |;DXJ b*M[JAr ll!8WyQAqupI:!;z/Xơuow,e$Դa88yWxZGڃP!e%}}E=#PD/[zio_; ,g^{D>aի/QabaX0m\X@M@ M6pmN*^A-_шHv-WH@ԬhX4s>dL/s- L+*F04#Ձ8 ߦ8e|=jm`Ԭ0Ʉ`9ֈBv zD0~D4f sV!l!<~KoqZWQ- ˩&tF 23>R 󍈜ȧu8OEԜШojY~U(kx%&G/5ÀXha8rTWrlb#TynǂXUwDŽ8M U[5`#TFr6@ҀX`,u4S.aS24I: F۫hh$>Xܔ BMnaI6F᧗9Ρ s>Џ+@rKßCe5 F^نקڇ7l@VыM+#,Fr ֳ-tF̀:Ѹ\YwE?T AC`t,8_Ԡuod-  ڴNABь鵽Vw" EUVx+`=I` 0F|zIl a)1H:qҠ,ĺ$͘!zXvEZ*ֳfX϶@wGs`T wV uf݆i vrKo;.[I,IT*F @ظX AXjh|OqS)H(1huGm#T_^˸7姐0}0xrh-AyX~z!1PjrπEĤxtnZQP4c guk\acb\+%͈u4#hBǓ/`W1-W %-> 6Z#R Aђ)d1Pb` (X9a1{aCGPh`hEX80zޜj-AGq0PM@Ľ<5b>6*hV6WVxKlX#0l͈Y0n@3]D%pmN0,}1)р9]5Pc"\ %Ͱ͛ziL+QSG4T ,OǍP`=gF'UaI#kbk5rj` A(Rv6Rc7?lEkA5ԁѰ DLf`8@$p~"8ke;*L3![*ˇTV8pB1j~U۾h" bR<"u7P|{b;l?ZS-hXb`#T=Ꜯ*H(V_=AZjs]<"㯷CrWzsf8-Be@WubԷAOAU՗ψzº^ jZڪŞp<7~ g23gZ`,3,/꧇*V+Bx=T}4`U`:p78F@FChV!xa+3 fa*Vp^)bPF0*Q8~0n]ѱPznYnSR-8>XN4^OG &9D=>5`t,\[$G@8OC񱣊pW}AR^*Vqo?=kA,ֲztk$k{B[ YC aɞ(H(Vjֳ-4^&=MPE 6˵UO bѝ.Cqp5Hiۈ(Vl:{n_So"L+k坈8DNMAɗMC5_CmEޭt*24"$wy(klndDޟ(KvE6$7B[ݴ *a f@8vӀ'b;U=BHAրVHGk :~hrC> -ԴI{+*\ w6]Axղh??AWP4fV!=IPd.Bj}Zm__ ASD?] 4k[FVنA!h /,^v2 N]gzP$L++).Դ X}|$OmgZvUi-Jzy~l!(vM\ = "֝ܪo {=hb% +::$M+JhhXp4n) p:{*++^Ӊr86qIIIDee%,􈂄iE >^ŷ9ky7?~|Zm`6 xN4vJ\)Qkw^ &XN4u:JZ>}s*++? =\7J@$T.i.72hk^cV~j R0wXE[[9{'N@cccӪ|Bbbb5M"'퀡M~!T ,GmP@WCgչÑ'N㆔j|{$&$bذaQ^^1c <<'NlGQT:w Jo  % B(@BQ*U E TA(P( PP B(T fש&~My1b$ TWW)t" P( PP1߼cƌ3 Àz x衇!0 XqY!~xǠ t⭷Bmm-@c޼y:tWrrlٲyxVsT*jjj QQQXp!}^W^'OĮ]DBf͚ &riZ|fT*pNcǎW_U,'55ś{| z+V{PTc,fz$!d9Y]nfQUUF5J?zh\+VZpJJJD;N' &h,[ w?gϞr:رcE&^dž ~C t˺=r._,j5\JOOT$''̞=,ZtttH/O 2tPbZ%>L|kŊUoپ};@$:::ȸq*_kɦ#N߳g@$K/$eTܲe֭[ɨQݻ|g%=dɲr|']2Y]ﲯiĊBNNKn:L&޽ x.,,ԩSQZZ*p 55Ukڵka6JFgΜuRwJ.[ 55b=z lVd2IgΜ9sjdޣf9XȗܩyywO:Uֆ,z}~:Lw}(ȑ#Xlyԩ",.h4ʹlXf ydOV0o<;cC]Cll,)//WJJ 1L|Q>4d]66nܨxNZZLNJ~gQ"'O$~BHii˙X}@~iɱvٞL7,eobN3<#^vh Fh "U-++MII!Ett{W?5- V}AƌC&NHƌCv!Iq8l6fL$VO>dkTb$̟? R[[+w333e<}dnIrr2ٸqcp#ȨQѣ0tP[oW% &+dddȚ}`jufbBRRTNi1 gbJL55j/իQUUeaƊ z"g bi_?y;y$?.2,Y] IDATDpgÆ ߿l7rΝt'2k᫯BNN$~ر _ZUUK*W[[G}! &k`?ɓ31 ^kǏGdd0֠jqDGGJ(W\SM~/K;|rPRR,QQQzbSO=;wf-P0,z6 5Hg/~o=EoG#ppC@@WR( PP B(@BQFz߾}p85ғf;Co^-IIPnEhBQ*U E TA(>1|̜9z^ԕj%~Bɓ'GEBB(^`Ϟ=x7RMϛpjafmۆ|yuUg!**ܹ߿۷Od'_j`'OS+L:v:::.J,q9xbzj<"˞N/JݻErssh$Bb\%J0,`޼y^JOO'jZ֡ÍpB+ߒ $NA|Db M\¿Tcƌl 뮔kc=&{СCIuujS׋nor IHH>|Xv$--8.+ݥ gϞ L<444Ȗi&گ\xMMM$%%:tH8q{Ng!`&ָqd=x Ν… e]*eby(OLLDrrl~=QԲ2bܹꫯV8] h61c ۂ*Ѕ Fc=UW/BPŋ A\\O|F~Z֓UUn. e`ذa]|9222D7mϘ1oaZt :T6 NRSSe'gdd/ =>صk_VVٳg#''ׯGQQb>x I|[[^uHq[Vh4nѣGQXX(JaX*q8ѣGȑ#}Q~oL<=SOᮻˆ#|r|ׂ3g`ܸq~/hb(vؿ?aX,]Twn.2pwm2q:DדQFuKv ⵜg},]ddd3gΈ)WJzf3/^x>m޼YҥK?!XVӧOX(//ǡCk "q _]œ9s0p@}FC=$nc޼y"/} wC./^,IwSO=шӧc…]q8駟`E/ ݼy3.\ /[YY3gtifD||DŽ0 ^<8 ;!9n2PXX(2#[ZZz+ qqq΅fb?<`vONW~+W_iiZAMM(H\\JmÇwyT4F䫂F,ٳ0aW ǑW#v]=0j(=,6JJJ"{sWYw=zw^b6IKK(XV[ouIi]`0(uRTTSRZMYCFAȥK^; Vj 7nڞs~baڵj=)DDD7 )C ;0e`.YDEfǃ3gz=Ŋ{/9pxL2|~;ʼyp{ݷ8$&&bҤI# Fi֭^5_.]J=| )_nKvWJЗkǏ|mr?~o=5._+pΜ97tA.8#+W$g`lܸQLa(HEEd 6?ټ-G} rJkkߓA~7z!zw,?! 1b>. CSSFgϞŜ9s =GRRA*9>3TUUI򐘘(ӧ'{?xܬ]tWOQRRyV;vk(f[n5yСCaZQXX;w}nWn([ E TA(P( PP B(@BQ*U E TA(P( PP B(@BQ*U E TA(P( PP<^92طIENDB`core/sound/eq.h000664 001750 001750 00000003123 12702465756 014555 0ustar00sergiosergio000000 000000 /*--------------------------------------------------------------------------- // // 3 Band EQ :) // // EQ.H - Header file for 3 band EQ // // (c) Neil C / Etanza Systems / 2K6 // // Shouts / Loves / Moans = etanza at lycos dot co dot uk // // This work is hereby placed in the public domain for all purposes, including // use in commercial applications. // // The author assumes NO RESPONSIBILITY for any problems caused by the use of // this software. // //----------------------------------------------------------------------------*/ #ifndef __EQ3BAND__ #define __EQ3BAND__ /* ------------ //| Structures | // ------------*/ typedef struct { /* Filter #1 (Low band) */ double lf; /* Frequency */ double f1p0; /* Poles ... */ double f1p1; double f1p2; double f1p3; /* Filter #2 (High band) */ double hf; /* Frequency */ double f2p0; /* Poles ... */ double f2p1; double f2p2; double f2p3; /* Sample history buffer */ double sdm1; /* Sample data minus 1 */ double sdm2; /* 2 */ double sdm3; /* 3 */ /* Gain Controls */ double lg; /* low gain */ double mg; /* mid gain */ double hg; /* high gain */ } EQSTATE; /* --------- //| Exports | // ---------*/ extern void init_3band_state(EQSTATE * es, int lowfreq, int highfreq, int mixfreq); extern double do_3band(EQSTATE * es, int sample); #endif /* #ifndef __EQ3BAND__ */ core/sound/ym2612.h000664 001750 001750 00000001466 12702465756 015120 0ustar00sergiosergio000000 000000 /* ** ** software implementation of Yamaha FM sound generator (YM2612/YM3438) ** ** Original code (MAME fm.c) ** ** Copyright (C) 2001, 2002, 2003 Jarek Burczynski (bujar at mame dot net) ** Copyright (C) 1998 Tatsuyuki Satoh , MultiArcadeMachineEmulator development ** ** Version 1.4 (final beta) ** ** Additional code & fixes by Eke-Eke for Genesis Plus GX ** */ #ifndef _H_YM2612_ #define _H_YM2612_ extern void YM2612Init(void); extern void YM2612Config(unsigned char dac_bits); extern void YM2612ResetChip(void); extern void YM2612Update(int *buffer, int length); extern void YM2612Write(unsigned int a, unsigned int v); extern unsigned int YM2612Read(void); extern int YM2612LoadContext(unsigned char *state); extern int YM2612SaveContext(unsigned char *state); #endif /* _YM2612_ */ psp2/Makefile000664 001750 001750 00000012611 12702465756 014245 0ustar00sergiosergio000000 000000 # Makefile for genplus SDL # # (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald # modified by Eke-Eke # # Defines : # -DLSB_FIRST : for little endian systems. # -DLOGERROR : enable message logging # -DLOGVDP : enable VDP debug messages # -DLOGSOUND : enable AUDIO debug messages # -DLOG_SCD : enable SCD debug messages # -DLOG_CDD : enable CDD debug messages # -DLOG_CDC : enable CDC debug messages # -DLOG_PCM : enable PCM debug messages # -DLOGSOUND : enable AUDIO debug messages # -D8BPP_RENDERING - configure for 8-bit pixels (RGB332) # -D15BPP_RENDERING - configure for 15-bit pixels (RGB555) # -D16BPP_RENDERING - configure for 16-bit pixels (RGB565) # -D32BPP_RENDERING - configure for 32-bit pixels (RGB888) NAME = gen_vita PSP_APP_NAME=GENPLUSGXVITA PSP_APP_VER=1.7.5 CC = arm-vita-eabi-gcc CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing -ansi -std=c11 \ -pedantic-errors -fno-unwind-tables -fno-asynchronous-unwind-tables -ftree-vectorize \ -mfloat-abi=hard -ffast-math -fsingle-precision-constant -ftree-vectorizer-verbose=2 -fopt-info-vec-optimized -funroll-loops #-g -ggdb -pg #-fomit-frame-pointer LDFLAGS = -Wl,-q DEFINES = -DPSP_APP_NAME=\"$(PSP_APP_NAME)\" -DPSP_APP_VER=\"$(PSP_APP_VER)\" \ -DLSB_FIRST -DUSE_15BPP_RENDERING -DUSE_LIBTREMOR -DALT_RENDERER -DALIGN_LONG -DHAVE_ALLOCA_H -DUSE_ABGR SRCDIR = ../core INCLUDES = -I$(SRCDIR) -I$(SRCDIR)/z80 -I$(SRCDIR)/m68k -I$(SRCDIR)/sound -I$(SRCDIR)/input_hw -I$(SRCDIR)/cart_hw -I$(SRCDIR)/cart_hw/svp -I$(SRCDIR)/cd_hw -I$(SRCDIR)/ntsc -I$(SRCDIR)/tremor -I$(SRCDIR)/../psp2 LIBS = -lpsplib -lvita2d -lfreetype -lpng -lz -lm -lSceDisplay_stub -lSceGxm_stub \ -lSceCtrl_stub -lSceAudio_stub -lSceRtc_stub -lScePower_stub -lSceAppUtil_stub #-ldebugnet -lSceNet_stub -lSceNetCtl_stub OBJDIR = ./build_vita OBJECTS = $(OBJDIR)/z80.o OBJECTS += $(OBJDIR)/m68kcpu.o \ $(OBJDIR)/s68kcpu.o OBJECTS += $(OBJDIR)/genesis.o \ $(OBJDIR)/vdp_ctrl.o \ $(OBJDIR)/vdp_render.o \ $(OBJDIR)/system.o \ $(OBJDIR)/io_ctrl.o \ $(OBJDIR)/mem68k.o \ $(OBJDIR)/memz80.o \ $(OBJDIR)/membnk.o \ $(OBJDIR)/state.o \ $(OBJDIR)/loadrom.o OBJECTS += $(OBJDIR)/input.o \ $(OBJDIR)/gamepad.o \ $(OBJDIR)/lightgun.o \ $(OBJDIR)/mouse.o \ $(OBJDIR)/activator.o \ $(OBJDIR)/xe_1ap.o \ $(OBJDIR)/teamplayer.o \ $(OBJDIR)/paddle.o \ $(OBJDIR)/sportspad.o \ $(OBJDIR)/terebi_oekaki.o \ $(OBJDIR)/graphic_board.o OBJECTS += $(OBJDIR)/sound.o \ $(OBJDIR)/sn76489.o \ $(OBJDIR)/ym2413.o \ $(OBJDIR)/ym2612.o OBJECTS += $(OBJDIR)/blip_buf.o OBJECTS += $(OBJDIR)/eq.o OBJECTS += $(OBJDIR)/sram.o \ $(OBJDIR)/svp.o \ $(OBJDIR)/ssp16.o \ $(OBJDIR)/ggenie.o \ $(OBJDIR)/areplay.o \ $(OBJDIR)/eeprom_93c.o \ $(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/md_cart.o \ $(OBJDIR)/sms_cart.o OBJECTS += $(OBJDIR)/scd.o \ $(OBJDIR)/cdd.o \ $(OBJDIR)/cdc.o \ $(OBJDIR)/gfx.o \ $(OBJDIR)/pcm.o \ $(OBJDIR)/cd_cart.o OBJECTS += $(OBJDIR)/sms_ntsc.o \ $(OBJDIR)/md_ntsc.o OBJECTS += $(OBJDIR)/main.o \ $(OBJDIR)/emumain.o \ $(OBJDIR)/menu.o \ $(OBJDIR)/config.o \ $(OBJDIR)/error.o \ $(OBJDIR)/unzip.o \ $(OBJDIR)/fileio.o OBJECTS += $(OBJDIR)/bitwise.o \ $(OBJDIR)/block.o \ $(OBJDIR)/codebook.o \ $(OBJDIR)/floor0.o \ $(OBJDIR)/floor1.o \ $(OBJDIR)/framing.o \ $(OBJDIR)/info.o \ $(OBJDIR)/mapping0.o \ $(OBJDIR)/mdct.o \ $(OBJDIR)/registry.o \ $(OBJDIR)/res012.o \ $(OBJDIR)/sharedbook.o \ $(OBJDIR)/synthesis.o \ $(OBJDIR)/vorbisfile.o \ $(OBJDIR)/window.o all: $(NAME).velf $(NAME).velf: $(NAME).elf #advice from xyzz strip before create elf arm-vita-eabi-strip -g $< #i put db.json there use your location vita-elf-create $< $@ db.json $(NAME).elf: $(OBJDIR) $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@ $(OBJDIR) : @[ -d $@ ] || mkdir -p $@ $(OBJDIR)/%.o : $(SRCDIR)/%.c $(SRCDIR)/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/sound/%.c $(SRCDIR)/sound/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/input_hw/%.c $(SRCDIR)/input_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/%.c $(SRCDIR)/cart_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(SRCDIR)/cart_hw/svp/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cd_hw/%.c $(SRCDIR)/cd_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/z80/%.c $(SRCDIR)/z80/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/m68k/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/ntsc/%.c $(SRCDIR)/ntsc/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(SRCDIR)/tremor/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/../psp2/%.c $(SRCDIR)/../psp2/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ clean: rm -f $(OBJECTS) $(NAME).velf $(NAME).elf core/sound/ym2612.c000664 001750 001750 00000203534 12702465756 015113 0ustar00sergiosergio000000 000000 /* ** ** software implementation of Yamaha FM sound generator (YM2612/YM3438) ** ** Original code (MAME fm.c) ** ** Copyright (C) 2001, 2002, 2003 Jarek Burczynski (bujar at mame dot net) ** Copyright (C) 1998 Tatsuyuki Satoh , MultiArcadeMachineEmulator development ** ** Version 1.4 (final beta) ** ** Additional code & fixes by Eke-Eke for Genesis Plus GX ** ** Huge thanks to Nemesis, most of those fixes came from his tests on Sega Genesis hardware ** More informations at http://gendev.spritesmind.net/forum/viewtopic.php?t=386 ** ** TODO: ** - better documentation ** - BUSY flag emulation */ /* ** CHANGELOG: ** ** 01-09-2012 Eke-Eke (Genesis Plus GX): ** - removed input clock / output samplerate frequency ratio, chip now always run at (original) internal sample frequency ** - removed now uneeded extra bits of precision ** ** 2006~2012 Eke-Eke (Genesis Plus GX): ** - removed unused multichip support ** - added YM2612 Context external access functions ** - fixed LFO implementation: ** .added support for CH3 special mode: fixes various sound effects (birds in Warlock, bug sound in Aladdin...) ** .inverted LFO AM waveform: fixes Spider-Man & Venom : Separation Anxiety (intro), California Games (surfing event) ** .improved LFO timing accuracy: now updated AFTER sample output, like EG/PG updates, and without any precision loss anymore. ** - improved internal timers emulation ** - adjusted lowest EG rates increment values ** - fixed Attack Rate not being updated in some specific cases (Batman & Robin intro) ** - fixed EG behavior when Attack Rate is maximal ** - fixed EG behavior when SL=0 (Mega Turrican tracks 03,09...) or/and Key ON occurs at minimal attenuation ** - implemented EG output immediate changes on register writes ** - fixed YM2612 initial values (after the reset): fixes missing intro in B.O.B ** - implemented Detune overflow (Ariel, Comix Zone, Shaq Fu, Spiderman & many other games using GEMS sound engine) ** - implemented accurate CSM mode emulation ** - implemented accurate SSG-EG emulation (Asterix, Beavis&Butthead, Bubba'n Stix & many other games) ** - implemented accurate address/data ports behavior ** - added preliminar support for DAC precision ** ** 03-08-2003 Jarek Burczynski: ** - fixed YM2608 initial values (after the reset) ** - fixed flag and irqmask handling (YM2608) ** - fixed BUFRDY flag handling (YM2608) ** ** 14-06-2003 Jarek Burczynski: ** - implemented all of the YM2608 status register flags ** - implemented support for external memory read/write via YM2608 ** - implemented support for deltat memory limit register in YM2608 emulation ** ** 22-05-2003 Jarek Burczynski: ** - fixed LFO PM calculations (copy&paste bugfix) ** ** 08-05-2003 Jarek Burczynski: ** - fixed SSG support ** ** 22-04-2003 Jarek Burczynski: ** - implemented 100% correct LFO generator (verified on real YM2610 and YM2608) ** ** 15-04-2003 Jarek Burczynski: ** - added support for YM2608's register 0x110 - status mask ** ** 01-12-2002 Jarek Burczynski: ** - fixed register addressing in YM2608, YM2610, YM2610B chips. (verified on real YM2608) ** The addressing patch used for early Neo-Geo games can be removed now. ** ** 26-11-2002 Jarek Burczynski, Nicola Salmoria: ** - recreated YM2608 ADPCM ROM using data from real YM2608's output which leads to: ** - added emulation of YM2608 drums. ** - output of YM2608 is two times lower now - same as YM2610 (verified on real YM2608) ** ** 16-08-2002 Jarek Burczynski: ** - binary exact Envelope Generator (verified on real YM2203); ** identical to YM2151 ** - corrected 'off by one' error in feedback calculations (when feedback is off) ** - corrected connection (algorithm) calculation (verified on real YM2203 and YM2610) ** ** 18-12-2001 Jarek Burczynski: ** - added SSG-EG support (verified on real YM2203) ** ** 12-08-2001 Jarek Burczynski: ** - corrected sin_tab and tl_tab data (verified on real chip) ** - corrected feedback calculations (verified on real chip) ** - corrected phase generator calculations (verified on real chip) ** - corrected envelope generator calculations (verified on real chip) ** - corrected FM volume level (YM2610 and YM2610B). ** - changed YMxxxUpdateOne() functions (YM2203, YM2608, YM2610, YM2610B, YM2612) : ** this was needed to calculate YM2610 FM channels output correctly. ** (Each FM channel is calculated as in other chips, but the output of the channel ** gets shifted right by one *before* sending to accumulator. That was impossible to do ** with previous implementation). ** ** 23-07-2001 Jarek Burczynski, Nicola Salmoria: ** - corrected YM2610 ADPCM type A algorithm and tables (verified on real chip) ** ** 11-06-2001 Jarek Burczynski: ** - corrected end of sample bug in ADPCMA_calc_cha(). ** Real YM2610 checks for equality between current and end addresses (only 20 LSB bits). ** ** 08-12-98 hiro-shi: ** rename ADPCMA -> ADPCMB, ADPCMB -> ADPCMA ** move ROM limit check.(CALC_CH? -> 2610Write1/2) ** test program (ADPCMB_TEST) ** move ADPCM A/B end check. ** ADPCMB repeat flag(no check) ** change ADPCM volume rate (8->16) (32->48). ** ** 09-12-98 hiro-shi: ** change ADPCM volume. (8->16, 48->64) ** replace ym2610 ch0/3 (YM-2610B) ** change ADPCM_SHIFT (10->8) missing bank change 0x4000-0xffff. ** add ADPCM_SHIFT_MASK ** change ADPCMA_DECODE_MIN/MAX. */ /************************************************************************/ /* comment of hiro-shi(Hiromitsu Shioya) */ /* YM2610(B) = OPN-B */ /* YM2610 : PSG:3ch FM:4ch ADPCM(18.5KHz):6ch DeltaT ADPCM:1ch */ /* YM2610B : PSG:3ch FM:6ch ADPCM(18.5KHz):6ch DeltaT ADPCM:1ch */ /************************************************************************/ #include "shared.h" /* envelope generator */ #define ENV_BITS 10 #define ENV_LEN (1<>3) /* sin waveform table in 'decibel' scale */ static unsigned int sin_tab[SIN_LEN]; /* sustain level table (3dB per step) */ /* bit0, bit1, bit2, bit3, bit4, bit5, bit6 */ /* 1, 2, 4, 8, 16, 32, 64 (value)*/ /* 0.75, 1.5, 3, 6, 12, 24, 48 (dB)*/ /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/ /* attenuation value (10 bits) = (SL << 2) << 3 */ #define SC(db) (UINT32) ( db * (4.0/ENV_STEP) ) static const UINT32 sl_table[16]={ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7), SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31) }; #undef SC #define RATE_STEPS (8) static const UINT8 eg_inc[19*RATE_STEPS]={ /*cycle:0 1 2 3 4 5 6 7*/ /* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..11 0 (increment by 0 or 1) */ /* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..11 1 */ /* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..11 2 */ /* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..11 3 */ /* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 12 0 (increment by 1) */ /* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 12 1 */ /* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 12 2 */ /* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 12 3 */ /* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 13 0 (increment by 2) */ /* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 13 1 */ /*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 13 2 */ /*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 13 3 */ /*12 */ 4,4, 4,4, 4,4, 4,4, /* rate 14 0 (increment by 4) */ /*13 */ 4,4, 4,8, 4,4, 4,8, /* rate 14 1 */ /*14 */ 4,8, 4,8, 4,8, 4,8, /* rate 14 2 */ /*15 */ 4,8, 8,8, 4,8, 8,8, /* rate 14 3 */ /*16 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 8) */ /*17 */ 16,16,16,16,16,16,16,16, /* rates 15 2, 15 3 for attack */ /*18 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */ }; #define O(a) (a*RATE_STEPS) /*note that there is no O(17) in this table - it's directly in the code */ static const UINT8 eg_rate_select[32+64+32]={ /* Envelope Generator rates (32 + 64 rates + 32 RKS) */ /* 32 infinite time rates (same as Rate 0) */ O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18), /* rates 00-11 */ /* O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), */ O(18),O(18),O( 0),O( 0), O( 0),O( 0),O( 2),O( 2), /* Nemesis's tests */ O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), O( 0),O( 1),O( 2),O( 3), /* rate 12 */ O( 4),O( 5),O( 6),O( 7), /* rate 13 */ O( 8),O( 9),O(10),O(11), /* rate 14 */ O(12),O(13),O(14),O(15), /* rate 15 */ O(16),O(16),O(16),O(16), /* 32 dummy rates (same as 15 3) */ O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16), O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16), O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16), O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16) }; #undef O /*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15*/ /*shift 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 */ /*mask 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0, 0, 0 */ #define O(a) (a*1) static const UINT8 eg_rate_shift[32+64+32]={ /* Envelope Generator counter shifts (32 + 64 rates + 32 RKS) */ /* 32 infinite time rates */ /* O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), */ /* fixed (should be the same as rate 0, even if it makes no difference since increment value is 0 for these rates) */ O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11), O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11), O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11), O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11), /* rates 00-11 */ O(11),O(11),O(11),O(11), O(10),O(10),O(10),O(10), O( 9),O( 9),O( 9),O( 9), O( 8),O( 8),O( 8),O( 8), O( 7),O( 7),O( 7),O( 7), O( 6),O( 6),O( 6),O( 6), O( 5),O( 5),O( 5),O( 5), O( 4),O( 4),O( 4),O( 4), O( 3),O( 3),O( 3),O( 3), O( 2),O( 2),O( 2),O( 2), O( 1),O( 1),O( 1),O( 1), O( 0),O( 0),O( 0),O( 0), /* rate 12 */ O( 0),O( 0),O( 0),O( 0), /* rate 13 */ O( 0),O( 0),O( 0),O( 0), /* rate 14 */ O( 0),O( 0),O( 0),O( 0), /* rate 15 */ O( 0),O( 0),O( 0),O( 0), /* 32 dummy rates (same as 15 3) */ O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0), O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0), O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0), O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0) }; #undef O static const UINT8 dt_tab[4 * 32]={ /* this is YM2151 and YM2612 phase increment data (in 10.10 fixed point format)*/ /* FD=0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* FD=1 */ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, /* FD=2 */ 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16, /* FD=3 */ 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8 , 8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22 }; /* OPN key frequency number -> key code follow table */ /* fnum higher 4bit -> keycode lower 2bit */ static const UINT8 opn_fktable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3}; /* 8 LFO speed parameters */ /* each value represents number of samples that one LFO level will last for */ static const UINT32 lfo_samples_per_step[8] = {108, 77, 71, 67, 62, 44, 8, 5}; /*There are 4 different LFO AM depths available, they are: 0 dB, 1.4 dB, 5.9 dB, 11.8 dB Here is how it is generated (in EG steps): 11.8 dB = 0, 2, 4, 6, 8, 10,12,14,16...126,126,124,122,120,118,....4,2,0 5.9 dB = 0, 1, 2, 3, 4, 5, 6, 7, 8....63, 63, 62, 61, 60, 59,.....2,1,0 1.4 dB = 0, 0, 0, 0, 1, 1, 1, 1, 2,...15, 15, 15, 15, 14, 14,.....0,0,0 (1.4 dB is loosing precision as you can see) It's implemented as generator from 0..126 with step 2 then a shift right N times, where N is: 8 for 0 dB 3 for 1.4 dB 1 for 5.9 dB 0 for 11.8 dB */ static const UINT8 lfo_ams_depth_shift[4] = {8, 3, 1, 0}; /*There are 8 different LFO PM depths available, they are: 0, 3.4, 6.7, 10, 14, 20, 40, 80 (cents) Modulation level at each depth depends on F-NUMBER bits: 4,5,6,7,8,9,10 (bits 8,9,10 = FNUM MSB from OCT/FNUM register) Here we store only first quarter (positive one) of full waveform. Full table (lfo_pm_table) containing all 128 waveforms is build at run (init) time. One value in table below represents 4 (four) basic LFO steps (1 PM step = 4 AM steps). For example: at LFO SPEED=0 (which is 108 samples per basic LFO step) one value from "lfo_pm_output" table lasts for 432 consecutive samples (4*108=432) and one full LFO waveform cycle lasts for 13824 samples (32*432=13824; 32 because we store only a quarter of whole waveform in the table below) */ static const UINT8 lfo_pm_output[7*8][8]={ /* 7 bits meaningful (of F-NUMBER), 8 LFO output levels per one depth (out of 32), 8 LFO depths */ /* FNUM BIT 4: 000 0001xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 6 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 7 */ {0, 0, 0, 0, 1, 1, 1, 1}, /* FNUM BIT 5: 000 0010xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 6 */ {0, 0, 0, 0, 1, 1, 1, 1}, /* DEPTH 7 */ {0, 0, 1, 1, 2, 2, 2, 3}, /* FNUM BIT 6: 000 0100xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 1}, /* DEPTH 5 */ {0, 0, 0, 0, 1, 1, 1, 1}, /* DEPTH 6 */ {0, 0, 1, 1, 2, 2, 2, 3}, /* DEPTH 7 */ {0, 0, 2, 3, 4, 4, 5, 6}, /* FNUM BIT 7: 000 1000xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 1, 1}, /* DEPTH 3 */ {0, 0, 0, 0, 1, 1, 1, 1}, /* DEPTH 4 */ {0, 0, 0, 1, 1, 1, 1, 2}, /* DEPTH 5 */ {0, 0, 1, 1, 2, 2, 2, 3}, /* DEPTH 6 */ {0, 0, 2, 3, 4, 4, 5, 6}, /* DEPTH 7 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc}, /* FNUM BIT 8: 001 0000xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 1, 1, 1, 1}, /* DEPTH 2 */ {0, 0, 0, 1, 1, 1, 2, 2}, /* DEPTH 3 */ {0, 0, 1, 1, 2, 2, 3, 3}, /* DEPTH 4 */ {0, 0, 1, 2, 2, 2, 3, 4}, /* DEPTH 5 */ {0, 0, 2, 3, 4, 4, 5, 6}, /* DEPTH 6 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc}, /* DEPTH 7 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18}, /* FNUM BIT 9: 010 0000xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 2, 2, 2, 2}, /* DEPTH 2 */ {0, 0, 0, 2, 2, 2, 4, 4}, /* DEPTH 3 */ {0, 0, 2, 2, 4, 4, 6, 6}, /* DEPTH 4 */ {0, 0, 2, 4, 4, 4, 6, 8}, /* DEPTH 5 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc}, /* DEPTH 6 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18}, /* DEPTH 7 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30}, /* FNUM BIT10: 100 0000xxxx */ /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0}, /* DEPTH 1 */ {0, 0, 0, 0, 4, 4, 4, 4}, /* DEPTH 2 */ {0, 0, 0, 4, 4, 4, 8, 8}, /* DEPTH 3 */ {0, 0, 4, 4, 8, 8, 0xc, 0xc}, /* DEPTH 4 */ {0, 0, 4, 8, 8, 8, 0xc,0x10}, /* DEPTH 5 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18}, /* DEPTH 6 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30}, /* DEPTH 7 */ {0, 0,0x20,0x30,0x40,0x40,0x50,0x60}, }; /* all 128 LFO PM waveforms */ static INT32 lfo_pm_table[128*8*32]; /* 128 combinations of 7 bits meaningful (of F-NUMBER), 8 LFO depths, 32 LFO output levels per one depth */ /* register number to channel number , slot offset */ #define OPN_CHAN(N) (N&3) #define OPN_SLOT(N) ((N>>2)&3) /* slot number */ #define SLOT1 0 #define SLOT2 2 #define SLOT3 1 #define SLOT4 3 /* struct describing a single operator (SLOT) */ typedef struct { INT32 *DT; /* detune :dt_tab[DT] */ UINT8 KSR; /* key scale rate :3-KSR */ UINT32 ar; /* attack rate */ UINT32 d1r; /* decay rate */ UINT32 d2r; /* sustain rate */ UINT32 rr; /* release rate */ UINT8 ksr; /* key scale rate :kcode>>(3-KSR) */ UINT32 mul; /* multiple :ML_TABLE[ML] */ /* Phase Generator */ UINT32 phase; /* phase counter */ INT32 Incr; /* phase step */ /* Envelope Generator */ UINT8 state; /* phase type */ UINT32 tl; /* total level: TL << 3 */ INT32 volume; /* envelope counter */ UINT32 sl; /* sustain level:sl_table[SL] */ UINT32 vol_out; /* current output from EG circuit (without AM from LFO) */ UINT8 eg_sh_ar; /* (attack state) */ UINT8 eg_sel_ar; /* (attack state) */ UINT8 eg_sh_d1r; /* (decay state) */ UINT8 eg_sel_d1r; /* (decay state) */ UINT8 eg_sh_d2r; /* (sustain state) */ UINT8 eg_sel_d2r; /* (sustain state) */ UINT8 eg_sh_rr; /* (release state) */ UINT8 eg_sel_rr; /* (release state) */ UINT8 ssg; /* SSG-EG waveform */ UINT8 ssgn; /* SSG-EG negated output */ UINT8 key; /* 0=last key was KEY OFF, 1=KEY ON */ /* LFO */ UINT32 AMmask; /* AM enable flag */ } FM_SLOT; typedef struct { FM_SLOT SLOT[4]; /* four SLOTs (operators) */ UINT8 ALGO; /* algorithm */ UINT8 FB; /* feedback shift */ INT32 op1_out[2]; /* op1 output for feedback */ INT32 *connect1; /* SLOT1 output pointer */ INT32 *connect3; /* SLOT3 output pointer */ INT32 *connect2; /* SLOT2 output pointer */ INT32 *connect4; /* SLOT4 output pointer */ INT32 *mem_connect; /* where to put the delayed sample (MEM) */ INT32 mem_value; /* delayed sample (MEM) value */ INT32 pms; /* channel PMS */ UINT8 ams; /* channel AMS */ UINT32 fc; /* fnum,blk */ UINT8 kcode; /* key code */ UINT32 block_fnum; /* blk/fnum value (for LFO PM calculations) */ } FM_CH; typedef struct { UINT16 address; /* address register */ UINT8 status; /* status flag */ UINT32 mode; /* mode CSM / 3SLOT */ UINT8 fn_h; /* freq latch */ INT32 TA; /* timer a value */ INT32 TAL; /* timer a base */ INT32 TAC; /* timer a counter */ INT32 TB; /* timer b value */ INT32 TBL; /* timer b base */ INT32 TBC; /* timer b counter */ INT32 dt_tab[8][32]; /* DeTune table */ } FM_ST; /***********************************************************/ /* OPN unit */ /***********************************************************/ /* OPN 3slot struct */ typedef struct { UINT32 fc[3]; /* fnum3,blk3: calculated */ UINT8 fn_h; /* freq3 latch */ UINT8 kcode[3]; /* key code */ UINT32 block_fnum[3]; /* current fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */ UINT8 key_csm; /* CSM mode Key-ON flag */ } FM_3SLOT; /* OPN/A/B common state */ typedef struct { FM_ST ST; /* general state */ FM_3SLOT SL3; /* 3 slot mode state */ unsigned int pan[6*2]; /* fm channels output masks (0xffffffff = enable) */ /* EG */ UINT32 eg_cnt; /* global envelope generator counter */ UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/144/3 */ /* LFO */ UINT8 lfo_cnt; /* current LFO phase (out of 128) */ UINT32 lfo_timer; /* current LFO phase runs at LFO frequency */ UINT32 lfo_timer_overflow; /* LFO timer overflows every N samples (depends on LFO frequency) */ UINT32 LFO_AM; /* current LFO AM step */ UINT32 LFO_PM; /* current LFO PM step */ } FM_OPN; /***********************************************************/ /* YM2612 chip */ /***********************************************************/ typedef struct { FM_CH CH[6]; /* channel state */ UINT8 dacen; /* DAC mode */ INT32 dacout; /* DAC output */ FM_OPN OPN; /* OPN state */ } YM2612; /* emulated chip */ static YM2612 ym2612; /* current chip state */ static INT32 m2,c1,c2; /* Phase Modulation input for operators 2,3,4 */ static INT32 mem; /* one sample delay memory */ static INT32 out_fm[8]; /* outputs of working channels */ static UINT32 bitmask; /* working channels output bitmasking (DAC quantization) */ INLINE void FM_KEYON(FM_CH *CH , int s ) { FM_SLOT *SLOT = &CH->SLOT[s]; if (!SLOT->key && !ym2612.OPN.SL3.key_csm) { /* restart Phase Generator */ SLOT->phase = 0; /* reset SSG-EG inversion flag */ SLOT->ssgn = 0; if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/) { SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT; } else { /* force attenuation level to 0 */ SLOT->volume = MIN_ATT_INDEX; /* directly switch to Decay (or Sustain) */ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; } /* recalculate EG output */ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04))) SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } SLOT->key = 1; } INLINE void FM_KEYOFF(FM_CH *CH , int s ) { FM_SLOT *SLOT = &CH->SLOT[s]; if (SLOT->key && !ym2612.OPN.SL3.key_csm) { if (SLOT->state>EG_REL) { SLOT->state = EG_REL; /* phase -> Release */ /* SSG-EG specific update */ if (SLOT->ssg&0x08) { /* convert EG attenuation level */ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) SLOT->volume = (0x200 - SLOT->volume); /* force EG attenuation level */ if (SLOT->volume >= 0x200) { SLOT->volume = MAX_ATT_INDEX; SLOT->state = EG_OFF; } /* recalculate EG output */ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } } SLOT->key = 0; } INLINE void FM_KEYON_CSM(FM_CH *CH , int s ) { FM_SLOT *SLOT = &CH->SLOT[s]; if (!SLOT->key && !ym2612.OPN.SL3.key_csm) { /* restart Phase Generator */ SLOT->phase = 0; /* reset SSG-EG inversion flag */ SLOT->ssgn = 0; if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/) { SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT; } else { /* force attenuation level to 0 */ SLOT->volume = MIN_ATT_INDEX; /* directly switch to Decay (or Sustain) */ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; } /* recalculate EG output */ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04))) SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } INLINE void FM_KEYOFF_CSM(FM_CH *CH , int s ) { FM_SLOT *SLOT = &CH->SLOT[s]; if (!SLOT->key) { if (SLOT->state>EG_REL) { SLOT->state = EG_REL; /* phase -> Release */ /* SSG-EG specific update */ if (SLOT->ssg&0x08) { /* convert EG attenuation level */ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) SLOT->volume = (0x200 - SLOT->volume); /* force EG attenuation level */ if (SLOT->volume >= 0x200) { SLOT->volume = MAX_ATT_INDEX; SLOT->state = EG_OFF; } /* recalculate EG output */ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } } } /* CSM Key Controll */ INLINE void CSMKeyControll(FM_CH *CH) { /* all key ON (verified by Nemesis on real hardware) */ FM_KEYON_CSM(CH,SLOT1); FM_KEYON_CSM(CH,SLOT2); FM_KEYON_CSM(CH,SLOT3); FM_KEYON_CSM(CH,SLOT4); ym2612.OPN.SL3.key_csm = 1; } INLINE void INTERNAL_TIMER_A() { if (ym2612.OPN.ST.mode & 0x01) { ym2612.OPN.ST.TAC--; if (ym2612.OPN.ST.TAC <= 0) { /* set status (if enabled) */ if (ym2612.OPN.ST.mode & 0x04) ym2612.OPN.ST.status |= 0x01; /* reload the counter */ ym2612.OPN.ST.TAC = ym2612.OPN.ST.TAL; /* CSM mode auto key on */ if ((ym2612.OPN.ST.mode & 0xC0) == 0x80) CSMKeyControll(&ym2612.CH[2]); } } } INLINE void INTERNAL_TIMER_B(int step) { if (ym2612.OPN.ST.mode & 0x02) { ym2612.OPN.ST.TBC-=step; if (ym2612.OPN.ST.TBC <= 0) { /* set status (if enabled) */ if (ym2612.OPN.ST.mode & 0x08) ym2612.OPN.ST.status |= 0x02; /* reload the counter */ if (ym2612.OPN.ST.TBL) ym2612.OPN.ST.TBC += ym2612.OPN.ST.TBL; else ym2612.OPN.ST.TBC = ym2612.OPN.ST.TBL; } } } /* OPN Mode Register Write */ INLINE void set_timers(int v ) { /* b7 = CSM MODE */ /* b6 = 3 slot mode */ /* b5 = reset b */ /* b4 = reset a */ /* b3 = timer enable b */ /* b2 = timer enable a */ /* b1 = load b */ /* b0 = load a */ if ((ym2612.OPN.ST.mode ^ v) & 0xC0) { /* phase increment need to be recalculated */ ym2612.CH[2].SLOT[SLOT1].Incr=-1; /* CSM mode disabled and CSM key ON active*/ if (((v & 0xC0) != 0x80) && ym2612.OPN.SL3.key_csm) { /* CSM Mode Key OFF (verified by Nemesis on real hardware) */ FM_KEYOFF_CSM(&ym2612.CH[2],SLOT1); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT2); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT3); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT4); ym2612.OPN.SL3.key_csm = 0; } } /* reload Timers */ if ((v&1) && !(ym2612.OPN.ST.mode&1)) ym2612.OPN.ST.TAC = ym2612.OPN.ST.TAL; if ((v&2) && !(ym2612.OPN.ST.mode&2)) ym2612.OPN.ST.TBC = ym2612.OPN.ST.TBL; /* reset Timers flags */ ym2612.OPN.ST.status &= (~v >> 4); ym2612.OPN.ST.mode = v; } /* set algorithm connection */ INLINE void setup_connection( FM_CH *CH, int ch ) { INT32 *carrier = &out_fm[ch]; INT32 **om1 = &CH->connect1; INT32 **om2 = &CH->connect3; INT32 **oc1 = &CH->connect2; INT32 **memc = &CH->mem_connect; switch( CH->ALGO ){ case 0: /* M1---C1---MEM---M2---C2---OUT */ *om1 = &c1; *oc1 = &mem; *om2 = &c2; *memc= &m2; break; case 1: /* M1------+-MEM---M2---C2---OUT */ /* C1-+ */ *om1 = &mem; *oc1 = &mem; *om2 = &c2; *memc= &m2; break; case 2: /* M1-----------------+-C2---OUT */ /* C1---MEM---M2-+ */ *om1 = &c2; *oc1 = &mem; *om2 = &c2; *memc= &m2; break; case 3: /* M1---C1---MEM------+-C2---OUT */ /* M2-+ */ *om1 = &c1; *oc1 = &mem; *om2 = &c2; *memc= &c2; break; case 4: /* M1---C1-+-OUT */ /* M2---C2-+ */ /* MEM: not used */ *om1 = &c1; *oc1 = carrier; *om2 = &c2; *memc= &mem; /* store it anywhere where it will not be used */ break; case 5: /* +----C1----+ */ /* M1-+-MEM---M2-+-OUT */ /* +----C2----+ */ *om1 = 0; /* special mark */ *oc1 = carrier; *om2 = carrier; *memc= &m2; break; case 6: /* M1---C1-+ */ /* M2-+-OUT */ /* C2-+ */ /* MEM: not used */ *om1 = &c1; *oc1 = carrier; *om2 = carrier; *memc= &mem; /* store it anywhere where it will not be used */ break; case 7: /* M1-+ */ /* C1-+-OUT */ /* M2-+ */ /* C2-+ */ /* MEM: not used*/ *om1 = carrier; *oc1 = carrier; *om2 = carrier; *memc= &mem; /* store it anywhere where it will not be used */ break; } CH->connect4 = carrier; } /* set detune & multiple */ INLINE void set_det_mul(FM_CH *CH,FM_SLOT *SLOT,int v) { SLOT->mul = (v&0x0f)? (v&0x0f)*2 : 1; SLOT->DT = ym2612.OPN.ST.dt_tab[(v>>4)&7]; CH->SLOT[SLOT1].Incr=-1; } /* set total level */ INLINE void set_tl(FM_SLOT *SLOT , int v) { SLOT->tl = (v&0x7f)<<(ENV_BITS-7); /* 7bit TL */ /* recalculate EG output */ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04)) && (SLOT->state > EG_REL)) SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } /* set attack rate & key scale */ INLINE void set_ar_ksr(FM_CH *CH,FM_SLOT *SLOT,int v) { UINT8 old_KSR = SLOT->KSR; SLOT->ar = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0; SLOT->KSR = 3-(v>>6); if (SLOT->KSR != old_KSR) { CH->SLOT[SLOT1].Incr=-1; } /* Even if it seems unnecessary to do it here, it could happen that KSR and KC */ /* are modified but the resulted SLOT->ksr value (kc >> SLOT->KSR) remains unchanged. */ /* In such case, Attack Rate would not be recalculated by "refresh_fc_eg_slot". */ /* This actually fixes the intro of "The Adventures of Batman & Robin" (Eke-Eke) */ if ((SLOT->ar + SLOT->ksr) < (32+62)) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; } else { /* verified by Nemesis on real hardware (Attack phase is blocked) */ SLOT->eg_sh_ar = 0; SLOT->eg_sel_ar = 18*RATE_STEPS; } } /* set decay rate */ INLINE void set_dr(FM_SLOT *SLOT,int v) { SLOT->d1r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0; SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + SLOT->ksr]; SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + SLOT->ksr]; } /* set sustain rate */ INLINE void set_sr(FM_SLOT *SLOT,int v) { SLOT->d2r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0; SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + SLOT->ksr]; SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + SLOT->ksr]; } /* set release rate */ INLINE void set_sl_rr(FM_SLOT *SLOT,int v) { SLOT->sl = sl_table[ v>>4 ]; /* check EG state changes */ if ((SLOT->state == EG_DEC) && (SLOT->volume >= (INT32)(SLOT->sl))) SLOT->state = EG_SUS; SLOT->rr = 34 + ((v&0x0f)<<2); SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr]; SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr]; } /* advance LFO to next sample */ INLINE void advance_lfo() { if (ym2612.OPN.lfo_timer_overflow) /* LFO enabled ? */ { /* increment LFO timer (every samples) */ ym2612.OPN.lfo_timer ++; /* when LFO is enabled, one level will last for 108, 77, 71, 67, 62, 44, 8 or 5 samples */ if (ym2612.OPN.lfo_timer >= ym2612.OPN.lfo_timer_overflow) { ym2612.OPN.lfo_timer = 0; /* There are 128 LFO steps */ ym2612.OPN.lfo_cnt = ( ym2612.OPN.lfo_cnt + 1 ) & 127; /* triangle (inverted) */ /* AM: from 126 to 0 step -2, 0 to 126 step +2 */ if (ym2612.OPN.lfo_cnt<64) ym2612.OPN.LFO_AM = (ym2612.OPN.lfo_cnt ^ 63) << 1; else ym2612.OPN.LFO_AM = (ym2612.OPN.lfo_cnt & 63) << 1; /* PM works with 4 times slower clock */ ym2612.OPN.LFO_PM = ym2612.OPN.lfo_cnt >> 2; } } } INLINE void advance_eg_channels(FM_CH *CH, unsigned int eg_cnt) { unsigned int i = 6; /* six channels */ unsigned int j; FM_SLOT *SLOT; do { SLOT = &CH->SLOT[SLOT1]; j = 4; /* four operators per channel */ do { switch(SLOT->state) { case EG_ATT: /* attack phase */ { if (!(eg_cnt & ((1<eg_sh_ar)-1))) { /* update attenuation level */ SLOT->volume += (~SLOT->volume * (eg_inc[SLOT->eg_sel_ar + ((eg_cnt>>SLOT->eg_sh_ar)&7)]))>>4; /* check phase transition*/ if (SLOT->volume <= MIN_ATT_INDEX) { SLOT->volume = MIN_ATT_INDEX; SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; /* special case where SL=0 */ } /* recalculate EG output */ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04))) /* SSG-EG Output Inversion */ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } break; } case EG_DEC: /* decay phase */ { if (!(eg_cnt & ((1<eg_sh_d1r)-1))) { /* SSG EG type */ if (SLOT->ssg&0x08) { /* update attenuation level */ if (SLOT->volume < 0x200) { SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d1r + ((eg_cnt>>SLOT->eg_sh_d1r)&7)]; /* recalculate EG output */ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) /* SSG-EG Output Inversion */ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } else { /* update attenuation level */ SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((eg_cnt>>SLOT->eg_sh_d1r)&7)]; /* recalculate EG output */ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } /* check phase transition*/ if (SLOT->volume >= (INT32)(SLOT->sl)) SLOT->state = EG_SUS; } break; } case EG_SUS: /* sustain phase */ { if (!(eg_cnt & ((1<eg_sh_d2r)-1))) { /* SSG EG type */ if (SLOT->ssg&0x08) { /* update attenuation level */ if (SLOT->volume < 0x200) { SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d2r + ((eg_cnt>>SLOT->eg_sh_d2r)&7)]; /* recalculate EG output */ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) /* SSG-EG Output Inversion */ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } else { /* update attenuation level */ SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((eg_cnt>>SLOT->eg_sh_d2r)&7)]; /* check phase transition*/ if ( SLOT->volume >= MAX_ATT_INDEX ) SLOT->volume = MAX_ATT_INDEX; /* do not change SLOT->state (verified on real chip) */ /* recalculate EG output */ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } } break; } case EG_REL: /* release phase */ { if (!(eg_cnt & ((1<eg_sh_rr)-1))) { /* SSG EG type */ if (SLOT->ssg&0x08) { /* update attenuation level */ if (SLOT->volume < 0x200) SLOT->volume += 4 * eg_inc[SLOT->eg_sel_rr + ((eg_cnt>>SLOT->eg_sh_rr)&7)]; /* check phase transition */ if (SLOT->volume >= 0x200) { SLOT->volume = MAX_ATT_INDEX; SLOT->state = EG_OFF; } } else { /* update attenuation level */ SLOT->volume += eg_inc[SLOT->eg_sel_rr + ((eg_cnt>>SLOT->eg_sh_rr)&7)]; /* check phase transition*/ if (SLOT->volume >= MAX_ATT_INDEX) { SLOT->volume = MAX_ATT_INDEX; SLOT->state = EG_OFF; } } /* recalculate EG output */ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } break; } } /* next slot */ SLOT++; } while (--j); /* next channel */ CH++; } while (--i); } /* SSG-EG update process */ /* The behavior is based upon Nemesis tests on real hardware */ /* This is actually executed before each samples */ INLINE void update_ssg_eg_channels(FM_CH *CH) { unsigned int i = 6; /* six channels */ unsigned int j; FM_SLOT *SLOT; do { j = 4; /* four operators per channel */ SLOT = &CH->SLOT[SLOT1]; do { /* detect SSG-EG transition */ /* this is not required during release phase as the attenuation has been forced to MAX and output invert flag is not used */ /* if an Attack Phase is programmed, inversion can occur on each sample */ if ((SLOT->ssg & 0x08) && (SLOT->volume >= 0x200) && (SLOT->state > EG_REL)) { if (SLOT->ssg & 0x01) /* bit 0 = hold SSG-EG */ { /* set inversion flag */ if (SLOT->ssg & 0x02) SLOT->ssgn = 4; /* force attenuation level during decay phases */ if ((SLOT->state != EG_ATT) && !(SLOT->ssgn ^ (SLOT->ssg & 0x04))) SLOT->volume = MAX_ATT_INDEX; } else /* loop SSG-EG */ { /* toggle output inversion flag or reset Phase Generator */ if (SLOT->ssg & 0x02) SLOT->ssgn ^= 4; else SLOT->phase = 0; /* same as Key ON */ if (SLOT->state != EG_ATT) { if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/) { SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT; } else { /* Attack Rate is maximal: directly switch to Decay or Substain */ SLOT->volume = MIN_ATT_INDEX; SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; } } } /* recalculate EG output */ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } /* next slot */ SLOT++; } while (--j); /* next channel */ CH++; } while (--i); } INLINE void update_phase_lfo_slot(FM_SLOT *SLOT, INT32 pms, UINT32 block_fnum) { INT32 lfo_fn_table_index_offset = lfo_pm_table[(((block_fnum & 0x7f0) >> 4) << 8) + pms + ym2612.OPN.LFO_PM]; if (lfo_fn_table_index_offset) /* LFO phase modulation active */ { UINT8 blk; unsigned int kc, fc; /* there are 2048 FNUMs that can be generated using FNUM/BLK registers but LFO works with one more bit of a precision so we really need 4096 elements */ block_fnum = block_fnum*2 + lfo_fn_table_index_offset; blk = (block_fnum&0x7000) >> 12; block_fnum = block_fnum & 0xfff; /* keyscale code */ kc = (blk<<2) | opn_fktable[block_fnum >> 8]; /* (frequency) phase increment counter */ fc = (((block_fnum << 5) >> (7 - blk)) + SLOT->DT[kc]) & DT_MASK; /* update phase */ SLOT->phase += (fc * SLOT->mul) >> 1; } else /* LFO phase modulation = zero */ { SLOT->phase += SLOT->Incr; } } INLINE void update_phase_lfo_channel(FM_CH *CH) { UINT32 block_fnum = CH->block_fnum; INT32 lfo_fn_table_index_offset = lfo_pm_table[(((block_fnum & 0x7f0) >> 4) << 8) + CH->pms + ym2612.OPN.LFO_PM]; if (lfo_fn_table_index_offset) /* LFO phase modulation active */ { UINT8 blk; unsigned int kc, fc, finc; /* there are 2048 FNUMs that can be generated using FNUM/BLK registers but LFO works with one more bit of a precision so we really need 4096 elements */ block_fnum = block_fnum*2 + lfo_fn_table_index_offset; blk = (block_fnum&0x7000) >> 12; block_fnum = block_fnum & 0xfff; /* keyscale code */ kc = (blk<<2) | opn_fktable[block_fnum >> 8]; /* (frequency) phase increment counter */ fc = (block_fnum << 5) >> (7 - blk); /* apply DETUNE & MUL operator specific values */ finc = (fc + CH->SLOT[SLOT1].DT[kc]) & DT_MASK; CH->SLOT[SLOT1].phase += (finc*CH->SLOT[SLOT1].mul) >> 1; finc = (fc + CH->SLOT[SLOT2].DT[kc]) & DT_MASK; CH->SLOT[SLOT2].phase += (finc*CH->SLOT[SLOT2].mul) >> 1; finc = (fc + CH->SLOT[SLOT3].DT[kc]) & DT_MASK; CH->SLOT[SLOT3].phase += (finc*CH->SLOT[SLOT3].mul) >> 1; finc = (fc + CH->SLOT[SLOT4].DT[kc]) & DT_MASK; CH->SLOT[SLOT4].phase += (finc*CH->SLOT[SLOT4].mul) >> 1; } else /* LFO phase modulation = zero */ { CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr; CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr; CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr; CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr; } } /* update phase increment and envelope generator */ INLINE void refresh_fc_eg_slot(FM_SLOT *SLOT , unsigned int fc , unsigned int kc ) { /* add detune value */ fc += SLOT->DT[kc]; /* (frequency) phase overflow (credits to Nemesis) */ fc &= DT_MASK; /* (frequency) phase increment counter */ SLOT->Incr = (fc * SLOT->mul) >> 1; /* ksr */ kc = kc >> SLOT->KSR; if( SLOT->ksr != kc ) { SLOT->ksr = kc; /* recalculate envelope generator rates */ if ((SLOT->ar + kc) < (32+62)) { SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + kc ]; SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + kc ]; } else { /* verified by Nemesis on real hardware (Attack phase is blocked) */ SLOT->eg_sh_ar = 0; SLOT->eg_sel_ar = 18*RATE_STEPS; } SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + kc]; SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + kc]; SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + kc]; SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + kc]; SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + kc]; SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + kc]; } } /* update phase increment counters */ INLINE void refresh_fc_eg_chan(FM_CH *CH ) { if( CH->SLOT[SLOT1].Incr==-1) { int fc = CH->fc; int kc = CH->kcode; refresh_fc_eg_slot(&CH->SLOT[SLOT1] , fc , kc ); refresh_fc_eg_slot(&CH->SLOT[SLOT2] , fc , kc ); refresh_fc_eg_slot(&CH->SLOT[SLOT3] , fc , kc ); refresh_fc_eg_slot(&CH->SLOT[SLOT4] , fc , kc ); } } #define volume_calc(OP) ((OP)->vol_out + (AM & (OP)->AMmask)) INLINE signed int op_calc(UINT32 phase, unsigned int env, unsigned int pm) { UINT32 p = (env<<3) + sin_tab[ ( (phase >> SIN_BITS) + (pm >> 1) ) & SIN_MASK ]; if (p >= TL_TAB_LEN) return 0; return tl_tab[p]; } INLINE signed int op_calc1(UINT32 phase, unsigned int env, unsigned int pm) { UINT32 p = (env<<3) + sin_tab[ ( (phase + pm ) >> SIN_BITS ) & SIN_MASK ]; if (p >= TL_TAB_LEN) return 0; return tl_tab[p]; } INLINE void chan_calc(FM_CH *CH, int num) { do { UINT32 AM = ym2612.OPN.LFO_AM >> CH->ams; unsigned int eg_out = volume_calc(&CH->SLOT[SLOT1]); m2 = c1 = c2 = mem = 0; *CH->mem_connect = CH->mem_value; /* restore delayed sample (MEM) value to m2 or c2 */ { INT32 out = CH->op1_out[0] + CH->op1_out[1]; CH->op1_out[0] = CH->op1_out[1]; if( !CH->connect1 ){ /* algorithm 5 */ mem = c1 = c2 = CH->op1_out[0]; }else{ /* other algorithms */ *CH->connect1 += CH->op1_out[0]; } CH->op1_out[1] = 0; if( eg_out < ENV_QUIET ) /* SLOT 1 */ { if (!CH->FB) out=0; CH->op1_out[1] = op_calc1(CH->SLOT[SLOT1].phase, eg_out, (out<FB) ); } } eg_out = volume_calc(&CH->SLOT[SLOT3]); if( eg_out < ENV_QUIET ) /* SLOT 3 */ *CH->connect3 += op_calc(CH->SLOT[SLOT3].phase, eg_out, m2); eg_out = volume_calc(&CH->SLOT[SLOT2]); if( eg_out < ENV_QUIET ) /* SLOT 2 */ *CH->connect2 += op_calc(CH->SLOT[SLOT2].phase, eg_out, c1); eg_out = volume_calc(&CH->SLOT[SLOT4]); if( eg_out < ENV_QUIET ) /* SLOT 4 */ *CH->connect4 += op_calc(CH->SLOT[SLOT4].phase, eg_out, c2); /* store current MEM */ CH->mem_value = mem; /* update phase counters AFTER output calculations */ if(CH->pms) { /* add support for 3 slot mode */ if ((ym2612.OPN.ST.mode & 0xC0) && (CH == &ym2612.CH[2])) { update_phase_lfo_slot(&CH->SLOT[SLOT1], CH->pms, ym2612.OPN.SL3.block_fnum[1]); update_phase_lfo_slot(&CH->SLOT[SLOT2], CH->pms, ym2612.OPN.SL3.block_fnum[2]); update_phase_lfo_slot(&CH->SLOT[SLOT3], CH->pms, ym2612.OPN.SL3.block_fnum[0]); update_phase_lfo_slot(&CH->SLOT[SLOT4], CH->pms, CH->block_fnum); } else { update_phase_lfo_channel(CH); } } else /* no LFO phase modulation */ { CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr; CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr; CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr; CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr; } /* next channel */ CH++; } while (--num); } /* write a OPN mode register 0x20-0x2f */ INLINE void OPNWriteMode(int r, int v) { UINT8 c; FM_CH *CH; switch(r){ case 0x21: /* Test */ break; case 0x22: /* LFO FREQ (YM2608/YM2610/YM2610B/ym2612) */ if (v&8) /* LFO enabled ? */ { ym2612.OPN.lfo_timer_overflow = lfo_samples_per_step[v&7]; } else { /* hold LFO waveform in reset state */ ym2612.OPN.lfo_timer_overflow = 0; ym2612.OPN.lfo_timer = 0; ym2612.OPN.lfo_cnt = 0; ym2612.OPN.LFO_PM = 0; ym2612.OPN.LFO_AM = 126; } break; case 0x24: /* timer A High 8*/ ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x03)|(((int)v)<<2); ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA; break; case 0x25: /* timer A Low 2*/ ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x3fc)|(v&3); ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA; break; case 0x26: /* timer B */ ym2612.OPN.ST.TB = v; ym2612.OPN.ST.TBL = (256 - v) << 4; break; case 0x27: /* mode, timer control */ set_timers(v); break; case 0x28: /* key on / off */ c = v & 0x03; if( c == 3 ) break; if (v&0x04) c+=3; /* CH 4-6 */ CH = &ym2612.CH[c]; if (v&0x10) FM_KEYON(CH,SLOT1); else FM_KEYOFF(CH,SLOT1); if (v&0x20) FM_KEYON(CH,SLOT2); else FM_KEYOFF(CH,SLOT2); if (v&0x40) FM_KEYON(CH,SLOT3); else FM_KEYOFF(CH,SLOT3); if (v&0x80) FM_KEYON(CH,SLOT4); else FM_KEYOFF(CH,SLOT4); break; } } /* write a OPN register (0x30-0xff) */ INLINE void OPNWriteReg(int r, int v) { FM_CH *CH; FM_SLOT *SLOT; UINT8 c = OPN_CHAN(r); if (c == 3) return; /* 0xX3,0xX7,0xXB,0xXF */ if (r >= 0x100) c+=3; CH = &ym2612.CH[c]; SLOT = &(CH->SLOT[OPN_SLOT(r)]); switch( r & 0xf0 ) { case 0x30: /* DET , MUL */ set_det_mul(CH,SLOT,v); break; case 0x40: /* TL */ set_tl(SLOT,v); break; case 0x50: /* KS, AR */ set_ar_ksr(CH,SLOT,v); break; case 0x60: /* bit7 = AM ENABLE, DR */ set_dr(SLOT,v); SLOT->AMmask = (v&0x80) ? ~0 : 0; break; case 0x70: /* SR */ set_sr(SLOT,v); break; case 0x80: /* SL, RR */ set_sl_rr(SLOT,v); break; case 0x90: /* SSG-EG */ SLOT->ssg = v&0x0f; /* recalculate EG output */ if (SLOT->state > EG_REL) { if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04))) SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl; else SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl; } /* SSG-EG envelope shapes : E AtAlH 1 0 0 0 \\\\ 1 0 0 1 \___ 1 0 1 0 \/\/ ___ 1 0 1 1 \ 1 1 0 0 //// ___ 1 1 0 1 / 1 1 1 0 /\/\ 1 1 1 1 /___ E = SSG-EG enable The shapes are generated using Attack, Decay and Sustain phases. Each single character in the diagrams above represents this whole sequence: - when KEY-ON = 1, normal Attack phase is generated (*without* any difference when compared to normal mode), - later, when envelope level reaches minimum level (max volume), the EG switches to Decay phase (which works with bigger steps when compared to normal mode - see below), - later when envelope level passes the SL level, the EG swithes to Sustain phase (which works with bigger steps when compared to normal mode - see below), - finally when envelope level reaches maximum level (min volume), the EG switches to Attack phase again (depends on actual waveform). Important is that when switch to Attack phase occurs, the phase counter of that operator will be zeroed-out (as in normal KEY-ON) but not always. (I havent found the rule for that - perhaps only when the output level is low) The difference (when compared to normal Envelope Generator mode) is that the resolution in Decay and Sustain phases is 4 times lower; this results in only 256 steps instead of normal 1024. In other words: when SSG-EG is disabled, the step inside of the EG is one, when SSG-EG is enabled, the step is four (in Decay and Sustain phases). Times between the level changes are the same in both modes. Important: Decay 1 Level (so called SL) is compared to actual SSG-EG output, so it is the same in both SSG and no-SSG modes, with this exception: when the SSG-EG is enabled and is generating raising levels (when the EG output is inverted) the SL will be found at wrong level !!! For example, when SL=02: 0 -6 = -6dB in non-inverted EG output 96-6 = -90dB in inverted EG output Which means that EG compares its level to SL as usual, and that the output is simply inverted afterall. The Yamaha's manuals say that AR should be set to 0x1f (max speed). That is not necessary, but then EG will be generating Attack phase. */ break; case 0xa0: switch( OPN_SLOT(r) ){ case 0: /* 0xa0-0xa2 : FNUM1 */ { UINT32 fn = (((UINT32)((ym2612.OPN.ST.fn_h)&7))<<8) + v; UINT8 blk = ym2612.OPN.ST.fn_h>>3; /* keyscale code */ CH->kcode = (blk<<2) | opn_fktable[fn >> 7]; /* phase increment counter */ CH->fc = (fn << 6) >> (7 - blk); /* store fnum in clear form for LFO PM calculations */ CH->block_fnum = (blk<<11) | fn; CH->SLOT[SLOT1].Incr=-1; break; } case 1: /* 0xa4-0xa6 : FNUM2,BLK */ ym2612.OPN.ST.fn_h = v&0x3f; break; case 2: /* 0xa8-0xaa : 3CH FNUM1 */ if(r < 0x100) { UINT32 fn = (((UINT32)(ym2612.OPN.SL3.fn_h&7))<<8) + v; UINT8 blk = ym2612.OPN.SL3.fn_h>>3; /* keyscale code */ ym2612.OPN.SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7]; /* phase increment counter */ ym2612.OPN.SL3.fc[c] = (fn << 6) >> (7 - blk); ym2612.OPN.SL3.block_fnum[c] = (blk<<11) | fn; ym2612.CH[2].SLOT[SLOT1].Incr=-1; } break; case 3: /* 0xac-0xae : 3CH FNUM2,BLK */ if(r < 0x100) ym2612.OPN.SL3.fn_h = v&0x3f; break; } break; case 0xb0: switch( OPN_SLOT(r) ){ case 0: /* 0xb0-0xb2 : FB,ALGO */ { CH->ALGO = v&7; CH->FB = (v>>3)&7; setup_connection( CH, c ); break; } case 1: /* 0xb4-0xb6 : L , R , AMS , PMS */ /* b0-2 PMS */ CH->pms = (v & 7) * 32; /* CH->pms = PM depth * 32 (index in lfo_pm_table) */ /* b4-5 AMS */ CH->ams = lfo_ams_depth_shift[(v>>4) & 0x03]; /* PAN : b7 = L, b6 = R */ ym2612.OPN.pan[ c*2 ] = (v & 0x80) ? bitmask : 0; ym2612.OPN.pan[ c*2+1 ] = (v & 0x40) ? bitmask : 0; break; } break; } } static void reset_channels(FM_CH *CH , int num ) { int c,s; for( c = 0 ; c < num ; c++ ) { CH[c].mem_value = 0; CH[c].op1_out[0] = 0; CH[c].op1_out[1] = 0; for(s = 0 ; s < 4 ; s++ ) { CH[c].SLOT[s].Incr = -1; CH[c].SLOT[s].key = 0; CH[c].SLOT[s].phase = 0; CH[c].SLOT[s].ssgn = 0; CH[c].SLOT[s].state = EG_OFF; CH[c].SLOT[s].volume = MAX_ATT_INDEX; CH[c].SLOT[s].vol_out = MAX_ATT_INDEX; } } } /* initialize generic tables */ static void init_tables(void) { signed int d,i,x; signed int n; double o,m; /* build Linear Power Table */ for (x=0; x>= 4; /* 12 bits here */ if (n&1) /* round to nearest */ n = (n>>1)+1; else n = n>>1; /* 11 bits here (rounded) */ n <<= 2; /* 13 bits here (as in real chip) */ /* 14 bits (with sign bit) */ tl_tab[ x*2 + 0 ] = n; tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ]; /* one entry in the 'Power' table use the following format, xxxxxyyyyyyyys with: */ /* s = sign bit */ /* yyyyyyyy = 8-bits decimal part (0-TL_RES_LEN) */ /* xxxxx = 5-bits integer 'shift' value (0-31) but, since Power table output is 13 bits, */ /* any value above 13 (included) would be discarded. */ for (i=1; i<13; i++) { tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i; tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ]; } } /* build Logarithmic Sinus table */ for (i=0; i0.0) o = 8*log(1.0/m)/log(2); /* convert to 'decibels' */ else o = 8*log(-1.0/m)/log(2); /* convert to 'decibels' */ o = o / (ENV_STEP/4); n = (int)(2.0*o); if (n&1) /* round to nearest */ n = (n>>1)+1; else n = n>>1; /* 13-bits (8.5) value is formatted for above 'Power' table */ sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); } /* build LFO PM modulation table */ for(i = 0; i < 8; i++) /* 8 PM depths */ { UINT8 fnum; for (fnum=0; fnum<128; fnum++) /* 7 bits meaningful of F-NUMBER */ { UINT8 value; UINT8 step; UINT32 offset_depth = i; UINT32 offset_fnum_bit; UINT32 bit_tmp; for (step=0; step<8; step++) { value = 0; for (bit_tmp=0; bit_tmp<7; bit_tmp++) /* 7 bits */ { if (fnum & (1<= 0xb4 ; i-- ) { OPNWriteReg(i ,0xc0); OPNWriteReg(i|0x100,0xc0); } for(i = 0xb2 ; i >= 0x30 ; i-- ) { OPNWriteReg(i ,0); OPNWriteReg(i|0x100,0); } } /* ym2612 write */ /* n = number */ /* a = address */ /* v = value */ void YM2612Write(unsigned int a, unsigned int v) { v &= 0xff; /* adjust to 8 bit bus */ switch( a ) { case 0: /* address port 0 */ ym2612.OPN.ST.address = v; break; case 2: /* address port 1 */ ym2612.OPN.ST.address = v | 0x100; break; default: /* data port */ { int addr = ym2612.OPN.ST.address; /* verified by Nemesis on real YM2612 */ switch( addr & 0x1f0 ) { case 0x20: /* 0x20-0x2f Mode */ switch( addr ) { case 0x2a: /* DAC data (ym2612) */ ym2612.dacout = ((int)v - 0x80) << 6; /* convert to 14-bit output */ break; case 0x2b: /* DAC Sel (ym2612) */ /* b7 = dac enable */ ym2612.dacen = v & 0x80; break; default: /* OPN section */ /* write register */ OPNWriteMode(addr,v); } break; default: /* 0x30-0xff OPN section */ /* write register */ OPNWriteReg(addr,v); } break; } } } unsigned int YM2612Read(void) { return ym2612.OPN.ST.status & 0xff; } /* Generate samples for ym2612 */ void YM2612Update(int *buffer, int length) { int i; int lt,rt; /* refresh PG increments and EG rates if required */ refresh_fc_eg_chan(&ym2612.CH[0]); refresh_fc_eg_chan(&ym2612.CH[1]); if (!(ym2612.OPN.ST.mode & 0xC0)) { refresh_fc_eg_chan(&ym2612.CH[2]); } else { /* 3SLOT MODE (operator order is 0,1,3,2) */ if(ym2612.CH[2].SLOT[SLOT1].Incr==-1) { refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT1] , ym2612.OPN.SL3.fc[1] , ym2612.OPN.SL3.kcode[1] ); refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT2] , ym2612.OPN.SL3.fc[2] , ym2612.OPN.SL3.kcode[2] ); refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT3] , ym2612.OPN.SL3.fc[0] , ym2612.OPN.SL3.kcode[0] ); refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT4] , ym2612.CH[2].fc , ym2612.CH[2].kcode ); } } refresh_fc_eg_chan(&ym2612.CH[3]); refresh_fc_eg_chan(&ym2612.CH[4]); refresh_fc_eg_chan(&ym2612.CH[5]); /* buffering */ for(i=0; i < length ; i++) { /* clear outputs */ out_fm[0] = 0; out_fm[1] = 0; out_fm[2] = 0; out_fm[3] = 0; out_fm[4] = 0; out_fm[5] = 0; /* update SSG-EG output */ update_ssg_eg_channels(&ym2612.CH[0]); /* calculate FM */ if (!ym2612.dacen) { chan_calc(&ym2612.CH[0],6); } else { /* DAC Mode */ out_fm[5] = ym2612.dacout; chan_calc(&ym2612.CH[0],5); } /* advance LFO */ advance_lfo(); /* advance envelope generator */ ym2612.OPN.eg_timer ++; /* EG is updated every 3 samples */ if (ym2612.OPN.eg_timer >= 3) { ym2612.OPN.eg_timer = 0; ym2612.OPN.eg_cnt++; advance_eg_channels(&ym2612.CH[0], ym2612.OPN.eg_cnt); } /* 14-bit accumulator channels outputs (range is -8192;+8192) */ if (out_fm[0] > 8192) out_fm[0] = 8192; else if (out_fm[0] < -8192) out_fm[0] = -8192; if (out_fm[1] > 8192) out_fm[1] = 8192; else if (out_fm[1] < -8192) out_fm[1] = -8192; if (out_fm[2] > 8192) out_fm[2] = 8192; else if (out_fm[2] < -8192) out_fm[2] = -8192; if (out_fm[3] > 8192) out_fm[3] = 8192; else if (out_fm[3] < -8192) out_fm[3] = -8192; if (out_fm[4] > 8192) out_fm[4] = 8192; else if (out_fm[4] < -8192) out_fm[4] = -8192; if (out_fm[5] > 8192) out_fm[5] = 8192; else if (out_fm[5] < -8192) out_fm[5] = -8192; /* stereo DAC channels outputs mixing */ lt = ((out_fm[0]) & ym2612.OPN.pan[0]); rt = ((out_fm[0]) & ym2612.OPN.pan[1]); lt += ((out_fm[1]) & ym2612.OPN.pan[2]); rt += ((out_fm[1]) & ym2612.OPN.pan[3]); lt += ((out_fm[2]) & ym2612.OPN.pan[4]); rt += ((out_fm[2]) & ym2612.OPN.pan[5]); lt += ((out_fm[3]) & ym2612.OPN.pan[6]); rt += ((out_fm[3]) & ym2612.OPN.pan[7]); lt += ((out_fm[4]) & ym2612.OPN.pan[8]); rt += ((out_fm[4]) & ym2612.OPN.pan[9]); lt += ((out_fm[5]) & ym2612.OPN.pan[10]); rt += ((out_fm[5]) & ym2612.OPN.pan[11]); /* buffering */ *buffer++ = lt; *buffer++ = rt; /* CSM mode: if CSM Key ON has occured, CSM Key OFF need to be sent */ /* only if Timer A does not overflow again (i.e CSM Key ON not set again) */ ym2612.OPN.SL3.key_csm <<= 1; /* timer A control */ INTERNAL_TIMER_A(); /* CSM Mode Key ON still disabled */ if (ym2612.OPN.SL3.key_csm & 2) { /* CSM Mode Key OFF (verified by Nemesis on real hardware) */ FM_KEYOFF_CSM(&ym2612.CH[2],SLOT1); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT2); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT3); FM_KEYOFF_CSM(&ym2612.CH[2],SLOT4); ym2612.OPN.SL3.key_csm = 0; } } /* timer B control */ INTERNAL_TIMER_B(length); } void YM2612Config(unsigned char dac_bits) { int i; /* DAC precision (normally 9-bit on real hardware, implemented through simple 14-bit channel output bitmasking) */ bitmask = ~((1 << (TL_BITS - dac_bits)) - 1); /* update L/R panning bitmasks */ for (i=0; i<2*6; i++) { if (ym2612.OPN.pan[i]) { ym2612.OPN.pan[i] = bitmask; } } } int YM2612LoadContext(unsigned char *state) { int c,s; uint8 index; int bufferptr = 0; /* restore YM2612 context */ load_param(&ym2612, sizeof(ym2612)); /* restore DT table address pointer for each channel slots */ for (c=0; c<6; c++) { for (s=0; s<4; s++) { load_param(&index,sizeof(index)); bufferptr += sizeof(index); ym2612.CH[c].SLOT[s].DT = ym2612.OPN.ST.dt_tab[index&7]; } } /* restore outputs connections */ setup_connection(&ym2612.CH[0],0); setup_connection(&ym2612.CH[1],1); setup_connection(&ym2612.CH[2],2); setup_connection(&ym2612.CH[3],3); setup_connection(&ym2612.CH[4],4); setup_connection(&ym2612.CH[5],5); return bufferptr; } int YM2612SaveContext(unsigned char *state) { int c,s; uint8 index; int bufferptr = 0; /* save YM2612 context */ save_param(&ym2612, sizeof(ym2612)); /* save DT table index for each channel slots */ for (c=0; c<6; c++) { for (s=0; s<4; s++) { index = (ym2612.CH[c].SLOT[s].DT - ym2612.OPN.ST.dt_tab[0]) >> 5; save_param(&index,sizeof(index)); bufferptr += sizeof(index); } } return bufferptr; } gx/images/Main_logo.png000664 001750 001750 00000053441 12702465756 016224 0ustar00sergiosergio000000 000000 PNG  IHDR8WsBIT|d pHYs B4tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$ IDATx̽wՙ=O^`fM&E!E-1fL6edd7f&dMd5QPAD 40<3yg"€>O9׹ʹ֚ASS*ojRTB)BRD"𥔭|Ͼ/ɜ_04;A!>TJ}%@Jke^dxo>7@F"ud>_#F4id29YqrZ&ya:ox8vnttt<:rbmJk}y.f9!ϴRt'D"w]H$rFuW Gt:QJ!0I()%H$8;===&Mp{eTBZkҶ % yC[oÇۉDbNT*Z )'D"+h ? !q&ݾ}=nܸ=K,QAP63)PB ")˶l68w+..=bٗT (1Td r5h$m%;;{\5Md2=}ȟJ)afH@ qv575BuHtzTkkW NJB\-nUt(~e/kkk }Rm+LSE#!3,)-wO|xϮVEUuY;V7 !d2)+JhѷA}` R`YNDl6^RR/EEEVA=dԎonnuc_ضuR0 BViG)ļy󨪪Y\\|wYY-- i8W +VxN:;4{8Xtc(a̙С ݮlRJNs_H)6Fܸv&OSJt:Lm}}Y7JaEkCaX'(`GJw pBkXW2l/\y#؜tOwW׈W<0BA9q ]Ř1ci.uch=e}U+ֆ7t0@@1tĊŬgsW(4/Bپ 1 $.i4J)aRQ3\\9j.65gx---fIQQuw:sbbұG*׼ !Ѫ D~FZ+ rX21v8*]VVvj{8`H{QWWrrWV/٧-d"5 ?AD&y/ ={!uU/6MnZdbpPJ纞Mx|^[kKg੿<̋/J'UEuBJM%XK&}}/n(ondJaTFԵM~>Ǻ/{7\H3,kFssӯR#Č&|\& Or,,?ֵX8|OVttOyiөxcSs=TMŊP^yjMl\O3:_RZZE)Eek^zx뷐1TMar~4Y lXzWBO&Nم‹o"R1Cl !4C}MO?D{gֶ6Ɛ #WH]B rZG2x)(++'M/}v٣X2=b¬%$F穠"q#ZΡC{w#{p4C}C#V>Tb;1Zvͯڢ  TeZĦh)fFi$|?>OyH NILgYPX+hooAu ziw-Ν[y婧hs77rUbŔG+p^ !#Qȶx [1-K.͌3q'H$s{Yvx/4ND&.$Ӯ2υw>ZB i8߸4Xx1S`GOgŷ0r | L&Ll{{O~ɻ/~/Z7Q{i9{]͙@k39bሾSi@ ,n=we "čM;!>a kư<8W'|mAwoSL6q'wcgZr/ʸً)@P8SW88Ő}EкҒb:&\pmmH Lӆ`Y#hΟC)4'qپy}=DaqwQYD p]pAG3t^wme򅓘8qpu3J]_hl̾wz}US|󝌿 (B:LL :rk7mO7F]u >}7o#FōFV>8lۈLd{xm :  Ez *<'nںl]_ +T?g?yjt! YQH@pEi0%\r:j*uc'cKC! ^zZkl[OK-nҧX|󝌝p-HP0UTikY> b߲@~Y`ȨDL\ 7~\hJ}f?䎽B7z#KngQRRҕָ͢3?)Fɴe?IKy i+ycӽQ\4o%K`9~^2vR Z[Zp͕߯};?yFhL ^.\Ȑu<g.+XƦlztl}nXx)oU]r<9nXmYS\~Wbз@A4TWVpg։x?[6ɗ-y ƴ Tx>3ŽFDZ\g?PO+, vA!*45  Btvu?&?{#'^Z}oc˞y=}1~6 ~2(CyZPJQȫ!QЮlYߠ,7ߵn4uZz޴ݶO8'@ Ztw%c?ĺ77S1.^qA"!uXT@{s|>kbJFĠX3&/R`WKocڬ˽A5JJK^)D"[Sk ydq,~ǔGK)"v?zp'm-d/N3œ?ha@O$^̒[ocƬKziBԏIy$ Vbk15k?CS1&ON<J;ͦ'mln/ l Nqa,YU.^׏Ԉ4^ZNDn} V.BaCl`ߡ+E>giRq+Ò;6}jʼnī4 bƀgFKҠ= 'q~̈Qt4@wo> Zh (ӜwN=mX|G1kAu˔#|tш^|`[6nġzs-0dh\_>SK++u~$j.ld3q"4M2N4fCθJkeb\}Ig䳙]Q3! P(`״>;^Q!uuQ ֌{~ʖQseϤY83 /}$JI"P9P{x^bִ בq΀UDL6a \0 CIk8F2٥"Z6j H'>&hٳaC+w8Y#ZBT]3EWSZ^I:\жcLMvaZՁQB D%8HuXCH\۞*)+LF)()ʼpay)G 'ښ B555!e,ٴB+yy2QH^{50&Pa2@$b1ʫ(NaXCw|!eZ9? !h<)ű,U!a~{shR W\;7T挦))-vh-XT 4;vlI:^7v.uQClj࢛>(\{'Cc/> 8:Hi)sǭ $kr9e}Lh-MM:B^F"QRVN*#&J׉`HM2d`>F:E ׿Isc#bZz $Dצe9- ً3 ˵\y3_(W! S͡#Iw⌉WRrYr= D\\xxMQw 3T}z|!]g1 CB+rL&l a*̼<1KHDcLrfc:DHl'"|23oeR@)L!E)Bh4Ψ 1s⒒m{ :F>݋b%t&Iյ47i<Ukh;X5!BJ+"|t~^]O}¶mLpV{qq;g9n_ 4<̮❝ʗ7nm]]]ML7"ɱ9ysC1UmvNs8/mDzleo!:N}bv% D!uu RСCL3LbxKr\y6_zS$5:B# 4V O~sfLڛ< OعAoM,VLgzwz`U2hCG@e"0\zwY̚5kRN|>,. ---wXΦjw|Gygi)|ӧ/.O&L0b 6?Gm#;n$} 8ʜOAQi-3\| }!ʼnbqyгܱt: SJŤ$ Wvdeď}|wO6.tL#hCqQ |gd3=Aw!B_8 x}{v1c -9O03Ga߳ggɿ<3O>#]X&33e#{PC[{h9*XkGR33 z"P.$=q]^x5!b,!$͒LQc? 'Ms347=e@%QTͅBR]9A5Cq9@ߗPbZ[l|yvƱm.fz y|Cqa I0r~@A8Sݷh$%5׵:=>AP7w΄W\.ZCo:{;4 4h$2Y<e7-{ΛGeeeFyJ9'4E*L>!C_axxj.ߙ:bbyIw[oN{FGS/6 QFlY۞ f'>ERW_;;!eY#N?{V@RCPȣe=?B -iXHz<7 5}ZIۊۖ;Gd_cOnrŒOPT%? r`Gw ~ҁd*U/{x"[n9Bh>[( +ZB`0U8dy yKHέ PP^\F w\?P@xx6P>̦#ꭴBԯ~_D\w˖-[>5.r EG !{M 'ː޿̕3O}/ %Ϫl]^^Ψxm B Z>8{Wa7 $Q91og9ȫţ?(I$JZ7"6|/a8<4`i'R0L11#Ly#6Bԧu a8(CA"(Ҙ㸴6i;h+C{=}R"(䲝~L8Ca\UHfprd1{ͦTa6H5-F!8N`fM6WЁh)pNvum7 dz/ꪯÿ:>y;-6D\7<|it9m~Ǚ6eץmYa9[RgP+a w}I蓂M0<.lXnXBHP l&`5y'D$Es"R746vzPJb.o,a|@4QBR#?J'j T=a4XR && /a~;HD jx/WJbqZCC/n['L_7 e;`"2TAdϋl }y ELvl.d4fz|{+<^~V 콗}p`;.ɮ$>auΩ'Mش ^*Uu@!9`Jj3-H!qz?-@g|Rc1xe/SV;M ߧJr()c˱}[ٕDhzN|М)}Dw?!^aFpt\3TXesJW>3C (EL%T_v}!'pEOe`ghp6Lt2݂y}&{ihs~_xӁCJ܈yIkΚ&$JACk˞`_Emig;. d| ,P(q<ĖR5}~”8Sjek*6S D]X"VB@' ~z8}V"ƄgCfŜH)0pJl<k> 67g7y߲l= S㌼vK`@fױI:-Hh>kOg̈:MNP;@Zl:hn_7lx}>zg;♿<ȳO>[{ 6ы>>IyPvϴHSb&Ik52]AG!hhÐ8vjBz0i "&Z;??3 U Wf?_)#3f' R-V}H,7L9} T!V4ZVIg_v/=y?^!̈xI @\Y+tQApqԁxJ]tz/߂>sPJ+q+qJcK@4e7֧D k㱇~_l.~t,#} .#|?,SȁU˂x(45kOΊߐkx㎏477]8]N3_kJX4Vov׮Ϛ? ʐ9_b0 p1m8C@$)Rl~q9_o?F}M/LXK_AK 2ȜxKMx)* {r}m/=BӖ)6\`67-(KncGe?ċl3Dt= Qt?3lm[}⪅ㆥs5 KYa8e‰p\NSF /EѾQ@kO*@Í۸.9Z tbabE\1r}B+ljgm;3|($wqEYяSY5^3O͊Ӟ/ҿ₹bID~:al'ѲD fٴ]/#b[1b\mF)b֊t*eI MHG"V/emfˊhG,?ܙc檫%x=~#N۾U UՃr[;;cl -{.|2@ezLt NNC!h dBh|iҀ8|XɞÈA rKXF~ӟѷr'EqbA7|}Ri[V>eX`69fξDU | P잛,Z{X`fNAYՕd2IEP=?9@0|>3.9h/%u,#5aBl[7*0o΅,.b<4A<Fw]WZk{^egtY-\r&b&r9s5k9q1-\Ṓ5|mo1܉{W{=b^!w .*]=.Fпnk˼'>oi~>,7J7ND p6:=Emmٜ'x 9L!ugH 'AG]o{F=sq-ytQDhXgٗ"ȡ:F-?}F''?40BbfL Kk3b؂FvC.**2 cRyys4=K 9۽4 Q241q`,[rE%u?Ҳ0'ڗ\tɕbm4#} 0LDx_N$Őt/9jUAaEs83 wuJNt3ap.r!ZzW Rgxl »z ?MM w̍ԋ.NkF8z#4h-I4`TU-uzp}"M5d3r^}Ay?Ҵ6OOz>KZ̻f1FEue<\uuͻHGCfKۏPi@+Mx \W/f⤩#^>ؑC2ٵsQd2}w~c/x!YhRHiSY3+/`D}-bŊ$ۛ,'כJ(? ak2ytU\\v6^v'_8}߬&1!]-I1z;3 2lxvX455 ߱,V!DT!tQr{#+BV~eY$bц _hoo_~qĈ'\.u4.C!ÎKT/Z0 ӧ c8΍|Z D+f)r)"au=)^xr޽O^~T*U)JhaZZ З" i(Ƕj<Ԅ ^~6O+NFM(!͎@  V_ݝdq]޲ް$#h0LKcѣJVt%:v5g)y{Y][[%C iiJf!e@8#P01cE~!Q. [gI&ڶ=#<" 4]$3i6AL&sM$(IRAggd",iw7N1ZW!@iÐO '>~y*#m[ljO}Mlf]QQ4fKRsc :@By8*RF6ݞfE H!DAC)ZW{9O! iÐoˁqU,T~߷XK@ T*uX}4]kC're] ً/nюBJii鑊|~v>w B 87W+0 C|OUBSixIIqf#RC#0 ߲yE ,24E %ʕ+1c|u%RrTDJR:B:~ֺٲUTT ootӦMN]]W,tPojj[ZZ( gLJ>(PJa6QRRTJd2BwqjAII eeeض}ۇ ,CU%;'JX,Fee%DD~R\\O|:RJm4dy~9AQQi[ëvuݗsٹ@(!" |T.TS AQhڣP~hkT1Mh B}g_}Z&r~s$3D"7(]ߎx puaaa{mmm3yӖ+VG"aYVh]g^ܽ2_}˱}v,k8i477C 0YYY? %Ȳ>}9^c$Ihhh@II r7O>ۤI*)*9|0}]D"X,s ٹ/I`7o(vJ90W4GZ[[ڊ}w ÌpAbY`ҁK/lnX,& @UU466׻wo yȲ3g`PO?t---?cYvӧ7oA$],LØ2e )((j DzlѨeժUXn, f̘믿sܕ>ᰕ1Yvڅ={ 7EQLIJI+16 ~É'p8_o߾>}:  "As4kbժU'O_ul۶ ^=*++@Qv;v܉Z >O?4^H$>Z W4?9AYNEr!R)whnnF<7jcX8x v;&M׋}"a?Sl߾x'1rHRCvϹX,(H$f,aX< =X֋6nKM7݄\Hdmmm5ֆs8Μ9cnR]," A43qAz2L" bÌŌvzG޽{q54 PWWaڴi,{7Eq|q|>ttt8HFovS.(hnnF>}`̘1X`֯_'O(**B$AGGv;A_%%%[LH$,A3gg'رc!1Ͷv_xלtN:ƏcBUU(8x 8:h,̊ TVV"''dt'N@MM ƌp Lr!??ntA(()S0zh$IShllD:6)ʌ3ҕ;Ÿq0a$ b18}:!,?zw\14M#JfoD 2ЧOjbر(..6])C4TTT` :vXlٲ555Ĉ#J 2#9|QtV|sAg 0L0$Q0agE$hq֭[mEEA$X,5 7pZZZ*A8o ł[oƩS,v;~_W^hoob$A B`٠in݊}a6lUPP0Tvw9qbĉpHӠihnnƺu0i$dff1}t߮4vt@4B>C;v 7oܹsBul۶ ѣ1tPC35Sbܸq6PTTdL ߏ/YYY7of͚%KT Wii5}vǏ'MeYF:([ruסSN$I=,q$IPU4MCUU^Q6$IHӦe$EQfn/",>BoYu C333 qie(BE,kFj%SAa"4MO8fVTU(7ax3rxƿ$p}}3 (f8,\.ƏYfᣏ>2kXn w(2-2!`vXd ƌT*ct+Ih6aÆᩧš5k0f'D<Dzeˠ:x b1=vttft"!Hy, pQpB̟?4gJKK~_A|F&qJkk+( Y` FLJ4^/W]=D4߈hRp8NY\4 eYݸO<$I-I"("h"P4em,r!17β,$I2SP;w4ţx<q"l̑A~=F_WXx1pysa Iވ$IF#G`ZA4bF{[(\.7ӦMÛoZ 6 ##(t%I0idX ÀeY عs'xM7A0`%~45}0^"w$"V+̝|t?t:|r|i(4M_~‹/*!\u&njhh@qq1,9vc4rJJQ:HdŋC(2sw2|>s=ؽ{7 %bt B: ̸p8(//ǡCfX4EzO%$:ЩWWWnʷ1vG5Q.WU I #=mdx~Ǐi 6 `[l1VUU2<Ip8`;`ʕ9r$VXۍs4Mn7= ˅R)pD"B;w9s& stI"!f EQF:6S5?Oq\BE C{%[,رcx#///f̘z0ꫯ0|աUUUذa.]jYFH @^^x 0 ?Xh^|E 6l(fff.%$c (O rTUU!d|bƍhjjӟUUq= ;;ܝKY>n])9r*>C3gi&_͸X(زe ^uH",ZgF:6#SZسgϟӧOѣsW^A~0}tX6EQrh"q^˖-~^{5'$I j8k׮EMM l6$I2ոo߾ V4}Hu t |a6팢('eY;ꫯⷿ-zm D.HСCifBSS6l؀{v_֮y> eYSLAVVmۆe˖ VL%\ CUU,\wy'iVQQneyKaa `ɒ%XbYu1rii466<ܹsطohF[[KfC8{gf3Ȳl^(`ZeY k./2=z6l qF[n:~8y7T*egG}̞=[(5J,;ڶtRzB^^|/(**]wEL9*af矻ĐP\sqG(zDnGGQU(++9;&I2AjdY~FU{z{Bp8P\\B@=˲+,,| לJcؿz'M M8E"9{fyi%hhh=]ey<<^1iUӴ4EQ ШDUUPev ~!:08۝Jai]5Wx A,*ׯe/X,V(YBe._.VBZ)R]^%mmm4D!D%Q'tK=hvϻZ,(o sIENDB`core/sound/eq.c000664 001750 001750 00000006311 12702465756 014552 0ustar00sergiosergio000000 000000 /*---------------------------------------------------------------------------- // // 3 Band EQ :) // // EQ.C - Main Source file for 3 band EQ // // (c) Neil C / Etanza Systems / 2K6 // // Shouts / Loves / Moans = etanza at lycos dot co dot uk // // This work is hereby placed in the public domain for all purposes, including // use in commercial applications. // // The author assumes NO RESPONSIBILITY for any problems caused by the use of // this software. // //----------------------------------------------------------------------------*/ /* NOTES : // // - Original filter code by Paul Kellet (musicdsp.pdf) // // - Uses 4 first order filters in series, should give 24dB per octave // // - Now with P4 Denormal fix :) //----------------------------------------------------------------------------*/ /* ---------- //| Includes | // ----------*/ #include #include #include #include "eq.h" #include "macros.h" /* ----------- //| Constants | // -----------*/ static double vsa = (1.0 / 4294967295.0); /* Very small amount (Denormal Fix) */ /* --------------- //| Initialise EQ | // ---------------*/ /* Recommended frequencies are ... // // lowfreq = 880 Hz // highfreq = 5000 Hz // // Set mixfreq to whatever rate your system is using (eg 48Khz)*/ void init_3band_state(EQSTATE * es, int lowfreq, int highfreq, int mixfreq) { /* Clear state */ memset(es, 0, sizeof(EQSTATE)); /* Set Low/Mid/High gains to unity */ es->lg = 1.0; es->mg = 1.0; es->hg = 1.0; /* Calculate filter cutoff frequencies */ es->lf = 2 * sin(M_PI * ((double) lowfreq / (double) mixfreq)); es->hf = 2 * sin(M_PI * ((double) highfreq / (double) mixfreq)); } /* --------------- //| EQ one sample | // ---------------*/ /* - sample can be any range you like :) // // Note that the output will depend on the gain settings for each band // (especially the bass) so may require clipping before output, but you // knew that anyway :)*/ double do_3band(EQSTATE * es, int sample) { /* Locals */ double l, m, h; /* Low / Mid / High - Sample Values */ /* Filter #1 (lowpass) */ es->f1p0 += (es->lf * ((double) sample - es->f1p0)) + vsa; es->f1p1 += (es->lf * (es->f1p0 - es->f1p1)); es->f1p2 += (es->lf * (es->f1p1 - es->f1p2)); es->f1p3 += (es->lf * (es->f1p2 - es->f1p3)); l = es->f1p3; /* Filter #2 (highpass) */ es->f2p0 += (es->hf * ((double) sample - es->f2p0)) + vsa; es->f2p1 += (es->hf * (es->f2p0 - es->f2p1)); es->f2p2 += (es->hf * (es->f2p1 - es->f2p2)); es->f2p3 += (es->hf * (es->f2p2 - es->f2p3)); h = es->sdm3 - es->f2p3; /* Calculate midrange (signal - (low + high)) */ /* m = es->sdm3 - (h + l); */ /* fix from http://www.musicdsp.org/showArchiveComment.php?ArchiveID=236 ? */ m = sample - (h + l); /* Scale, Combine and store */ l *= es->lg; m *= es->mg; h *= es->hg; /* Shuffle history buffer */ es->sdm3 = es->sdm2; es->sdm2 = es->sdm1; es->sdm1 = sample; /* Return result */ return (int) (l + m + h); } gx/images/Star_empty.png000664 001750 001750 00000001454 12702465756 016444 0ustar00sergiosergio000000 000000 PNG  IHDR sBIT|d pHYs  ~tEXtCreation Time02/19/09( tEXtSoftwareMacromedia Fireworks MX*$IDATx?Hq_ILHqDc;A:P]K r:Q(טg^~%\ ň{GEa###|[a[L`_.+ `ooo͟#c QT4MQiKF޶r(a||bQKKK:сCb/z{{.hY֬ F4H$rik~VbHp,ˇccc " Nyp&|-4ܜH$WlvkppD o^fcoUU&''qpp}p4L777O>fr.3]E4@큮I/_EGIENDB`psp2/fileio.c000664 001750 001750 00000010622 12702465756 014220 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive into ROM buffer. * Returns loaded ROM size (zero if an error occured) * * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * modified by Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include static int check_zip(char *filename); int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size = 0; if(check_zip(filename)) { unz_file_info info; int ret = 0; char fname[256]; /* Attempt to open the archive */ unzFile *fd = unzOpen(filename); if (!fd) return 0; /* Go to first file in archive */ ret = unzGoToFirstFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Get file informations and update filename */ ret = unzGetCurrentFileInfo(fd, &info, fname, 256, NULL, 0, NULL, 0); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Compressed filename extension */ if (extension) { strncpy(extension, &fname[strlen(fname) - 3], 3); extension[3] = 0; } /* Open the file for reading */ ret = unzOpenCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Retrieve uncompressed file size */ size = info.uncompressed_size; if(size > maxsize) { size = maxsize; } /* Read (decompress) the file */ ret = unzReadCurrentFile(fd, buffer, size); if(ret != size) { unzCloseCurrentFile(fd); unzClose(fd); return 0; } /* Close the current file */ ret = unzCloseCurrentFile(fd); if(ret != UNZ_OK) { unzClose(fd); return 0; } /* Close the archive */ ret = unzClose(fd); if(ret != UNZ_OK) return 0; } /*else { gzFile *gd = gzopen(filename, "rb"); if (!gd) return 0; size = gzread(gd, buffer, maxsize); if (extension) { strncpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } gzclose(gd); }*/ /* Return loaded ROM size */ return size; } /* Verifies if a file is a ZIP archive or not. Returns: 1= ZIP archive, 0= not a ZIP archive */ static int check_zip(char *filename) { uint8 buf[2]; FILE *fd = fopen(filename, "rb"); if(!fd) return (0); fread(buf, 2, 1, fd); fclose(fd); if(memcmp(buf, "PK", 2) == 0) return (1); return (0); } gcw0/unzip.h000664 001750 001750 00000023445 12702465756 014106 0ustar00sergiosergio000000 000000 /* unzip.h -- IO for uncompress .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Copyright (C) 1998 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE CAN CHANGE IN FUTURE VERSION !! I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer "zlib/zlib111.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ #ifdef __cplusplus } #endif #endif /* _unz_H */ core/tremor/os_types.h000664 001750 001750 00000003205 12702465756 016176 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. ********************************************************************/ #ifndef _OS_TYPES_H #define _OS_TYPES_H #ifdef _LOW_ACCURACY_ # define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) # define LOOKUP_T const unsigned char #else # define X(n) (n) # define LOOKUP_T const ogg_int32_t #endif /* make it easy on the folks that want to compile the libs with a different malloc than stdlib */ #define _ogg_malloc malloc #define _ogg_calloc calloc #define _ogg_realloc realloc #define _ogg_free free #if defined(_WIN32) && defined(__LIBRETRO__) #include #else #include #endif typedef int64_t ogg_int64_t; typedef int32_t ogg_int32_t; typedef uint32_t ogg_uint32_t; typedef int16_t ogg_int16_t; #endif /* _OS_TYPES_H */ core/tremor/info.c000664 001750 001750 00000025665 12702465756 015275 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: maintain the info structure, info <-> header packets ********************************************************************/ /* general handling of the header and the vorbis_info structure (and substructures) */ #include #include #include #include "ogg.h" #include "ivorbiscodec.h" #include "codec_internal.h" #include "codebook.h" #include "registry.h" #include "window.h" #include "misc.h" /* helpers */ static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ while(bytes--){ *buf++=oggpack_read(o,8); } } void vorbis_comment_init(vorbis_comment *vc){ memset(vc,0,sizeof(*vc)); } /* This is more or less the same as strncasecmp - but that doesn't exist * everywhere, and this is a fairly trivial function, so we include it */ static int tagcompare(const char *s1, const char *s2, int n){ int c=0; while(c < n){ if(toupper((int)s1[c]) != toupper((int)s2[c])) return !0; c++; } return 0; } char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count){ long i; int found = 0; int taglen = strlen(tag)+1; /* +1 for the = we append */ char *fulltag = (char *)alloca(taglen+ 1); strcpy(fulltag, tag); strcat(fulltag, "="); for(i=0;icomments;i++){ if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ if(count == found) /* We return a pointer to the data, not a copy */ return vc->user_comments[i] + taglen; else found++; } } return NULL; /* didn't find anything */ } int vorbis_comment_query_count(vorbis_comment *vc, char *tag){ int i,count=0; int taglen = strlen(tag)+1; /* +1 for the = we append */ char *fulltag = (char *)alloca(taglen+1); strcpy(fulltag,tag); strcat(fulltag, "="); for(i=0;icomments;i++){ if(!tagcompare(vc->user_comments[i], fulltag, taglen)) count++; } return count; } void vorbis_comment_clear(vorbis_comment *vc){ if(vc){ long i; for(i=0;icomments;i++) if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); if(vc->user_comments)_ogg_free(vc->user_comments); if(vc->comment_lengths)_ogg_free(vc->comment_lengths); if(vc->vendor)_ogg_free(vc->vendor); memset(vc,0,sizeof(*vc)); } } /* blocksize 0 is guaranteed to be short, 1 is guarantted to be long. They may be equal, but short will never ge greater than long */ int vorbis_info_blocksize(vorbis_info *vi,int zo){ codec_setup_info *ci = (codec_setup_info *)vi->codec_setup; return ci ? ci->blocksizes[zo] : -1; } /* used by synthesis, which has a full, alloced vi */ void vorbis_info_init(vorbis_info *vi){ memset(vi,0,sizeof(*vi)); vi->codec_setup=(codec_setup_info *)_ogg_calloc(1,sizeof(codec_setup_info)); } void vorbis_info_clear(vorbis_info *vi){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; int i; if(ci){ for(i=0;imodes;i++) if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); for(i=0;imaps;i++) /* unpack does the range checking */ if(ci->map_param[i]) _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); for(i=0;ifloors;i++) /* unpack does the range checking */ if(ci->floor_param[i]) _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); for(i=0;iresidues;i++) /* unpack does the range checking */ if(ci->residue_param[i]) _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); for(i=0;ibooks;i++){ if(ci->book_param[i]){ /* knows if the book was not alloced */ vorbis_staticbook_destroy(ci->book_param[i]); } if(ci->fullbooks) vorbis_book_clear(ci->fullbooks+i); } if(ci->fullbooks) _ogg_free(ci->fullbooks); _ogg_free(ci); } memset(vi,0,sizeof(*vi)); } /* Header packing/unpacking ********************************************/ static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; if(!ci)return(OV_EFAULT); vi->version=oggpack_read(opb,32); if(vi->version!=0)return(OV_EVERSION); vi->channels=oggpack_read(opb,8); vi->rate=oggpack_read(opb,32); vi->bitrate_upper=oggpack_read(opb,32); vi->bitrate_nominal=oggpack_read(opb,32); vi->bitrate_lower=oggpack_read(opb,32); ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; if(vi->channels<1)goto err_out; if(ci->blocksizes[0]<64)goto err_out; if(ci->blocksizes[1]blocksizes[0])goto err_out; if(ci->blocksizes[1]>8192)goto err_out; if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ return(0); err_out: vorbis_info_clear(vi); return(OV_EBADHEADER); } static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ int i; int vendorlen=oggpack_read(opb,32); if(vendorlen<0)goto err_out; vc->vendor=(char *)_ogg_calloc(vendorlen+1,1); _v_readstring(opb,vc->vendor,vendorlen); vc->comments=oggpack_read(opb,32); if(vc->comments<0)goto err_out; vc->user_comments=(char **)_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments)); vc->comment_lengths=(int *)_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths)); for(i=0;icomments;i++){ int len=oggpack_read(opb,32); if(len<0)goto err_out; vc->comment_lengths[i]=len; vc->user_comments[i]=(char *)_ogg_calloc(len+1,1); _v_readstring(opb,vc->user_comments[i],len); } if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ return(0); err_out: vorbis_comment_clear(vc); return(OV_EBADHEADER); } /* all of the real encoding details are here. The modes, books, everything */ static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; int i; if(!ci)return(OV_EFAULT); /* codebooks */ ci->books=oggpack_read(opb,8)+1; /*ci->book_param=_ogg_calloc(ci->books,sizeof(*ci->book_param));*/ for(i=0;ibooks;i++){ ci->book_param[i]=(static_codebook *)_ogg_calloc(1,sizeof(*ci->book_param[i])); if(vorbis_staticbook_unpack(opb,ci->book_param[i]))goto err_out; } /* time backend settings */ ci->times=oggpack_read(opb,6)+1; /*ci->time_type=_ogg_malloc(ci->times*sizeof(*ci->time_type));*/ /*ci->time_param=_ogg_calloc(ci->times,sizeof(void *));*/ for(i=0;itimes;i++){ ci->time_type[i]=oggpack_read(opb,16); if(ci->time_type[i]<0 || ci->time_type[i]>=VI_TIMEB)goto err_out; /* ci->time_param[i]=_time_P[ci->time_type[i]]->unpack(vi,opb); Vorbis I has no time backend */ /*if(!ci->time_param[i])goto err_out;*/ } /* floor backend settings */ ci->floors=oggpack_read(opb,6)+1; /*ci->floor_type=_ogg_malloc(ci->floors*sizeof(*ci->floor_type));*/ /*ci->floor_param=_ogg_calloc(ci->floors,sizeof(void *));*/ for(i=0;ifloors;i++){ ci->floor_type[i]=oggpack_read(opb,16); if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); if(!ci->floor_param[i])goto err_out; } /* residue backend settings */ ci->residues=oggpack_read(opb,6)+1; /*ci->residue_type=_ogg_malloc(ci->residues*sizeof(*ci->residue_type));*/ /*ci->residue_param=_ogg_calloc(ci->residues,sizeof(void *));*/ for(i=0;iresidues;i++){ ci->residue_type[i]=oggpack_read(opb,16); if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); if(!ci->residue_param[i])goto err_out; } /* map backend settings */ ci->maps=oggpack_read(opb,6)+1; /*ci->map_type=_ogg_malloc(ci->maps*sizeof(*ci->map_type));*/ /*ci->map_param=_ogg_calloc(ci->maps,sizeof(void *));*/ for(i=0;imaps;i++){ ci->map_type[i]=oggpack_read(opb,16); if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); if(!ci->map_param[i])goto err_out; } /* mode settings */ ci->modes=oggpack_read(opb,6)+1; /*vi->mode_param=_ogg_calloc(vi->modes,sizeof(void *));*/ for(i=0;imodes;i++){ ci->mode_param[i]=(vorbis_info_mode *)_ogg_calloc(1,sizeof(*ci->mode_param[i])); ci->mode_param[i]->blockflag=oggpack_read(opb,1); ci->mode_param[i]->windowtype=oggpack_read(opb,16); ci->mode_param[i]->transformtype=oggpack_read(opb,16); ci->mode_param[i]->mapping=oggpack_read(opb,8); if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; } if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ return(0); err_out: vorbis_info_clear(vi); return(OV_EBADHEADER); } /* The Vorbis header is in three packets; the initial small packet in the first page that identifies basic parameters, a second packet with bitstream comments and a third packet that holds the codebook. */ int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ oggpack_buffer opb; if(op){ oggpack_readinit(&opb,op->packet); /* Which of the three types of header is this? */ /* Also verify header-ness, vorbis */ { char buffer[6]; int packtype=oggpack_read(&opb,8); memset(buffer,0,6); _v_readstring(&opb,buffer,6); if(memcmp(buffer,"vorbis",6)){ /* not a vorbis header */ return(OV_ENOTVORBIS); } switch(packtype){ case 0x01: /* least significant *bit* is read first */ if(!op->b_o_s){ /* Not the initial packet */ return(OV_EBADHEADER); } if(vi->rate!=0){ /* previously initialized info header */ return(OV_EBADHEADER); } return(_vorbis_unpack_info(vi,&opb)); case 0x03: /* least significant *bit* is read first */ if(vi->rate==0){ /* um... we didn't get the initial header */ return(OV_EBADHEADER); } return(_vorbis_unpack_comment(vc,&opb)); case 0x05: /* least significant *bit* is read first */ if(vi->rate==0 || vc->vendor==NULL){ /* um... we didn;t get the initial header or comments yet */ return(OV_EBADHEADER); } return(_vorbis_unpack_books(vi,&opb)); default: /* Not a valid vorbis header type */ return(OV_EBADHEADER); break; } } } return(OV_EBADHEADER); } gcw0/opk-data/SQUARE_02.png000664 001750 001750 00000000265 12702465756 016272 0ustar00sergiosergio000000 000000 PNG  IHDR pHYs  ~gIDATxՔ; CuX? H҉&(e.q29 ~=4z`+VOw6rJ3b=RZOӁme^'f_L,OB4LSAؾIENDB`gx/images/Ctrl_pad3b.png000664 001750 001750 00000003462 12702465756 016273 0ustar00sergiosergio000000 000000 PNG  IHDR,]sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATxoTU{2Ӗ[i*ؠDD&1&j,11/>L0тPB-PJ/{gf9-x9se}[Z{,r8 @h Rw@ SUKs) k{u@@L ; E`{__;ʁ@; TE26H n H:A`{?s,ViNf0eP| c|^7@9Pqǁo.Mvέ^^I,cX0" \R["pb|%Ф&LZi 8X*n4xKwpc df8<+'Q͕VaNo3ؗXF>ۨ PJO{;E+*1I+fxx7H$J$]Mi.6`MT8ItRM1%,<5Ɯs{ŠfLuDu+bsFL+JQ93@laUXwzFvBLq()=gz YJ4~rDԷ]djIcVF_ua)6b婄>$VFbN{pw:` q͊"ۑ"2&;&2WUoн ^LZa+ae1%F{N,&$jք2, U+V'ljZ~\P[Q6-Ɗ"_$k0959I$ 9T G\+k(MTOͫm ;/Ӻh9XGlKS%bVzշY9C$0ɑ69Q V$9?<+5X"]d1 FZŠ-9&frx<<tj۠( ]&brO d"z%5Wn~z7HE0aYy|%V ,pI2.D2QbN,Zgz;9u!sG4qNF$pڟj@,1, r9xpQd>'GsXe%50q(VOGv1ؗk[hB,]!.{}D[Z5n ܜd5VҕrJ:>>SA,sHT`%l4 +'Yؘ)Kv$[7K/ˮ{ SVxH*؄," XYC>I-O"b2K Kz>_o6,LIENDB`core/ntsc/license.txt000664 001750 001750 00000064474 12702465756 016021 0ustar00sergiosergio000000 000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! gcw0/unzip.c000664 001750 001750 00000105377 12702465756 014106 0ustar00sergiosergio000000 000000 /* unzip.c -- IO on .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Read unzip.h for more info */ #include #include #include #include #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else #include #endif #ifndef local #define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ !defined(CASESENSITIVITYDEFAULT_NO) #define CASESENSITIVITYDEFAULT_NO #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif const char unz_copyright[] = " unzip 0.15 Copyright 1998 Gilles Vollant "; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ FILE* file; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { FILE* file; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ } unz_s; /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte(fin,pi) FILE *fin; int *pi; { unsigned char c; int err = fread(&c, 1, 1, fin); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ferror(fin)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (fileName1,fileName2) const char* fileName1; const char* fileName2; { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) const char* fileName1; const char* fileName2; int iCaseSensitivity; { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #define BUFREADCOMMENT (0x400) /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir(fin) FILE *fin; { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (fseek(fin,0,SEEK_END) != 0) return 0; uSizeFile = ftell( fin ); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (fseek(fin,uReadPos,SEEK_SET)!=0) break; if (fread(buf,(uInt)uReadSize,1,fin)!=1) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer "zlib/zlib109.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen (path) const char *path; { unz_s us; unz_s *s; uLong central_pos,uL; FILE * fin ; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; fin=fopen(path,"rb"); if (fin==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(fin); if (central_pos==0) err=UNZ_ERRNO; if (fseek(fin,central_pos,SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(fin,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); fclose(s->file); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) unzFile file; unz_global_info *pglobal_info; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) uLong ulDosDate; tm_unz* ptm; { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal (file, pfile_info, pfile_info_internal, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; unz_file_info_internal *pfile_info_internal; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo (file, pfile_info, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (file) unzFile file; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) unzFile file; const char *szFileName; int iCaseSensitivity; { unz_s* s; int err; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; return err; } /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, poffset_local_extrafield, psize_local_extrafield) unz_s* s; uInt* piSizeVar; uLong *poffset_local_extrafield; uInt *psize_local_extrafield; { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (fseek(s->file,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile (file) unzFile file; { int err=UNZ_OK; int Store; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; Store = s->cur_file_info.compression_method==0; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->file=s->file; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if (!Store) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; return UNZ_OK; } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (file, buf, len) unzFile file; voidp buf; unsigned len; { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->read_buffer == NULL)) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if (len>pfile_in_zip_read_info->rest_read_uncompressed) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if (pfile_in_zip_read_info->compression_method==0) { uInt uDoCopy,i ; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) unzFile file; voidp buf; unsigned len; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) unzFile file; char *szComment; uLong uSizeBuf; { /* int err=UNZ_OK; */ unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } core/tremor/window_lookup.h000664 001750 001750 00000371367 12702465756 017252 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: window lookup tables ********************************************************************/ #include "os_types.h" static LOOKUP_T vwin64[32] = { X(0x001f0003), X(0x01168c98), X(0x030333c8), X(0x05dfe3a4), X(0x09a49562), X(0x0e45df18), X(0x13b47ef2), X(0x19dcf676), X(0x20a74d83), X(0x27f7137c), X(0x2fabb05a), X(0x37a1105a), X(0x3fb0ab28), X(0x47b2dcd1), X(0x4f807bc6), X(0x56f48e70), X(0x5dedfc79), X(0x64511653), X(0x6a08cfff), X(0x6f079328), X(0x734796f4), X(0x76cab7f2), X(0x7999d6e8), X(0x7bc3cf9f), X(0x7d5c20c1), X(0x7e7961df), X(0x7f33a567), X(0x7fa2e1d0), X(0x7fdd78a5), X(0x7ff6ec6d), X(0x7ffed0e9), X(0x7ffffc3f), }; static LOOKUP_T vwin128[64] = { X(0x0007c04d), X(0x0045bb89), X(0x00c18b87), X(0x017ae294), X(0x02714a4e), X(0x03a4217a), X(0x05129952), X(0x06bbb24f), X(0x089e38a1), X(0x0ab8c073), X(0x0d09a228), X(0x0f8ef6bd), X(0x12469488), X(0x152e0c7a), X(0x1842a81c), X(0x1b81686d), X(0x1ee705d9), X(0x226ff15d), X(0x26185705), X(0x29dc21cc), X(0x2db700fe), X(0x31a46f08), X(0x359fb9c1), X(0x39a40c0c), X(0x3dac78b6), X(0x41b40674), X(0x45b5bcb0), X(0x49acb109), X(0x4d94152b), X(0x516744bd), X(0x5521d320), X(0x58bf98a5), X(0x5c3cbef4), X(0x5f95cc5d), X(0x62c7add7), X(0x65cfbf64), X(0x68abd2ba), X(0x6b5a3405), X(0x6dd9acab), X(0x7029840d), X(0x72497e38), X(0x7439d8ac), X(0x75fb4532), X(0x778ee30a), X(0x78f6367e), X(0x7a331f1a), X(0x7b47cccd), X(0x7c36b416), X(0x7d028192), X(0x7dae0d18), X(0x7e3c4caa), X(0x7eb04763), X(0x7f0d08a7), X(0x7f5593b7), X(0x7f8cd7d5), X(0x7fb5a513), X(0x7fd2a1fc), X(0x7fe64212), X(0x7ff2bd4c), X(0x7ffa0890), X(0x7ffdcf39), X(0x7fff6dac), X(0x7fffed01), X(0x7fffffc4), }; static LOOKUP_T vwin256[128] = { X(0x0001f018), X(0x00117066), X(0x00306e9e), X(0x005ee5f1), X(0x009ccf26), X(0x00ea208b), X(0x0146cdea), X(0x01b2c87f), X(0x022dfedf), X(0x02b85ced), X(0x0351cbbd), X(0x03fa317f), X(0x04b17167), X(0x05776b90), X(0x064bfcdc), X(0x072efedd), X(0x082047b4), X(0x091fa9f1), X(0x0a2cf477), X(0x0b47f25d), X(0x0c706ad2), X(0x0da620ff), X(0x0ee8d3ef), X(0x10383e75), X(0x11941716), X(0x12fc0ff6), X(0x146fd6c8), X(0x15ef14c2), X(0x17796e8e), X(0x190e844f), X(0x1aadf196), X(0x1c574d6e), X(0x1e0a2a62), X(0x1fc61688), X(0x218a9b9c), X(0x23573f12), X(0x252b823d), X(0x2706e269), X(0x28e8d913), X(0x2ad0dc0e), X(0x2cbe5dc1), X(0x2eb0cd60), X(0x30a79733), X(0x32a224d5), X(0x349fdd8b), X(0x36a02690), X(0x38a2636f), X(0x3aa5f65e), X(0x3caa409e), X(0x3eaea2df), X(0x40b27da6), X(0x42b531b8), X(0x44b62086), X(0x46b4ac99), X(0x48b03a05), X(0x4aa82ed5), X(0x4c9bf37d), X(0x4e8af349), X(0x50749ccb), X(0x52586246), X(0x5435ba1c), X(0x560c1f31), X(0x57db1152), X(0x59a21591), X(0x5b60b6a3), X(0x5d168535), X(0x5ec31839), X(0x60660d36), X(0x61ff0886), X(0x638db595), X(0x6511c717), X(0x668af734), X(0x67f907b0), X(0x695bc207), X(0x6ab2f787), X(0x6bfe815a), X(0x6d3e4090), X(0x6e721e16), X(0x6f9a0ab5), X(0x70b5fef8), X(0x71c5fb16), X(0x72ca06cd), X(0x73c2313d), X(0x74ae90b2), X(0x758f4275), X(0x76646a85), X(0x772e335c), X(0x77eccda0), X(0x78a06fd7), X(0x79495613), X(0x79e7c19c), X(0x7a7bf894), X(0x7b064596), X(0x7b86f757), X(0x7bfe6044), X(0x7c6cd615), X(0x7cd2b16e), X(0x7d304d71), X(0x7d860756), X(0x7dd43e06), X(0x7e1b51ad), X(0x7e5ba355), X(0x7e95947e), X(0x7ec986bb), X(0x7ef7db4a), X(0x7f20f2b9), X(0x7f452c7f), X(0x7f64e6a7), X(0x7f807d71), X(0x7f984aff), X(0x7faca700), X(0x7fbde662), X(0x7fcc5b04), X(0x7fd85372), X(0x7fe21a99), X(0x7fe9f791), X(0x7ff02d58), X(0x7ff4fa9e), X(0x7ff89990), X(0x7ffb3faa), X(0x7ffd1d8b), X(0x7ffe5ecc), X(0x7fff29e0), X(0x7fff9ff3), X(0x7fffdcd2), X(0x7ffff6d6), X(0x7ffffed0), X(0x7ffffffc), }; static LOOKUP_T vwin512[256] = { X(0x00007c06), X(0x00045c32), X(0x000c1c62), X(0x0017bc4c), X(0x00273b7a), X(0x003a9955), X(0x0051d51c), X(0x006cede7), X(0x008be2a9), X(0x00aeb22a), X(0x00d55b0d), X(0x00ffdbcc), X(0x012e32b6), X(0x01605df5), X(0x01965b85), X(0x01d02939), X(0x020dc4ba), X(0x024f2b83), X(0x02945ae6), X(0x02dd5004), X(0x032a07d3), X(0x037a7f19), X(0x03ceb26e), X(0x04269e37), X(0x04823eab), X(0x04e18fcc), X(0x05448d6d), X(0x05ab3329), X(0x06157c68), X(0x0683645e), X(0x06f4e607), X(0x0769fc25), X(0x07e2a146), X(0x085ecfbc), X(0x08de819f), X(0x0961b0cc), X(0x09e856e3), X(0x0a726d46), X(0x0affed1d), X(0x0b90cf4c), X(0x0c250c79), X(0x0cbc9d0b), X(0x0d577926), X(0x0df598aa), X(0x0e96f337), X(0x0f3b8026), X(0x0fe3368f), X(0x108e0d42), X(0x113bfaca), X(0x11ecf56b), X(0x12a0f324), X(0x1357e9ac), X(0x1411ce70), X(0x14ce9698), X(0x158e3702), X(0x1650a444), X(0x1715d2aa), X(0x17ddb638), X(0x18a842aa), X(0x19756b72), X(0x1a4523b9), X(0x1b175e62), X(0x1bec0e04), X(0x1cc324f0), X(0x1d9c9532), X(0x1e78508a), X(0x1f564876), X(0x20366e2e), X(0x2118b2a2), X(0x21fd0681), X(0x22e35a37), X(0x23cb9dee), X(0x24b5c18e), X(0x25a1b4c0), X(0x268f66f1), X(0x277ec74e), X(0x286fc4cc), X(0x29624e23), X(0x2a5651d7), X(0x2b4bbe34), X(0x2c428150), X(0x2d3a8913), X(0x2e33c332), X(0x2f2e1d35), X(0x30298478), X(0x3125e62d), X(0x32232f61), X(0x33214cfc), X(0x34202bc2), X(0x351fb85a), X(0x361fdf4f), X(0x37208d10), X(0x3821adf7), X(0x39232e49), X(0x3a24fa3c), X(0x3b26fdf6), X(0x3c292593), X(0x3d2b5d29), X(0x3e2d90c8), X(0x3f2fac7f), X(0x40319c5f), X(0x41334c81), X(0x4234a905), X(0x43359e16), X(0x443617f3), X(0x453602eb), X(0x46354b65), X(0x4733dde1), X(0x4831a6ff), X(0x492e937f), X(0x4a2a9045), X(0x4b258a5f), X(0x4c1f6f06), X(0x4d182ba2), X(0x4e0fadce), X(0x4f05e35b), X(0x4ffaba53), X(0x50ee20fd), X(0x51e005e1), X(0x52d057ca), X(0x53bf05ca), X(0x54abff3b), X(0x559733c7), X(0x56809365), X(0x57680e62), X(0x584d955d), X(0x59311952), X(0x5a128b96), X(0x5af1dddd), X(0x5bcf023a), X(0x5ca9eb27), X(0x5d828b81), X(0x5e58d68d), X(0x5f2cbffc), X(0x5ffe3be9), X(0x60cd3edf), X(0x6199bdda), X(0x6263ae45), X(0x632b0602), X(0x63efbb66), X(0x64b1c53f), X(0x65711ad0), X(0x662db3d7), X(0x66e7888d), X(0x679e91a5), X(0x6852c84e), X(0x69042635), X(0x69b2a582), X(0x6a5e40dd), X(0x6b06f36c), X(0x6bacb8d2), X(0x6c4f8d30), X(0x6cef6d26), X(0x6d8c55d4), X(0x6e2644d4), X(0x6ebd3840), X(0x6f512ead), X(0x6fe2272e), X(0x7070214f), X(0x70fb1d17), X(0x71831b06), X(0x72081c16), X(0x728a21b5), X(0x73092dc8), X(0x738542a6), X(0x73fe631b), X(0x74749261), X(0x74e7d421), X(0x75582c72), X(0x75c59fd5), X(0x76303333), X(0x7697ebdd), X(0x76fccf85), X(0x775ee443), X(0x77be308a), X(0x781abb2e), X(0x78748b59), X(0x78cba88e), X(0x79201aa7), X(0x7971e9cd), X(0x79c11e79), X(0x7a0dc170), X(0x7a57dbc2), X(0x7a9f76c1), X(0x7ae49c07), X(0x7b27556b), X(0x7b67ad02), X(0x7ba5ad1b), X(0x7be1603a), X(0x7c1ad118), X(0x7c520a9e), X(0x7c8717e1), X(0x7cba0421), X(0x7ceadac3), X(0x7d19a74f), X(0x7d46756e), X(0x7d7150e5), X(0x7d9a4592), X(0x7dc15f69), X(0x7de6aa71), X(0x7e0a32c0), X(0x7e2c0479), X(0x7e4c2bc7), X(0x7e6ab4db), X(0x7e87abe9), X(0x7ea31d24), X(0x7ebd14be), X(0x7ed59edd), X(0x7eecc7a3), X(0x7f029b21), X(0x7f17255a), X(0x7f2a723f), X(0x7f3c8daa), X(0x7f4d835d), X(0x7f5d5f00), X(0x7f6c2c1b), X(0x7f79f617), X(0x7f86c83a), X(0x7f92ada2), X(0x7f9db146), X(0x7fa7ddf3), X(0x7fb13e46), X(0x7fb9dcb0), X(0x7fc1c36c), X(0x7fc8fc83), X(0x7fcf91c7), X(0x7fd58cd2), X(0x7fdaf702), X(0x7fdfd979), X(0x7fe43d1c), X(0x7fe82a8b), X(0x7febaa29), X(0x7feec412), X(0x7ff1801c), X(0x7ff3e5d6), X(0x7ff5fc86), X(0x7ff7cb29), X(0x7ff9586f), X(0x7ffaaaba), X(0x7ffbc81e), X(0x7ffcb660), X(0x7ffd7af3), X(0x7ffe1afa), X(0x7ffe9b42), X(0x7fff0047), X(0x7fff4e2f), X(0x7fff88c9), X(0x7fffb390), X(0x7fffd1a6), X(0x7fffe5d7), X(0x7ffff296), X(0x7ffff9fd), X(0x7ffffdcd), X(0x7fffff6d), X(0x7fffffed), X(0x7fffffff), }; static LOOKUP_T vwin1024[512] = { X(0x00001f02), X(0x0001170e), X(0x00030724), X(0x0005ef40), X(0x0009cf59), X(0x000ea767), X(0x0014775e), X(0x001b3f2e), X(0x0022fec8), X(0x002bb618), X(0x00356508), X(0x00400b81), X(0x004ba968), X(0x00583ea0), X(0x0065cb0a), X(0x00744e84), X(0x0083c8ea), X(0x00943a14), X(0x00a5a1da), X(0x00b80010), X(0x00cb5488), X(0x00df9f10), X(0x00f4df76), X(0x010b1584), X(0x01224101), X(0x013a61b2), X(0x01537759), X(0x016d81b6), X(0x01888087), X(0x01a47385), X(0x01c15a69), X(0x01df34e6), X(0x01fe02b1), X(0x021dc377), X(0x023e76e7), X(0x02601ca9), X(0x0282b466), X(0x02a63dc1), X(0x02cab85d), X(0x02f023d6), X(0x03167fcb), X(0x033dcbd3), X(0x03660783), X(0x038f3270), X(0x03b94c29), X(0x03e4543a), X(0x04104a2e), X(0x043d2d8b), X(0x046afdd5), X(0x0499ba8c), X(0x04c9632d), X(0x04f9f734), X(0x052b7615), X(0x055ddf46), X(0x05913237), X(0x05c56e53), X(0x05fa9306), X(0x06309fb6), X(0x066793c5), X(0x069f6e93), X(0x06d82f7c), X(0x0711d5d9), X(0x074c60fe), X(0x0787d03d), X(0x07c422e4), X(0x0801583e), X(0x083f6f91), X(0x087e681f), X(0x08be4129), X(0x08fef9ea), X(0x0940919a), X(0x0983076d), X(0x09c65a92), X(0x0a0a8a38), X(0x0a4f9585), X(0x0a957b9f), X(0x0adc3ba7), X(0x0b23d4b9), X(0x0b6c45ee), X(0x0bb58e5a), X(0x0bffad0f), X(0x0c4aa11a), X(0x0c966982), X(0x0ce3054d), X(0x0d30737b), X(0x0d7eb308), X(0x0dcdc2eb), X(0x0e1da21a), X(0x0e6e4f83), X(0x0ebfca11), X(0x0f1210ad), X(0x0f652238), X(0x0fb8fd91), X(0x100da192), X(0x10630d11), X(0x10b93ee0), X(0x111035cb), X(0x1167f09a), X(0x11c06e13), X(0x1219acf5), X(0x1273abfb), X(0x12ce69db), X(0x1329e54a), X(0x13861cf3), X(0x13e30f80), X(0x1440bb97), X(0x149f1fd8), X(0x14fe3ade), X(0x155e0b40), X(0x15be8f92), X(0x161fc662), X(0x1681ae38), X(0x16e4459b), X(0x17478b0b), X(0x17ab7d03), X(0x181019fb), X(0x18756067), X(0x18db4eb3), X(0x1941e34a), X(0x19a91c92), X(0x1a10f8ea), X(0x1a7976af), X(0x1ae29439), X(0x1b4c4fda), X(0x1bb6a7e2), X(0x1c219a9a), X(0x1c8d2649), X(0x1cf9492e), X(0x1d660188), X(0x1dd34d8e), X(0x1e412b74), X(0x1eaf996a), X(0x1f1e959b), X(0x1f8e1e2f), X(0x1ffe3146), X(0x206ecd01), X(0x20dfef78), X(0x215196c2), X(0x21c3c0f0), X(0x22366c10), X(0x22a9962a), X(0x231d3d45), X(0x23915f60), X(0x2405fa7a), X(0x247b0c8c), X(0x24f09389), X(0x25668d65), X(0x25dcf80c), X(0x2653d167), X(0x26cb175e), X(0x2742c7d0), X(0x27bae09e), X(0x28335fa2), X(0x28ac42b3), X(0x292587a5), X(0x299f2c48), X(0x2a192e69), X(0x2a938bd1), X(0x2b0e4247), X(0x2b894f8d), X(0x2c04b164), X(0x2c806588), X(0x2cfc69b2), X(0x2d78bb9a), X(0x2df558f4), X(0x2e723f6f), X(0x2eef6cbb), X(0x2f6cde83), X(0x2fea9270), X(0x30688627), X(0x30e6b74e), X(0x31652385), X(0x31e3c86b), X(0x3262a39e), X(0x32e1b2b8), X(0x3360f352), X(0x33e06303), X(0x345fff5e), X(0x34dfc5f8), X(0x355fb462), X(0x35dfc82a), X(0x365ffee0), X(0x36e0560f), X(0x3760cb43), X(0x37e15c05), X(0x386205df), X(0x38e2c657), X(0x39639af5), X(0x39e4813e), X(0x3a6576b6), X(0x3ae678e3), X(0x3b678547), X(0x3be89965), X(0x3c69b2c1), X(0x3ceacedc), X(0x3d6beb37), X(0x3ded0557), X(0x3e6e1abb), X(0x3eef28e6), X(0x3f702d5a), X(0x3ff1259a), X(0x40720f29), X(0x40f2e789), X(0x4173ac3f), X(0x41f45ad0), X(0x4274f0c2), X(0x42f56b9a), X(0x4375c8e0), X(0x43f6061d), X(0x447620db), X(0x44f616a5), X(0x4575e509), X(0x45f58994), X(0x467501d6), X(0x46f44b62), X(0x477363cb), X(0x47f248a6), X(0x4870f78e), X(0x48ef6e1a), X(0x496da9e8), X(0x49eba897), X(0x4a6967c8), X(0x4ae6e521), X(0x4b641e47), X(0x4be110e5), X(0x4c5dbaa7), X(0x4cda193f), X(0x4d562a5f), X(0x4dd1ebbd), X(0x4e4d5b15), X(0x4ec87623), X(0x4f433aa9), X(0x4fbda66c), X(0x5037b734), X(0x50b16acf), X(0x512abf0e), X(0x51a3b1c5), X(0x521c40ce), X(0x52946a06), X(0x530c2b50), X(0x53838292), X(0x53fa6db8), X(0x5470eab3), X(0x54e6f776), X(0x555c91fc), X(0x55d1b844), X(0x56466851), X(0x56baa02f), X(0x572e5deb), X(0x57a19f98), X(0x58146352), X(0x5886a737), X(0x58f8696d), X(0x5969a81c), X(0x59da6177), X(0x5a4a93b4), X(0x5aba3d0f), X(0x5b295bcb), X(0x5b97ee30), X(0x5c05f28d), X(0x5c736738), X(0x5ce04a8d), X(0x5d4c9aed), X(0x5db856c1), X(0x5e237c78), X(0x5e8e0a89), X(0x5ef7ff6f), X(0x5f6159b0), X(0x5fca17d4), X(0x6032386e), X(0x6099ba15), X(0x61009b69), X(0x6166db11), X(0x61cc77b9), X(0x62317017), X(0x6295c2e7), X(0x62f96eec), X(0x635c72f1), X(0x63becdc8), X(0x64207e4b), X(0x6481835a), X(0x64e1dbde), X(0x654186c8), X(0x65a0830e), X(0x65fecfb1), X(0x665c6bb7), X(0x66b95630), X(0x67158e30), X(0x677112d7), X(0x67cbe34b), X(0x6825feb9), X(0x687f6456), X(0x68d81361), X(0x69300b1e), X(0x69874ada), X(0x69ddd1ea), X(0x6a339fab), X(0x6a88b382), X(0x6add0cdb), X(0x6b30ab2a), X(0x6b838dec), X(0x6bd5b4a6), X(0x6c271ee2), X(0x6c77cc36), X(0x6cc7bc3d), X(0x6d16ee9b), X(0x6d6562fb), X(0x6db31911), X(0x6e001099), X(0x6e4c4955), X(0x6e97c311), X(0x6ee27d9f), X(0x6f2c78d9), X(0x6f75b4a2), X(0x6fbe30e4), X(0x7005ed91), X(0x704ceaa1), X(0x70932816), X(0x70d8a5f8), X(0x711d6457), X(0x7161634b), X(0x71a4a2f3), X(0x71e72375), X(0x7228e500), X(0x7269e7c8), X(0x72aa2c0a), X(0x72e9b209), X(0x73287a12), X(0x73668476), X(0x73a3d18f), X(0x73e061bc), X(0x741c3566), X(0x74574cfa), X(0x7491a8ee), X(0x74cb49be), X(0x75042fec), X(0x753c5c03), X(0x7573ce92), X(0x75aa882f), X(0x75e08979), X(0x7615d313), X(0x764a65a7), X(0x767e41e5), X(0x76b16884), X(0x76e3da40), X(0x771597dc), X(0x7746a221), X(0x7776f9dd), X(0x77a69fe6), X(0x77d59514), X(0x7803da49), X(0x7831706a), X(0x785e5861), X(0x788a9320), X(0x78b6219c), X(0x78e104cf), X(0x790b3dbb), X(0x7934cd64), X(0x795db4d5), X(0x7985f51d), X(0x79ad8f50), X(0x79d48486), X(0x79fad5de), X(0x7a208478), X(0x7a45917b), X(0x7a69fe12), X(0x7a8dcb6c), X(0x7ab0fabb), X(0x7ad38d36), X(0x7af5841a), X(0x7b16e0a3), X(0x7b37a416), X(0x7b57cfb8), X(0x7b7764d4), X(0x7b9664b6), X(0x7bb4d0b0), X(0x7bd2aa14), X(0x7beff23b), X(0x7c0caa7f), X(0x7c28d43c), X(0x7c4470d2), X(0x7c5f81a5), X(0x7c7a081a), X(0x7c940598), X(0x7cad7b8b), X(0x7cc66b5e), X(0x7cded680), X(0x7cf6be64), X(0x7d0e247b), X(0x7d250a3c), X(0x7d3b711c), X(0x7d515a95), X(0x7d66c822), X(0x7d7bbb3c), X(0x7d903563), X(0x7da43814), X(0x7db7c4d0), X(0x7dcadd16), X(0x7ddd826a), X(0x7defb64d), X(0x7e017a44), X(0x7e12cfd3), X(0x7e23b87f), X(0x7e3435cc), X(0x7e444943), X(0x7e53f467), X(0x7e6338c0), X(0x7e7217d5), X(0x7e80932b), X(0x7e8eac49), X(0x7e9c64b7), X(0x7ea9bdf8), X(0x7eb6b994), X(0x7ec35910), X(0x7ecf9def), X(0x7edb89b6), X(0x7ee71de9), X(0x7ef25c09), X(0x7efd4598), X(0x7f07dc16), X(0x7f122103), X(0x7f1c15dc), X(0x7f25bc1f), X(0x7f2f1547), X(0x7f3822cd), X(0x7f40e62b), X(0x7f4960d6), X(0x7f519443), X(0x7f5981e7), X(0x7f612b31), X(0x7f689191), X(0x7f6fb674), X(0x7f769b45), X(0x7f7d416c), X(0x7f83aa51), X(0x7f89d757), X(0x7f8fc9df), X(0x7f958348), X(0x7f9b04ef), X(0x7fa0502e), X(0x7fa56659), X(0x7faa48c7), X(0x7faef8c7), X(0x7fb377a7), X(0x7fb7c6b3), X(0x7fbbe732), X(0x7fbfda67), X(0x7fc3a196), X(0x7fc73dfa), X(0x7fcab0ce), X(0x7fcdfb4a), X(0x7fd11ea0), X(0x7fd41c00), X(0x7fd6f496), X(0x7fd9a989), X(0x7fdc3bff), X(0x7fdead17), X(0x7fe0fdee), X(0x7fe32f9d), X(0x7fe54337), X(0x7fe739ce), X(0x7fe9146c), X(0x7fead41b), X(0x7fec79dd), X(0x7fee06b2), X(0x7fef7b94), X(0x7ff0d97b), X(0x7ff22158), X(0x7ff35417), X(0x7ff472a3), X(0x7ff57de0), X(0x7ff676ac), X(0x7ff75de3), X(0x7ff8345a), X(0x7ff8fae4), X(0x7ff9b24b), X(0x7ffa5b58), X(0x7ffaf6cd), X(0x7ffb8568), X(0x7ffc07e2), X(0x7ffc7eed), X(0x7ffceb38), X(0x7ffd4d6d), X(0x7ffda631), X(0x7ffdf621), X(0x7ffe3dd8), X(0x7ffe7dea), X(0x7ffeb6e7), X(0x7ffee959), X(0x7fff15c4), X(0x7fff3ca9), X(0x7fff5e80), X(0x7fff7bc0), X(0x7fff94d6), X(0x7fffaa2d), X(0x7fffbc29), X(0x7fffcb29), X(0x7fffd786), X(0x7fffe195), X(0x7fffe9a3), X(0x7fffeffa), X(0x7ffff4dd), X(0x7ffff889), X(0x7ffffb37), X(0x7ffffd1a), X(0x7ffffe5d), X(0x7fffff29), X(0x7fffffa0), X(0x7fffffdd), X(0x7ffffff7), X(0x7fffffff), X(0x7fffffff), }; static LOOKUP_T vwin2048[1024] = { X(0x000007c0), X(0x000045c4), X(0x0000c1ca), X(0x00017bd3), X(0x000273de), X(0x0003a9eb), X(0x00051df9), X(0x0006d007), X(0x0008c014), X(0x000aee1e), X(0x000d5a25), X(0x00100428), X(0x0012ec23), X(0x00161216), X(0x001975fe), X(0x001d17da), X(0x0020f7a8), X(0x00251564), X(0x0029710c), X(0x002e0a9e), X(0x0032e217), X(0x0037f773), X(0x003d4ab0), X(0x0042dbca), X(0x0048aabe), X(0x004eb788), X(0x00550224), X(0x005b8a8f), X(0x006250c5), X(0x006954c1), X(0x0070967e), X(0x007815f9), X(0x007fd32c), X(0x0087ce13), X(0x009006a9), X(0x00987ce9), X(0x00a130cc), X(0x00aa224f), X(0x00b3516b), X(0x00bcbe1a), X(0x00c66856), X(0x00d0501a), X(0x00da755f), X(0x00e4d81f), X(0x00ef7853), X(0x00fa55f4), X(0x010570fc), X(0x0110c963), X(0x011c5f22), X(0x01283232), X(0x0134428c), X(0x01409027), X(0x014d1afb), X(0x0159e302), X(0x0166e831), X(0x01742a82), X(0x0181a9ec), X(0x018f6665), X(0x019d5fe5), X(0x01ab9663), X(0x01ba09d6), X(0x01c8ba34), X(0x01d7a775), X(0x01e6d18d), X(0x01f63873), X(0x0205dc1e), X(0x0215bc82), X(0x0225d997), X(0x02363350), X(0x0246c9a3), X(0x02579c86), X(0x0268abed), X(0x0279f7cc), X(0x028b801a), X(0x029d44c9), X(0x02af45ce), X(0x02c1831d), X(0x02d3fcaa), X(0x02e6b269), X(0x02f9a44c), X(0x030cd248), X(0x03203c4f), X(0x0333e255), X(0x0347c44b), X(0x035be225), X(0x03703bd5), X(0x0384d14d), X(0x0399a280), X(0x03aeaf5e), X(0x03c3f7d9), X(0x03d97be4), X(0x03ef3b6e), X(0x0405366a), X(0x041b6cc8), X(0x0431de78), X(0x04488b6c), X(0x045f7393), X(0x047696dd), X(0x048df53b), X(0x04a58e9b), X(0x04bd62ee), X(0x04d57223), X(0x04edbc28), X(0x050640ed), X(0x051f0060), X(0x0537fa70), X(0x05512f0a), X(0x056a9e1e), X(0x05844798), X(0x059e2b67), X(0x05b84978), X(0x05d2a1b8), X(0x05ed3414), X(0x06080079), X(0x062306d3), X(0x063e470f), X(0x0659c119), X(0x067574dd), X(0x06916247), X(0x06ad8941), X(0x06c9e9b8), X(0x06e68397), X(0x070356c8), X(0x07206336), X(0x073da8cb), X(0x075b2772), X(0x0778df15), X(0x0796cf9c), X(0x07b4f8f3), X(0x07d35b01), X(0x07f1f5b1), X(0x0810c8eb), X(0x082fd497), X(0x084f189e), X(0x086e94e9), X(0x088e495e), X(0x08ae35e6), X(0x08ce5a68), X(0x08eeb6cc), X(0x090f4af8), X(0x093016d3), X(0x09511a44), X(0x09725530), X(0x0993c77f), X(0x09b57115), X(0x09d751d8), X(0x09f969ae), X(0x0a1bb87c), X(0x0a3e3e26), X(0x0a60fa91), X(0x0a83eda2), X(0x0aa7173c), X(0x0aca7743), X(0x0aee0d9b), X(0x0b11da28), X(0x0b35dccc), X(0x0b5a156a), X(0x0b7e83e5), X(0x0ba3281f), X(0x0bc801fa), X(0x0bed1159), X(0x0c12561c), X(0x0c37d025), X(0x0c5d7f55), X(0x0c83638d), X(0x0ca97cae), X(0x0ccfca97), X(0x0cf64d2a), X(0x0d1d0444), X(0x0d43efc7), X(0x0d6b0f92), X(0x0d926383), X(0x0db9eb79), X(0x0de1a752), X(0x0e0996ee), X(0x0e31ba29), X(0x0e5a10e2), X(0x0e829af6), X(0x0eab5841), X(0x0ed448a2), X(0x0efd6bf4), X(0x0f26c214), X(0x0f504ade), X(0x0f7a062e), X(0x0fa3f3df), X(0x0fce13cd), X(0x0ff865d2), X(0x1022e9ca), X(0x104d9f8e), X(0x107886f9), X(0x10a39fe5), X(0x10ceea2c), X(0x10fa65a6), X(0x1126122d), X(0x1151ef9a), X(0x117dfdc5), X(0x11aa3c87), X(0x11d6abb6), X(0x12034b2c), X(0x12301ac0), X(0x125d1a48), X(0x128a499b), X(0x12b7a891), X(0x12e536ff), X(0x1312f4bb), X(0x1340e19c), X(0x136efd75), X(0x139d481e), X(0x13cbc16a), X(0x13fa692f), X(0x14293f40), X(0x14584371), X(0x14877597), X(0x14b6d585), X(0x14e6630d), X(0x15161e04), X(0x1546063b), X(0x15761b85), X(0x15a65db3), X(0x15d6cc99), X(0x16076806), X(0x16382fcd), X(0x166923bf), X(0x169a43ab), X(0x16cb8f62), X(0x16fd06b5), X(0x172ea973), X(0x1760776b), X(0x1792706e), X(0x17c49449), X(0x17f6e2cb), X(0x18295bc3), X(0x185bfeff), X(0x188ecc4c), X(0x18c1c379), X(0x18f4e452), X(0x19282ea4), X(0x195ba23c), X(0x198f3ee6), X(0x19c3046e), X(0x19f6f2a1), X(0x1a2b094a), X(0x1a5f4833), X(0x1a93af28), X(0x1ac83df3), X(0x1afcf460), X(0x1b31d237), X(0x1b66d744), X(0x1b9c034e), X(0x1bd15621), X(0x1c06cf84), X(0x1c3c6f40), X(0x1c72351e), X(0x1ca820e6), X(0x1cde3260), X(0x1d146953), X(0x1d4ac587), X(0x1d8146c3), X(0x1db7eccd), X(0x1deeb76c), X(0x1e25a667), X(0x1e5cb982), X(0x1e93f085), X(0x1ecb4b33), X(0x1f02c953), X(0x1f3a6aaa), X(0x1f722efb), X(0x1faa160b), X(0x1fe21f9e), X(0x201a4b79), X(0x2052995d), X(0x208b0910), X(0x20c39a53), X(0x20fc4cea), X(0x21352097), X(0x216e151c), X(0x21a72a3a), X(0x21e05fb5), X(0x2219b54d), X(0x22532ac3), X(0x228cbfd8), X(0x22c6744d), X(0x230047e2), X(0x233a3a58), X(0x23744b6d), X(0x23ae7ae3), X(0x23e8c878), X(0x242333ec), X(0x245dbcfd), X(0x24986369), X(0x24d326f1), X(0x250e0750), X(0x25490446), X(0x25841d90), X(0x25bf52ec), X(0x25faa417), X(0x263610cd), X(0x267198cc), X(0x26ad3bcf), X(0x26e8f994), X(0x2724d1d6), X(0x2760c451), X(0x279cd0c0), X(0x27d8f6e0), X(0x2815366a), X(0x28518f1b), X(0x288e00ac), X(0x28ca8ad8), X(0x29072d5a), X(0x2943e7eb), X(0x2980ba45), X(0x29bda422), X(0x29faa53c), X(0x2a37bd4a), X(0x2a74ec07), X(0x2ab2312b), X(0x2aef8c6f), X(0x2b2cfd8b), X(0x2b6a8437), X(0x2ba8202c), X(0x2be5d120), X(0x2c2396cc), X(0x2c6170e7), X(0x2c9f5f29), X(0x2cdd6147), X(0x2d1b76fa), X(0x2d599ff7), X(0x2d97dbf5), X(0x2dd62aab), X(0x2e148bcf), X(0x2e52ff16), X(0x2e918436), X(0x2ed01ae5), X(0x2f0ec2d9), X(0x2f4d7bc6), X(0x2f8c4562), X(0x2fcb1f62), X(0x300a097a), X(0x3049035f), X(0x30880cc6), X(0x30c72563), X(0x31064cea), X(0x3145830f), X(0x3184c786), X(0x31c41a03), X(0x32037a39), X(0x3242e7dc), X(0x3282629f), X(0x32c1ea36), X(0x33017e53), X(0x33411ea9), X(0x3380caec), X(0x33c082ce), X(0x34004602), X(0x34401439), X(0x347fed27), X(0x34bfd07e), X(0x34ffbdf0), X(0x353fb52e), X(0x357fb5ec), X(0x35bfbfda), X(0x35ffd2aa), X(0x363fee0f), X(0x368011b9), X(0x36c03d5a), X(0x370070a4), X(0x3740ab48), X(0x3780ecf7), X(0x37c13562), X(0x3801843a), X(0x3841d931), X(0x388233f7), X(0x38c2943d), X(0x3902f9b4), X(0x3943640d), X(0x3983d2f8), X(0x39c44626), X(0x3a04bd48), X(0x3a45380e), X(0x3a85b62a), X(0x3ac6374a), X(0x3b06bb20), X(0x3b47415c), X(0x3b87c9ae), X(0x3bc853c7), X(0x3c08df57), X(0x3c496c0f), X(0x3c89f99f), X(0x3cca87b6), X(0x3d0b1605), X(0x3d4ba43d), X(0x3d8c320e), X(0x3dccbf27), X(0x3e0d4b3a), X(0x3e4dd5f6), X(0x3e8e5f0c), X(0x3ecee62b), X(0x3f0f6b05), X(0x3f4fed49), X(0x3f906ca8), X(0x3fd0e8d2), X(0x40116177), X(0x4051d648), X(0x409246f6), X(0x40d2b330), X(0x41131aa7), X(0x41537d0c), X(0x4193da10), X(0x41d43162), X(0x421482b4), X(0x4254cdb7), X(0x4295121b), X(0x42d54f91), X(0x431585ca), X(0x4355b477), X(0x4395db49), X(0x43d5f9f1), X(0x44161021), X(0x44561d8a), X(0x449621dd), X(0x44d61ccc), X(0x45160e08), X(0x4555f544), X(0x4595d230), X(0x45d5a47f), X(0x46156be3), X(0x4655280e), X(0x4694d8b2), X(0x46d47d82), X(0x4714162f), X(0x4753a26d), X(0x479321ef), X(0x47d29466), X(0x4811f987), X(0x48515104), X(0x48909a91), X(0x48cfd5e1), X(0x490f02a7), X(0x494e2098), X(0x498d2f66), X(0x49cc2ec7), X(0x4a0b1e6f), X(0x4a49fe11), X(0x4a88cd62), X(0x4ac78c18), X(0x4b0639e6), X(0x4b44d683), X(0x4b8361a2), X(0x4bc1dafa), X(0x4c004241), X(0x4c3e972c), X(0x4c7cd970), X(0x4cbb08c5), X(0x4cf924e1), X(0x4d372d7a), X(0x4d752247), X(0x4db30300), X(0x4df0cf5a), X(0x4e2e870f), X(0x4e6c29d6), X(0x4ea9b766), X(0x4ee72f78), X(0x4f2491c4), X(0x4f61de02), X(0x4f9f13ec), X(0x4fdc333b), X(0x50193ba8), X(0x50562ced), X(0x509306c3), X(0x50cfc8e5), X(0x510c730d), X(0x514904f6), X(0x51857e5a), X(0x51c1def5), X(0x51fe2682), X(0x523a54bc), X(0x52766961), X(0x52b2642c), X(0x52ee44d9), X(0x532a0b26), X(0x5365b6d0), X(0x53a14793), X(0x53dcbd2f), X(0x54181760), X(0x545355e5), X(0x548e787d), X(0x54c97ee6), X(0x550468e1), X(0x553f362c), X(0x5579e687), X(0x55b479b3), X(0x55eeef70), X(0x5629477f), X(0x566381a1), X(0x569d9d97), X(0x56d79b24), X(0x57117a0a), X(0x574b3a0a), X(0x5784dae9), X(0x57be5c69), X(0x57f7be4d), X(0x5831005a), X(0x586a2254), X(0x58a32400), X(0x58dc0522), X(0x5914c57f), X(0x594d64de), X(0x5985e305), X(0x59be3fba), X(0x59f67ac3), X(0x5a2e93e9), X(0x5a668af2), X(0x5a9e5fa6), X(0x5ad611ce), X(0x5b0da133), X(0x5b450d9d), X(0x5b7c56d7), X(0x5bb37ca9), X(0x5bea7ede), X(0x5c215d41), X(0x5c58179d), X(0x5c8eadbe), X(0x5cc51f6f), X(0x5cfb6c7c), X(0x5d3194b2), X(0x5d6797de), X(0x5d9d75cf), X(0x5dd32e51), X(0x5e08c132), X(0x5e3e2e43), X(0x5e737551), X(0x5ea8962d), X(0x5edd90a7), X(0x5f12648e), X(0x5f4711b4), X(0x5f7b97ea), X(0x5faff702), X(0x5fe42ece), X(0x60183f20), X(0x604c27cc), X(0x607fe8a6), X(0x60b38180), X(0x60e6f22f), X(0x611a3a89), X(0x614d5a62), X(0x61805190), X(0x61b31fe9), X(0x61e5c545), X(0x62184179), X(0x624a945d), X(0x627cbdca), X(0x62aebd98), X(0x62e0939f), X(0x63123fba), X(0x6343c1c1), X(0x6375198f), X(0x63a646ff), X(0x63d749ec), X(0x64082232), X(0x6438cfad), X(0x64695238), X(0x6499a9b3), X(0x64c9d5f9), X(0x64f9d6ea), X(0x6529ac63), X(0x65595643), X(0x6588d46a), X(0x65b826b8), X(0x65e74d0e), X(0x6616474b), X(0x66451552), X(0x6673b704), X(0x66a22c44), X(0x66d074f4), X(0x66fe90f8), X(0x672c8033), X(0x675a428a), X(0x6787d7e1), X(0x67b5401f), X(0x67e27b27), X(0x680f88e1), X(0x683c6934), X(0x68691c05), X(0x6895a13e), X(0x68c1f8c7), X(0x68ee2287), X(0x691a1e68), X(0x6945ec54), X(0x69718c35), X(0x699cfdf5), X(0x69c8417f), X(0x69f356c0), X(0x6a1e3da3), X(0x6a48f615), X(0x6a738002), X(0x6a9ddb5a), X(0x6ac80808), X(0x6af205fd), X(0x6b1bd526), X(0x6b457575), X(0x6b6ee6d8), X(0x6b982940), X(0x6bc13c9f), X(0x6bea20e5), X(0x6c12d605), X(0x6c3b5bf1), X(0x6c63b29c), X(0x6c8bd9fb), X(0x6cb3d200), X(0x6cdb9aa0), X(0x6d0333d0), X(0x6d2a9d86), X(0x6d51d7b7), X(0x6d78e25a), X(0x6d9fbd67), X(0x6dc668d3), X(0x6dece498), X(0x6e1330ad), X(0x6e394d0c), X(0x6e5f39ae), X(0x6e84f68d), X(0x6eaa83a2), X(0x6ecfe0ea), X(0x6ef50e5e), X(0x6f1a0bfc), X(0x6f3ed9bf), X(0x6f6377a4), X(0x6f87e5a8), X(0x6fac23c9), X(0x6fd03206), X(0x6ff4105c), X(0x7017becc), X(0x703b3d54), X(0x705e8bf5), X(0x7081aaaf), X(0x70a49984), X(0x70c75874), X(0x70e9e783), X(0x710c46b2), X(0x712e7605), X(0x7150757f), X(0x71724523), X(0x7193e4f6), X(0x71b554fd), X(0x71d6953e), X(0x71f7a5bd), X(0x72188681), X(0x72393792), X(0x7259b8f5), X(0x727a0ab2), X(0x729a2cd2), X(0x72ba1f5d), X(0x72d9e25c), X(0x72f975d8), X(0x7318d9db), X(0x73380e6f), X(0x735713a0), X(0x7375e978), X(0x73949003), X(0x73b3074c), X(0x73d14f61), X(0x73ef684f), X(0x740d5222), X(0x742b0ce9), X(0x744898b1), X(0x7465f589), X(0x74832381), X(0x74a022a8), X(0x74bcf30e), X(0x74d994c3), X(0x74f607d8), X(0x75124c5f), X(0x752e6268), X(0x754a4a05), X(0x7566034b), X(0x75818e4a), X(0x759ceb16), X(0x75b819c4), X(0x75d31a66), X(0x75eded12), X(0x760891dc), X(0x762308da), X(0x763d5221), X(0x76576dc8), X(0x76715be4), X(0x768b1c8c), X(0x76a4afd9), X(0x76be15e0), X(0x76d74ebb), X(0x76f05a82), X(0x7709394d), X(0x7721eb35), X(0x773a7054), X(0x7752c8c4), X(0x776af49f), X(0x7782f400), X(0x779ac701), X(0x77b26dbd), X(0x77c9e851), X(0x77e136d8), X(0x77f8596f), X(0x780f5032), X(0x78261b3f), X(0x783cbab2), X(0x78532eaa), X(0x78697745), X(0x787f94a0), X(0x789586db), X(0x78ab4e15), X(0x78c0ea6d), X(0x78d65c03), X(0x78eba2f7), X(0x7900bf68), X(0x7915b179), X(0x792a7949), X(0x793f16fb), X(0x79538aaf), X(0x7967d488), X(0x797bf4a8), X(0x798feb31), X(0x79a3b846), X(0x79b75c0a), X(0x79cad6a1), X(0x79de282e), X(0x79f150d5), X(0x7a0450bb), X(0x7a172803), X(0x7a29d6d3), X(0x7a3c5d50), X(0x7a4ebb9f), X(0x7a60f1e6), X(0x7a73004a), X(0x7a84e6f2), X(0x7a96a604), X(0x7aa83da7), X(0x7ab9ae01), X(0x7acaf73a), X(0x7adc1979), X(0x7aed14e6), X(0x7afde9a8), X(0x7b0e97e8), X(0x7b1f1fcd), X(0x7b2f8182), X(0x7b3fbd2d), X(0x7b4fd2f9), X(0x7b5fc30f), X(0x7b6f8d98), X(0x7b7f32bd), X(0x7b8eb2a9), X(0x7b9e0d85), X(0x7bad437d), X(0x7bbc54b9), X(0x7bcb4166), X(0x7bda09ae), X(0x7be8adbc), X(0x7bf72dbc), X(0x7c0589d8), X(0x7c13c23d), X(0x7c21d716), X(0x7c2fc88f), X(0x7c3d96d5), X(0x7c4b4214), X(0x7c58ca78), X(0x7c66302d), X(0x7c737362), X(0x7c809443), X(0x7c8d92fc), X(0x7c9a6fbc), X(0x7ca72aaf), X(0x7cb3c404), X(0x7cc03be8), X(0x7ccc9288), X(0x7cd8c814), X(0x7ce4dcb9), X(0x7cf0d0a5), X(0x7cfca406), X(0x7d08570c), X(0x7d13e9e5), X(0x7d1f5cbf), X(0x7d2aafca), X(0x7d35e335), X(0x7d40f72e), X(0x7d4bebe4), X(0x7d56c188), X(0x7d617848), X(0x7d6c1054), X(0x7d7689db), X(0x7d80e50e), X(0x7d8b221b), X(0x7d954133), X(0x7d9f4286), X(0x7da92643), X(0x7db2ec9b), X(0x7dbc95bd), X(0x7dc621da), X(0x7dcf9123), X(0x7dd8e3c6), X(0x7de219f6), X(0x7deb33e2), X(0x7df431ba), X(0x7dfd13af), X(0x7e05d9f2), X(0x7e0e84b4), X(0x7e171424), X(0x7e1f8874), X(0x7e27e1d4), X(0x7e302074), X(0x7e384487), X(0x7e404e3c), X(0x7e483dc4), X(0x7e501350), X(0x7e57cf11), X(0x7e5f7138), X(0x7e66f9f4), X(0x7e6e6979), X(0x7e75bff5), X(0x7e7cfd9a), X(0x7e842298), X(0x7e8b2f22), X(0x7e922366), X(0x7e98ff97), X(0x7e9fc3e4), X(0x7ea6707f), X(0x7ead0598), X(0x7eb38360), X(0x7eb9ea07), X(0x7ec039bf), X(0x7ec672b7), X(0x7ecc9521), X(0x7ed2a12c), X(0x7ed8970a), X(0x7ede76ea), X(0x7ee440fd), X(0x7ee9f573), X(0x7eef947d), X(0x7ef51e4b), X(0x7efa930d), X(0x7efff2f2), X(0x7f053e2b), X(0x7f0a74e8), X(0x7f0f9758), X(0x7f14a5ac), X(0x7f19a013), X(0x7f1e86bc), X(0x7f2359d8), X(0x7f281995), X(0x7f2cc623), X(0x7f315fb1), X(0x7f35e66e), X(0x7f3a5a8a), X(0x7f3ebc33), X(0x7f430b98), X(0x7f4748e7), X(0x7f4b7450), X(0x7f4f8e01), X(0x7f539629), X(0x7f578cf5), X(0x7f5b7293), X(0x7f5f4732), X(0x7f630b00), X(0x7f66be2b), X(0x7f6a60df), X(0x7f6df34b), X(0x7f71759b), X(0x7f74e7fe), X(0x7f784aa0), X(0x7f7b9daf), X(0x7f7ee156), X(0x7f8215c3), X(0x7f853b22), X(0x7f88519f), X(0x7f8b5967), X(0x7f8e52a6), X(0x7f913d87), X(0x7f941a36), X(0x7f96e8df), X(0x7f99a9ad), X(0x7f9c5ccb), X(0x7f9f0265), X(0x7fa19aa5), X(0x7fa425b5), X(0x7fa6a3c1), X(0x7fa914f3), X(0x7fab7974), X(0x7fadd16f), X(0x7fb01d0d), X(0x7fb25c78), X(0x7fb48fd9), X(0x7fb6b75a), X(0x7fb8d323), X(0x7fbae35d), X(0x7fbce831), X(0x7fbee1c7), X(0x7fc0d047), X(0x7fc2b3d9), X(0x7fc48ca5), X(0x7fc65ad3), X(0x7fc81e88), X(0x7fc9d7ee), X(0x7fcb872a), X(0x7fcd2c63), X(0x7fcec7bf), X(0x7fd05966), X(0x7fd1e17c), X(0x7fd36027), X(0x7fd4d58d), X(0x7fd641d3), X(0x7fd7a51e), X(0x7fd8ff94), X(0x7fda5157), X(0x7fdb9a8e), X(0x7fdcdb5b), X(0x7fde13e2), X(0x7fdf4448), X(0x7fe06caf), X(0x7fe18d3b), X(0x7fe2a60e), X(0x7fe3b74b), X(0x7fe4c114), X(0x7fe5c38b), X(0x7fe6bed2), X(0x7fe7b30a), X(0x7fe8a055), X(0x7fe986d4), X(0x7fea66a7), X(0x7feb3ff0), X(0x7fec12cd), X(0x7fecdf5f), X(0x7feda5c5), X(0x7fee6620), X(0x7fef208d), X(0x7fefd52c), X(0x7ff0841c), X(0x7ff12d7a), X(0x7ff1d164), X(0x7ff26ff9), X(0x7ff30955), X(0x7ff39d96), X(0x7ff42cd9), X(0x7ff4b739), X(0x7ff53cd4), X(0x7ff5bdc5), X(0x7ff63a28), X(0x7ff6b217), X(0x7ff725af), X(0x7ff7950a), X(0x7ff80043), X(0x7ff86773), X(0x7ff8cab4), X(0x7ff92a21), X(0x7ff985d1), X(0x7ff9dddf), X(0x7ffa3262), X(0x7ffa8374), X(0x7ffad12c), X(0x7ffb1ba1), X(0x7ffb62ec), X(0x7ffba723), X(0x7ffbe85c), X(0x7ffc26b0), X(0x7ffc6233), X(0x7ffc9afb), X(0x7ffcd11e), X(0x7ffd04b1), X(0x7ffd35c9), X(0x7ffd647b), X(0x7ffd90da), X(0x7ffdbafa), X(0x7ffde2f0), X(0x7ffe08ce), X(0x7ffe2ca7), X(0x7ffe4e8e), X(0x7ffe6e95), X(0x7ffe8cce), X(0x7ffea94a), X(0x7ffec41b), X(0x7ffedd52), X(0x7ffef4ff), X(0x7fff0b33), X(0x7fff1ffd), X(0x7fff336e), X(0x7fff4593), X(0x7fff567d), X(0x7fff663a), X(0x7fff74d8), X(0x7fff8265), X(0x7fff8eee), X(0x7fff9a81), X(0x7fffa52b), X(0x7fffaef8), X(0x7fffb7f5), X(0x7fffc02d), X(0x7fffc7ab), X(0x7fffce7c), X(0x7fffd4a9), X(0x7fffda3e), X(0x7fffdf44), X(0x7fffe3c6), X(0x7fffe7cc), X(0x7fffeb60), X(0x7fffee8a), X(0x7ffff153), X(0x7ffff3c4), X(0x7ffff5e3), X(0x7ffff7b8), X(0x7ffff94b), X(0x7ffffaa1), X(0x7ffffbc1), X(0x7ffffcb2), X(0x7ffffd78), X(0x7ffffe19), X(0x7ffffe9a), X(0x7ffffeff), X(0x7fffff4e), X(0x7fffff89), X(0x7fffffb3), X(0x7fffffd2), X(0x7fffffe6), X(0x7ffffff3), X(0x7ffffffa), X(0x7ffffffe), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), }; static LOOKUP_T vwin4096[2048] = { X(0x000001f0), X(0x00001171), X(0x00003072), X(0x00005ef5), X(0x00009cf8), X(0x0000ea7c), X(0x00014780), X(0x0001b405), X(0x0002300b), X(0x0002bb91), X(0x00035698), X(0x0004011e), X(0x0004bb25), X(0x000584ac), X(0x00065db3), X(0x0007463a), X(0x00083e41), X(0x000945c7), X(0x000a5ccc), X(0x000b8350), X(0x000cb954), X(0x000dfed7), X(0x000f53d8), X(0x0010b857), X(0x00122c55), X(0x0013afd1), X(0x001542ca), X(0x0016e541), X(0x00189735), X(0x001a58a7), X(0x001c2995), X(0x001e09ff), X(0x001ff9e6), X(0x0021f948), X(0x00240826), X(0x00262680), X(0x00285454), X(0x002a91a3), X(0x002cde6c), X(0x002f3aaf), X(0x0031a66b), X(0x003421a0), X(0x0036ac4f), X(0x00394675), X(0x003bf014), X(0x003ea92a), X(0x004171b7), X(0x004449bb), X(0x00473135), X(0x004a2824), X(0x004d2e8a), X(0x00504463), X(0x005369b2), X(0x00569e74), X(0x0059e2aa), X(0x005d3652), X(0x0060996d), X(0x00640bf9), X(0x00678df7), X(0x006b1f66), X(0x006ec045), X(0x00727093), X(0x00763051), X(0x0079ff7d), X(0x007dde16), X(0x0081cc1d), X(0x0085c991), X(0x0089d671), X(0x008df2bc), X(0x00921e71), X(0x00965991), X(0x009aa41a), X(0x009efe0c), X(0x00a36766), X(0x00a7e028), X(0x00ac6850), X(0x00b0ffde), X(0x00b5a6d1), X(0x00ba5d28), X(0x00bf22e4), X(0x00c3f802), X(0x00c8dc83), X(0x00cdd065), X(0x00d2d3a8), X(0x00d7e64a), X(0x00dd084c), X(0x00e239ac), X(0x00e77a69), X(0x00ecca83), X(0x00f229f9), X(0x00f798ca), X(0x00fd16f5), X(0x0102a479), X(0x01084155), X(0x010ded89), X(0x0113a913), X(0x011973f3), X(0x011f4e27), X(0x012537af), X(0x012b308a), X(0x013138b7), X(0x01375035), X(0x013d7702), X(0x0143ad1f), X(0x0149f289), X(0x01504741), X(0x0156ab44), X(0x015d1e92), X(0x0163a12a), X(0x016a330b), X(0x0170d433), X(0x017784a3), X(0x017e4458), X(0x01851351), X(0x018bf18e), X(0x0192df0d), X(0x0199dbcd), X(0x01a0e7cd), X(0x01a8030c), X(0x01af2d89), X(0x01b66743), X(0x01bdb038), X(0x01c50867), X(0x01cc6fd0), X(0x01d3e670), X(0x01db6c47), X(0x01e30153), X(0x01eaa593), X(0x01f25907), X(0x01fa1bac), X(0x0201ed81), X(0x0209ce86), X(0x0211beb8), X(0x0219be17), X(0x0221cca2), X(0x0229ea56), X(0x02321733), X(0x023a5337), X(0x02429e60), X(0x024af8af), X(0x02536220), X(0x025bdab3), X(0x02646267), X(0x026cf93a), X(0x02759f2a), X(0x027e5436), X(0x0287185d), X(0x028feb9d), X(0x0298cdf4), X(0x02a1bf62), X(0x02aabfe5), X(0x02b3cf7b), X(0x02bcee23), X(0x02c61bdb), X(0x02cf58a2), X(0x02d8a475), X(0x02e1ff55), X(0x02eb693e), X(0x02f4e230), X(0x02fe6a29), X(0x03080127), X(0x0311a729), X(0x031b5c2d), X(0x03252031), X(0x032ef334), X(0x0338d534), X(0x0342c630), X(0x034cc625), X(0x0356d512), X(0x0360f2f6), X(0x036b1fce), X(0x03755b99), X(0x037fa655), X(0x038a0001), X(0x0394689a), X(0x039ee020), X(0x03a9668f), X(0x03b3fbe6), X(0x03bea024), X(0x03c95347), X(0x03d4154d), X(0x03dee633), X(0x03e9c5f9), X(0x03f4b49b), X(0x03ffb219), X(0x040abe71), X(0x0415d9a0), X(0x042103a5), X(0x042c3c7d), X(0x04378428), X(0x0442daa2), X(0x044e3fea), X(0x0459b3fd), X(0x046536db), X(0x0470c880), X(0x047c68eb), X(0x0488181a), X(0x0493d60b), X(0x049fa2bc), X(0x04ab7e2a), X(0x04b76854), X(0x04c36137), X(0x04cf68d1), X(0x04db7f21), X(0x04e7a424), X(0x04f3d7d8), X(0x05001a3b), X(0x050c6b4a), X(0x0518cb04), X(0x05253966), X(0x0531b66e), X(0x053e421a), X(0x054adc68), X(0x05578555), X(0x05643cdf), X(0x05710304), X(0x057dd7c1), X(0x058abb15), X(0x0597acfd), X(0x05a4ad76), X(0x05b1bc7f), X(0x05beda14), X(0x05cc0635), X(0x05d940dd), X(0x05e68a0b), X(0x05f3e1bd), X(0x060147f0), X(0x060ebca1), X(0x061c3fcf), X(0x0629d176), X(0x06377194), X(0x06452027), X(0x0652dd2c), X(0x0660a8a2), X(0x066e8284), X(0x067c6ad1), X(0x068a6186), X(0x069866a1), X(0x06a67a1e), X(0x06b49bfc), X(0x06c2cc38), X(0x06d10acf), X(0x06df57bf), X(0x06edb304), X(0x06fc1c9d), X(0x070a9487), X(0x07191abe), X(0x0727af40), X(0x0736520b), X(0x0745031c), X(0x0753c270), X(0x07629004), X(0x07716bd6), X(0x078055e2), X(0x078f4e26), X(0x079e549f), X(0x07ad694b), X(0x07bc8c26), X(0x07cbbd2e), X(0x07dafc5f), X(0x07ea49b7), X(0x07f9a533), X(0x08090ed1), X(0x0818868c), X(0x08280c62), X(0x0837a051), X(0x08474255), X(0x0856f26b), X(0x0866b091), X(0x08767cc3), X(0x088656fe), X(0x08963f3f), X(0x08a63584), X(0x08b639c8), X(0x08c64c0a), X(0x08d66c45), X(0x08e69a77), X(0x08f6d69d), X(0x090720b3), X(0x091778b7), X(0x0927dea5), X(0x0938527a), X(0x0948d433), X(0x095963cc), X(0x096a0143), X(0x097aac94), X(0x098b65bb), X(0x099c2cb6), X(0x09ad0182), X(0x09bde41a), X(0x09ced47d), X(0x09dfd2a5), X(0x09f0de90), X(0x0a01f83b), X(0x0a131fa3), X(0x0a2454c3), X(0x0a359798), X(0x0a46e820), X(0x0a584656), X(0x0a69b237), X(0x0a7b2bc0), X(0x0a8cb2ec), X(0x0a9e47ba), X(0x0aafea24), X(0x0ac19a29), X(0x0ad357c3), X(0x0ae522ef), X(0x0af6fbab), X(0x0b08e1f1), X(0x0b1ad5c0), X(0x0b2cd712), X(0x0b3ee5e5), X(0x0b510234), X(0x0b632bfd), X(0x0b75633b), X(0x0b87a7eb), X(0x0b99fa08), X(0x0bac5990), X(0x0bbec67e), X(0x0bd140cf), X(0x0be3c87e), X(0x0bf65d89), X(0x0c08ffeb), X(0x0c1bafa1), X(0x0c2e6ca6), X(0x0c4136f6), X(0x0c540e8f), X(0x0c66f36c), X(0x0c79e588), X(0x0c8ce4e1), X(0x0c9ff172), X(0x0cb30b37), X(0x0cc6322c), X(0x0cd9664d), X(0x0ceca797), X(0x0cfff605), X(0x0d135193), X(0x0d26ba3d), X(0x0d3a2fff), X(0x0d4db2d5), X(0x0d6142ba), X(0x0d74dfac), X(0x0d8889a5), X(0x0d9c40a1), X(0x0db0049d), X(0x0dc3d593), X(0x0dd7b380), X(0x0deb9e60), X(0x0dff962f), X(0x0e139ae7), X(0x0e27ac85), X(0x0e3bcb05), X(0x0e4ff662), X(0x0e642e98), X(0x0e7873a2), X(0x0e8cc57d), X(0x0ea12423), X(0x0eb58f91), X(0x0eca07c2), X(0x0ede8cb1), X(0x0ef31e5b), X(0x0f07bcba), X(0x0f1c67cb), X(0x0f311f88), X(0x0f45e3ee), X(0x0f5ab4f7), X(0x0f6f92a0), X(0x0f847ce3), X(0x0f9973bc), X(0x0fae7726), X(0x0fc3871e), X(0x0fd8a39d), X(0x0fedcca1), X(0x10030223), X(0x1018441f), X(0x102d9291), X(0x1042ed74), X(0x105854c3), X(0x106dc879), X(0x10834892), X(0x1098d508), X(0x10ae6dd8), X(0x10c412fc), X(0x10d9c46f), X(0x10ef822d), X(0x11054c30), X(0x111b2274), X(0x113104f5), X(0x1146f3ac), X(0x115cee95), X(0x1172f5ab), X(0x118908e9), X(0x119f284a), X(0x11b553ca), X(0x11cb8b62), X(0x11e1cf0f), X(0x11f81ecb), X(0x120e7a90), X(0x1224e25a), X(0x123b5624), X(0x1251d5e9), X(0x126861a3), X(0x127ef94e), X(0x12959ce3), X(0x12ac4c5f), X(0x12c307bb), X(0x12d9cef2), X(0x12f0a200), X(0x130780df), X(0x131e6b8a), X(0x133561fa), X(0x134c642c), X(0x1363721a), X(0x137a8bbe), X(0x1391b113), X(0x13a8e214), X(0x13c01eba), X(0x13d76702), X(0x13eebae5), X(0x14061a5e), X(0x141d8567), X(0x1434fbfb), X(0x144c7e14), X(0x14640bae), X(0x147ba4c1), X(0x14934949), X(0x14aaf941), X(0x14c2b4a2), X(0x14da7b67), X(0x14f24d8a), X(0x150a2b06), X(0x152213d5), X(0x153a07f1), X(0x15520755), X(0x156a11fb), X(0x158227dd), X(0x159a48f5), X(0x15b2753d), X(0x15caacb1), X(0x15e2ef49), X(0x15fb3d01), X(0x161395d2), X(0x162bf9b6), X(0x164468a8), X(0x165ce2a1), X(0x1675679c), X(0x168df793), X(0x16a69280), X(0x16bf385c), X(0x16d7e922), X(0x16f0a4cc), X(0x17096b54), X(0x17223cb4), X(0x173b18e5), X(0x1753ffe2), X(0x176cf1a5), X(0x1785ee27), X(0x179ef562), X(0x17b80750), X(0x17d123eb), X(0x17ea4b2d), X(0x18037d10), X(0x181cb98d), X(0x1836009e), X(0x184f523c), X(0x1868ae63), X(0x1882150a), X(0x189b862c), X(0x18b501c4), X(0x18ce87c9), X(0x18e81836), X(0x1901b305), X(0x191b582f), X(0x193507ad), X(0x194ec17a), X(0x1968858f), X(0x198253e5), X(0x199c2c75), X(0x19b60f3a), X(0x19cffc2d), X(0x19e9f347), X(0x1a03f482), X(0x1a1dffd7), X(0x1a381540), X(0x1a5234b5), X(0x1a6c5e31), X(0x1a8691ac), X(0x1aa0cf21), X(0x1abb1687), X(0x1ad567da), X(0x1aefc311), X(0x1b0a2826), X(0x1b249712), X(0x1b3f0fd0), X(0x1b599257), X(0x1b741ea1), X(0x1b8eb4a7), X(0x1ba95462), X(0x1bc3fdcd), X(0x1bdeb0de), X(0x1bf96d91), X(0x1c1433dd), X(0x1c2f03bc), X(0x1c49dd27), X(0x1c64c017), X(0x1c7fac85), X(0x1c9aa269), X(0x1cb5a1be), X(0x1cd0aa7c), X(0x1cebbc9c), X(0x1d06d816), X(0x1d21fce4), X(0x1d3d2aff), X(0x1d586260), X(0x1d73a2fe), X(0x1d8eecd4), X(0x1daa3fda), X(0x1dc59c09), X(0x1de1015a), X(0x1dfc6fc5), X(0x1e17e743), X(0x1e3367cd), X(0x1e4ef15b), X(0x1e6a83e7), X(0x1e861f6a), X(0x1ea1c3da), X(0x1ebd7133), X(0x1ed9276b), X(0x1ef4e67c), X(0x1f10ae5e), X(0x1f2c7f0a), X(0x1f485879), X(0x1f643aa2), X(0x1f80257f), X(0x1f9c1908), X(0x1fb81536), X(0x1fd41a00), X(0x1ff02761), X(0x200c3d4f), X(0x20285bc3), X(0x204482b7), X(0x2060b221), X(0x207ce9fb), X(0x20992a3e), X(0x20b572e0), X(0x20d1c3dc), X(0x20ee1d28), X(0x210a7ebe), X(0x2126e895), X(0x21435aa6), X(0x215fd4ea), X(0x217c5757), X(0x2198e1e8), X(0x21b57493), X(0x21d20f51), X(0x21eeb21b), X(0x220b5ce7), X(0x22280fb0), X(0x2244ca6c), X(0x22618d13), X(0x227e579f), X(0x229b2a06), X(0x22b80442), X(0x22d4e649), X(0x22f1d015), X(0x230ec19d), X(0x232bbad9), X(0x2348bbc1), X(0x2365c44c), X(0x2382d474), X(0x239fec30), X(0x23bd0b78), X(0x23da3244), X(0x23f7608b), X(0x24149646), X(0x2431d36c), X(0x244f17f5), X(0x246c63da), X(0x2489b711), X(0x24a71193), X(0x24c47358), X(0x24e1dc57), X(0x24ff4c88), X(0x251cc3e2), X(0x253a425e), X(0x2557c7f4), X(0x2575549a), X(0x2592e848), X(0x25b082f7), X(0x25ce249e), X(0x25ebcd34), X(0x26097cb2), X(0x2627330e), X(0x2644f040), X(0x2662b441), X(0x26807f07), X(0x269e5089), X(0x26bc28c1), X(0x26da07a4), X(0x26f7ed2b), X(0x2715d94d), X(0x2733cc02), X(0x2751c540), X(0x276fc500), X(0x278dcb39), X(0x27abd7e2), X(0x27c9eaf3), X(0x27e80463), X(0x28062429), X(0x28244a3e), X(0x28427697), X(0x2860a92d), X(0x287ee1f7), X(0x289d20eb), X(0x28bb6603), X(0x28d9b134), X(0x28f80275), X(0x291659c0), X(0x2934b709), X(0x29531a49), X(0x29718378), X(0x298ff28b), X(0x29ae677b), X(0x29cce23e), X(0x29eb62cb), X(0x2a09e91b), X(0x2a287523), X(0x2a4706dc), X(0x2a659e3c), X(0x2a843b39), X(0x2aa2ddcd), X(0x2ac185ec), X(0x2ae0338f), X(0x2afee6ad), X(0x2b1d9f3c), X(0x2b3c5d33), X(0x2b5b208b), X(0x2b79e939), X(0x2b98b734), X(0x2bb78a74), X(0x2bd662ef), X(0x2bf5409d), X(0x2c142374), X(0x2c330b6b), X(0x2c51f87a), X(0x2c70ea97), X(0x2c8fe1b9), X(0x2caeddd6), X(0x2ccddee7), X(0x2cece4e1), X(0x2d0befbb), X(0x2d2aff6d), X(0x2d4a13ec), X(0x2d692d31), X(0x2d884b32), X(0x2da76de4), X(0x2dc69540), X(0x2de5c13d), X(0x2e04f1d0), X(0x2e2426f0), X(0x2e436095), X(0x2e629eb4), X(0x2e81e146), X(0x2ea1283f), X(0x2ec07398), X(0x2edfc347), X(0x2eff1742), X(0x2f1e6f80), X(0x2f3dcbf8), X(0x2f5d2ca0), X(0x2f7c916f), X(0x2f9bfa5c), X(0x2fbb675d), X(0x2fdad869), X(0x2ffa4d76), X(0x3019c67b), X(0x3039436f), X(0x3058c448), X(0x307848fc), X(0x3097d183), X(0x30b75dd3), X(0x30d6ede2), X(0x30f681a6), X(0x31161917), X(0x3135b42b), X(0x315552d8), X(0x3174f514), X(0x31949ad7), X(0x31b44417), X(0x31d3f0ca), X(0x31f3a0e6), X(0x32135462), X(0x32330b35), X(0x3252c555), X(0x327282b7), X(0x32924354), X(0x32b20720), X(0x32d1ce13), X(0x32f19823), X(0x33116546), X(0x33313573), X(0x3351089f), X(0x3370dec2), X(0x3390b7d1), X(0x33b093c3), X(0x33d0728f), X(0x33f05429), X(0x3410388a), X(0x34301fa7), X(0x34500977), X(0x346ff5ef), X(0x348fe506), X(0x34afd6b3), X(0x34cfcaeb), X(0x34efc1a5), X(0x350fbad7), X(0x352fb678), X(0x354fb47d), X(0x356fb4dd), X(0x358fb78e), X(0x35afbc86), X(0x35cfc3bc), X(0x35efcd25), X(0x360fd8b8), X(0x362fe66c), X(0x364ff636), X(0x3670080c), X(0x36901be5), X(0x36b031b7), X(0x36d04978), X(0x36f0631e), X(0x37107ea0), X(0x37309bf3), X(0x3750bb0e), X(0x3770dbe6), X(0x3790fe73), X(0x37b122aa), X(0x37d14881), X(0x37f16fee), X(0x381198e8), X(0x3831c365), X(0x3851ef5a), X(0x38721cbe), X(0x38924b87), X(0x38b27bac), X(0x38d2ad21), X(0x38f2dfde), X(0x391313d8), X(0x39334906), X(0x39537f5d), X(0x3973b6d4), X(0x3993ef60), X(0x39b428f9), X(0x39d46393), X(0x39f49f25), X(0x3a14dba6), X(0x3a35190a), X(0x3a555748), X(0x3a759657), X(0x3a95d62c), X(0x3ab616be), X(0x3ad65801), X(0x3af699ed), X(0x3b16dc78), X(0x3b371f97), X(0x3b576341), X(0x3b77a76c), X(0x3b97ec0d), X(0x3bb8311b), X(0x3bd8768b), X(0x3bf8bc55), X(0x3c19026d), X(0x3c3948ca), X(0x3c598f62), X(0x3c79d62b), X(0x3c9a1d1b), X(0x3cba6428), X(0x3cdaab48), X(0x3cfaf271), X(0x3d1b3999), X(0x3d3b80b6), X(0x3d5bc7be), X(0x3d7c0ea8), X(0x3d9c5569), X(0x3dbc9bf7), X(0x3ddce248), X(0x3dfd2852), X(0x3e1d6e0c), X(0x3e3db36c), X(0x3e5df866), X(0x3e7e3cf2), X(0x3e9e8106), X(0x3ebec497), X(0x3edf079b), X(0x3eff4a09), X(0x3f1f8bd7), X(0x3f3fccfa), X(0x3f600d69), X(0x3f804d1a), X(0x3fa08c02), X(0x3fc0ca19), X(0x3fe10753), X(0x400143a7), X(0x40217f0a), X(0x4041b974), X(0x4061f2da), X(0x40822b32), X(0x40a26272), X(0x40c29891), X(0x40e2cd83), X(0x41030140), X(0x412333bd), X(0x414364f1), X(0x416394d2), X(0x4183c355), X(0x41a3f070), X(0x41c41c1b), X(0x41e4464a), X(0x42046ef4), X(0x42249610), X(0x4244bb92), X(0x4264df72), X(0x428501a5), X(0x42a52222), X(0x42c540de), X(0x42e55dd0), X(0x430578ed), X(0x4325922d), X(0x4345a985), X(0x4365beeb), X(0x4385d255), X(0x43a5e3ba), X(0x43c5f30f), X(0x43e6004b), X(0x44060b65), X(0x44261451), X(0x44461b07), X(0x44661f7c), X(0x448621a7), X(0x44a6217d), X(0x44c61ef6), X(0x44e61a07), X(0x450612a6), X(0x452608ca), X(0x4545fc69), X(0x4565ed79), X(0x4585dbf1), X(0x45a5c7c6), X(0x45c5b0ef), X(0x45e59761), X(0x46057b15), X(0x46255bfe), X(0x46453a15), X(0x4665154f), X(0x4684eda2), X(0x46a4c305), X(0x46c4956e), X(0x46e464d3), X(0x4704312b), X(0x4723fa6c), X(0x4743c08d), X(0x47638382), X(0x47834344), X(0x47a2ffc9), X(0x47c2b906), X(0x47e26ef2), X(0x48022183), X(0x4821d0b1), X(0x48417c71), X(0x486124b9), X(0x4880c981), X(0x48a06abe), X(0x48c00867), X(0x48dfa272), X(0x48ff38d6), X(0x491ecb8a), X(0x493e5a84), X(0x495de5b9), X(0x497d6d22), X(0x499cf0b4), X(0x49bc7066), X(0x49dbec2e), X(0x49fb6402), X(0x4a1ad7db), X(0x4a3a47ad), X(0x4a59b370), X(0x4a791b1a), X(0x4a987ea1), X(0x4ab7ddfd), X(0x4ad73924), X(0x4af6900c), X(0x4b15e2ad), X(0x4b3530fc), X(0x4b547af1), X(0x4b73c082), X(0x4b9301a6), X(0x4bb23e53), X(0x4bd17681), X(0x4bf0aa25), X(0x4c0fd937), X(0x4c2f03ae), X(0x4c4e297f), X(0x4c6d4aa3), X(0x4c8c670f), X(0x4cab7eba), X(0x4cca919c), X(0x4ce99fab), X(0x4d08a8de), X(0x4d27ad2c), X(0x4d46ac8b), X(0x4d65a6f3), X(0x4d849c5a), X(0x4da38cb7), X(0x4dc27802), X(0x4de15e31), X(0x4e003f3a), X(0x4e1f1b16), X(0x4e3df1ba), X(0x4e5cc31e), X(0x4e7b8f3a), X(0x4e9a5603), X(0x4eb91771), X(0x4ed7d37b), X(0x4ef68a18), X(0x4f153b3f), X(0x4f33e6e7), X(0x4f528d08), X(0x4f712d97), X(0x4f8fc88e), X(0x4fae5de1), X(0x4fcced8a), X(0x4feb777f), X(0x5009fbb6), X(0x50287a28), X(0x5046f2cc), X(0x50656598), X(0x5083d284), X(0x50a23988), X(0x50c09a9a), X(0x50def5b1), X(0x50fd4ac7), X(0x511b99d0), X(0x5139e2c5), X(0x5158259e), X(0x51766251), X(0x519498d6), X(0x51b2c925), X(0x51d0f334), X(0x51ef16fb), X(0x520d3473), X(0x522b4b91), X(0x52495c4e), X(0x526766a2), X(0x52856a83), X(0x52a367e9), X(0x52c15ecd), X(0x52df4f24), X(0x52fd38e8), X(0x531b1c10), X(0x5338f892), X(0x5356ce68), X(0x53749d89), X(0x539265eb), X(0x53b02788), X(0x53cde257), X(0x53eb964f), X(0x54094369), X(0x5426e99c), X(0x544488df), X(0x5462212c), X(0x547fb279), X(0x549d3cbe), X(0x54babff4), X(0x54d83c12), X(0x54f5b110), X(0x55131ee7), X(0x5530858d), X(0x554de4fc), X(0x556b3d2a), X(0x55888e11), X(0x55a5d7a8), X(0x55c319e7), X(0x55e054c7), X(0x55fd883f), X(0x561ab447), X(0x5637d8d8), X(0x5654f5ea), X(0x56720b75), X(0x568f1971), X(0x56ac1fd7), X(0x56c91e9e), X(0x56e615c0), X(0x57030534), X(0x571fecf2), X(0x573cccf3), X(0x5759a530), X(0x577675a0), X(0x57933e3c), X(0x57affefd), X(0x57ccb7db), X(0x57e968ce), X(0x580611cf), X(0x5822b2d6), X(0x583f4bdd), X(0x585bdcdb), X(0x587865c9), X(0x5894e69f), X(0x58b15f57), X(0x58cdcfe9), X(0x58ea384e), X(0x5906987d), X(0x5922f071), X(0x593f4022), X(0x595b8788), X(0x5977c69c), X(0x5993fd57), X(0x59b02bb2), X(0x59cc51a6), X(0x59e86f2c), X(0x5a04843c), X(0x5a2090d0), X(0x5a3c94e0), X(0x5a589065), X(0x5a748359), X(0x5a906db4), X(0x5aac4f70), X(0x5ac82884), X(0x5ae3f8ec), X(0x5affc09f), X(0x5b1b7f97), X(0x5b3735cd), X(0x5b52e33a), X(0x5b6e87d8), X(0x5b8a239f), X(0x5ba5b689), X(0x5bc1408f), X(0x5bdcc1aa), X(0x5bf839d5), X(0x5c13a907), X(0x5c2f0f3b), X(0x5c4a6c6a), X(0x5c65c08d), X(0x5c810b9e), X(0x5c9c4d97), X(0x5cb78670), X(0x5cd2b623), X(0x5ceddcaa), X(0x5d08f9ff), X(0x5d240e1b), X(0x5d3f18f8), X(0x5d5a1a8f), X(0x5d7512da), X(0x5d9001d3), X(0x5daae773), X(0x5dc5c3b5), X(0x5de09692), X(0x5dfb6004), X(0x5e162004), X(0x5e30d68d), X(0x5e4b8399), X(0x5e662721), X(0x5e80c11f), X(0x5e9b518e), X(0x5eb5d867), X(0x5ed055a4), X(0x5eeac940), X(0x5f053334), X(0x5f1f937b), X(0x5f39ea0f), X(0x5f5436ea), X(0x5f6e7a06), X(0x5f88b35d), X(0x5fa2e2e9), X(0x5fbd08a6), X(0x5fd7248d), X(0x5ff13698), X(0x600b3ec2), X(0x60253d05), X(0x603f315b), X(0x60591bc0), X(0x6072fc2d), X(0x608cd29e), X(0x60a69f0b), X(0x60c06171), X(0x60da19ca), X(0x60f3c80f), X(0x610d6c3d), X(0x6127064d), X(0x6140963a), X(0x615a1bff), X(0x61739797), X(0x618d08fc), X(0x61a67029), X(0x61bfcd1a), X(0x61d91fc8), X(0x61f2682f), X(0x620ba64a), X(0x6224da13), X(0x623e0386), X(0x6257229d), X(0x62703754), X(0x628941a6), X(0x62a2418e), X(0x62bb3706), X(0x62d4220a), X(0x62ed0296), X(0x6305d8a3), X(0x631ea42f), X(0x63376533), X(0x63501bab), X(0x6368c793), X(0x638168e5), X(0x6399ff9e), X(0x63b28bb8), X(0x63cb0d2f), X(0x63e383ff), X(0x63fbf022), X(0x64145195), X(0x642ca853), X(0x6444f457), X(0x645d359e), X(0x64756c22), X(0x648d97e0), X(0x64a5b8d3), X(0x64bdcef6), X(0x64d5da47), X(0x64eddabf), X(0x6505d05c), X(0x651dbb19), X(0x65359af2), X(0x654d6fe3), X(0x656539e7), X(0x657cf8fb), X(0x6594ad1b), X(0x65ac5643), X(0x65c3f46e), X(0x65db8799), X(0x65f30fc0), X(0x660a8ce0), X(0x6621fef3), X(0x663965f7), X(0x6650c1e7), X(0x666812c1), X(0x667f5880), X(0x66969320), X(0x66adc29e), X(0x66c4e6f7), X(0x66dc0026), X(0x66f30e28), X(0x670a10fa), X(0x67210898), X(0x6737f4ff), X(0x674ed62b), X(0x6765ac19), X(0x677c76c5), X(0x6793362c), X(0x67a9ea4b), X(0x67c0931f), X(0x67d730a3), X(0x67edc2d6), X(0x680449b3), X(0x681ac538), X(0x68313562), X(0x68479a2d), X(0x685df396), X(0x6874419b), X(0x688a8438), X(0x68a0bb6a), X(0x68b6e72e), X(0x68cd0782), X(0x68e31c63), X(0x68f925cd), X(0x690f23be), X(0x69251633), X(0x693afd29), X(0x6950d89e), X(0x6966a88f), X(0x697c6cf8), X(0x699225d9), X(0x69a7d32d), X(0x69bd74f3), X(0x69d30b27), X(0x69e895c8), X(0x69fe14d2), X(0x6a138844), X(0x6a28f01b), X(0x6a3e4c54), X(0x6a539ced), X(0x6a68e1e4), X(0x6a7e1b37), X(0x6a9348e3), X(0x6aa86ae6), X(0x6abd813d), X(0x6ad28be7), X(0x6ae78ae2), X(0x6afc7e2b), X(0x6b1165c0), X(0x6b26419f), X(0x6b3b11c7), X(0x6b4fd634), X(0x6b648ee6), X(0x6b793bda), X(0x6b8ddd0e), X(0x6ba27281), X(0x6bb6fc31), X(0x6bcb7a1b), X(0x6bdfec3e), X(0x6bf45299), X(0x6c08ad29), X(0x6c1cfbed), X(0x6c313ee4), X(0x6c45760a), X(0x6c59a160), X(0x6c6dc0e4), X(0x6c81d493), X(0x6c95dc6d), X(0x6ca9d86f), X(0x6cbdc899), X(0x6cd1acea), X(0x6ce5855f), X(0x6cf951f7), X(0x6d0d12b1), X(0x6d20c78c), X(0x6d347087), X(0x6d480da0), X(0x6d5b9ed6), X(0x6d6f2427), X(0x6d829d94), X(0x6d960b1a), X(0x6da96cb9), X(0x6dbcc270), X(0x6dd00c3c), X(0x6de34a1f), X(0x6df67c16), X(0x6e09a221), X(0x6e1cbc3f), X(0x6e2fca6e), X(0x6e42ccaf), X(0x6e55c300), X(0x6e68ad60), X(0x6e7b8bd0), X(0x6e8e5e4d), X(0x6ea124d8), X(0x6eb3df70), X(0x6ec68e13), X(0x6ed930c3), X(0x6eebc77d), X(0x6efe5242), X(0x6f10d111), X(0x6f2343e9), X(0x6f35aacb), X(0x6f4805b5), X(0x6f5a54a8), X(0x6f6c97a2), X(0x6f7ecea4), X(0x6f90f9ae), X(0x6fa318be), X(0x6fb52bd6), X(0x6fc732f4), X(0x6fd92e19), X(0x6feb1d44), X(0x6ffd0076), X(0x700ed7ad), X(0x7020a2eb), X(0x7032622f), X(0x7044157a), X(0x7055bcca), X(0x70675821), X(0x7078e77e), X(0x708a6ae2), X(0x709be24c), X(0x70ad4dbd), X(0x70bead36), X(0x70d000b5), X(0x70e1483d), X(0x70f283cc), X(0x7103b363), X(0x7114d704), X(0x7125eead), X(0x7136fa60), X(0x7147fa1c), X(0x7158ede4), X(0x7169d5b6), X(0x717ab193), X(0x718b817d), X(0x719c4573), X(0x71acfd76), X(0x71bda988), X(0x71ce49a8), X(0x71deddd7), X(0x71ef6617), X(0x71ffe267), X(0x721052ca), X(0x7220b73e), X(0x72310fc6), X(0x72415c62), X(0x72519d14), X(0x7261d1db), X(0x7271faba), X(0x728217b1), X(0x729228c0), X(0x72a22dea), X(0x72b22730), X(0x72c21491), X(0x72d1f611), X(0x72e1cbaf), X(0x72f1956c), X(0x7301534c), X(0x7311054d), X(0x7320ab72), X(0x733045bc), X(0x733fd42d), X(0x734f56c5), X(0x735ecd86), X(0x736e3872), X(0x737d9789), X(0x738ceacf), X(0x739c3243), X(0x73ab6de7), X(0x73ba9dbe), X(0x73c9c1c8), X(0x73d8da08), X(0x73e7e67f), X(0x73f6e72e), X(0x7405dc17), X(0x7414c53c), X(0x7423a29f), X(0x74327442), X(0x74413a26), X(0x744ff44d), X(0x745ea2b9), X(0x746d456c), X(0x747bdc68), X(0x748a67ae), X(0x7498e741), X(0x74a75b23), X(0x74b5c356), X(0x74c41fdb), X(0x74d270b6), X(0x74e0b5e7), X(0x74eeef71), X(0x74fd1d57), X(0x750b3f9a), X(0x7519563c), X(0x75276140), X(0x753560a8), X(0x75435477), X(0x75513cae), X(0x755f1951), X(0x756cea60), X(0x757aafdf), X(0x758869d1), X(0x75961837), X(0x75a3bb14), X(0x75b1526a), X(0x75bede3c), X(0x75cc5e8d), X(0x75d9d35f), X(0x75e73cb5), X(0x75f49a91), X(0x7601ecf6), X(0x760f33e6), X(0x761c6f65), X(0x76299f74), X(0x7636c417), X(0x7643dd51), X(0x7650eb24), X(0x765ded93), X(0x766ae4a0), X(0x7677d050), X(0x7684b0a4), X(0x7691859f), X(0x769e4f45), X(0x76ab0d98), X(0x76b7c09c), X(0x76c46852), X(0x76d104bf), X(0x76dd95e6), X(0x76ea1bc9), X(0x76f6966b), X(0x770305d0), X(0x770f69fb), X(0x771bc2ef), X(0x772810af), X(0x7734533e), X(0x77408aa0), X(0x774cb6d7), X(0x7758d7e8), X(0x7764edd5), X(0x7770f8a2), X(0x777cf852), X(0x7788ece8), X(0x7794d668), X(0x77a0b4d5), X(0x77ac8833), X(0x77b85085), X(0x77c40dce), X(0x77cfc013), X(0x77db6756), X(0x77e7039b), X(0x77f294e6), X(0x77fe1b3b), X(0x7809969c), X(0x7815070e), X(0x78206c93), X(0x782bc731), X(0x783716ea), X(0x78425bc3), X(0x784d95be), X(0x7858c4e1), X(0x7863e92d), X(0x786f02a8), X(0x787a1156), X(0x78851539), X(0x78900e56), X(0x789afcb1), X(0x78a5e04d), X(0x78b0b92f), X(0x78bb875b), X(0x78c64ad4), X(0x78d1039e), X(0x78dbb1be), X(0x78e65537), X(0x78f0ee0e), X(0x78fb7c46), X(0x7905ffe4), X(0x791078ec), X(0x791ae762), X(0x79254b4a), X(0x792fa4a7), X(0x7939f380), X(0x794437d7), X(0x794e71b0), X(0x7958a111), X(0x7962c5fd), X(0x796ce078), X(0x7976f087), X(0x7980f62f), X(0x798af173), X(0x7994e258), X(0x799ec8e2), X(0x79a8a515), X(0x79b276f7), X(0x79bc3e8b), X(0x79c5fbd6), X(0x79cfaedc), X(0x79d957a2), X(0x79e2f62c), X(0x79ec8a7f), X(0x79f6149f), X(0x79ff9492), X(0x7a090a5a), X(0x7a1275fe), X(0x7a1bd781), X(0x7a252ee9), X(0x7a2e7c39), X(0x7a37bf77), X(0x7a40f8a7), X(0x7a4a27ce), X(0x7a534cf0), X(0x7a5c6813), X(0x7a65793b), X(0x7a6e806d), X(0x7a777dad), X(0x7a807100), X(0x7a895a6b), X(0x7a9239f4), X(0x7a9b0f9e), X(0x7aa3db6f), X(0x7aac9d6b), X(0x7ab55597), X(0x7abe03f9), X(0x7ac6a895), X(0x7acf4370), X(0x7ad7d48f), X(0x7ae05bf6), X(0x7ae8d9ac), X(0x7af14db5), X(0x7af9b815), X(0x7b0218d2), X(0x7b0a6ff2), X(0x7b12bd78), X(0x7b1b016a), X(0x7b233bce), X(0x7b2b6ca7), X(0x7b3393fc), X(0x7b3bb1d1), X(0x7b43c62c), X(0x7b4bd111), X(0x7b53d286), X(0x7b5bca90), X(0x7b63b935), X(0x7b6b9e78), X(0x7b737a61), X(0x7b7b4cf3), X(0x7b831634), X(0x7b8ad629), X(0x7b928cd8), X(0x7b9a3a45), X(0x7ba1de77), X(0x7ba97972), X(0x7bb10b3c), X(0x7bb893d9), X(0x7bc01350), X(0x7bc789a6), X(0x7bcef6e0), X(0x7bd65b03), X(0x7bddb616), X(0x7be5081c), X(0x7bec511c), X(0x7bf3911b), X(0x7bfac81f), X(0x7c01f62c), X(0x7c091b49), X(0x7c10377b), X(0x7c174ac7), X(0x7c1e5532), X(0x7c2556c4), X(0x7c2c4f80), X(0x7c333f6c), X(0x7c3a268e), X(0x7c4104ec), X(0x7c47da8a), X(0x7c4ea76f), X(0x7c556ba1), X(0x7c5c2724), X(0x7c62d9fe), X(0x7c698435), X(0x7c7025cf), X(0x7c76bed0), X(0x7c7d4f40), X(0x7c83d723), X(0x7c8a567f), X(0x7c90cd5a), X(0x7c973bb9), X(0x7c9da1a2), X(0x7ca3ff1b), X(0x7caa542a), X(0x7cb0a0d3), X(0x7cb6e51e), X(0x7cbd210f), X(0x7cc354ac), X(0x7cc97ffc), X(0x7ccfa304), X(0x7cd5bdc9), X(0x7cdbd051), X(0x7ce1daa3), X(0x7ce7dcc3), X(0x7cedd6b8), X(0x7cf3c888), X(0x7cf9b238), X(0x7cff93cf), X(0x7d056d51), X(0x7d0b3ec5), X(0x7d110830), X(0x7d16c99a), X(0x7d1c8306), X(0x7d22347c), X(0x7d27de00), X(0x7d2d7f9a), X(0x7d33194f), X(0x7d38ab24), X(0x7d3e351f), X(0x7d43b748), X(0x7d4931a2), X(0x7d4ea435), X(0x7d540f06), X(0x7d59721b), X(0x7d5ecd7b), X(0x7d64212a), X(0x7d696d2f), X(0x7d6eb190), X(0x7d73ee53), X(0x7d79237e), X(0x7d7e5117), X(0x7d837723), X(0x7d8895a9), X(0x7d8dacae), X(0x7d92bc3a), X(0x7d97c451), X(0x7d9cc4f9), X(0x7da1be39), X(0x7da6b017), X(0x7dab9a99), X(0x7db07dc4), X(0x7db5599e), X(0x7dba2e2f), X(0x7dbefb7b), X(0x7dc3c189), X(0x7dc8805e), X(0x7dcd3802), X(0x7dd1e879), X(0x7dd691ca), X(0x7ddb33fb), X(0x7ddfcf12), X(0x7de46315), X(0x7de8f00a), X(0x7ded75f8), X(0x7df1f4e3), X(0x7df66cd3), X(0x7dfaddcd), X(0x7dff47d7), X(0x7e03aaf8), X(0x7e080735), X(0x7e0c5c95), X(0x7e10ab1e), X(0x7e14f2d5), X(0x7e1933c1), X(0x7e1d6de8), X(0x7e21a150), X(0x7e25cdff), X(0x7e29f3fc), X(0x7e2e134c), X(0x7e322bf5), X(0x7e363dfd), X(0x7e3a496b), X(0x7e3e4e45), X(0x7e424c90), X(0x7e464454), X(0x7e4a3595), X(0x7e4e205a), X(0x7e5204aa), X(0x7e55e289), X(0x7e59b9ff), X(0x7e5d8b12), X(0x7e6155c7), X(0x7e651a24), X(0x7e68d831), X(0x7e6c8ff2), X(0x7e70416e), X(0x7e73ecac), X(0x7e7791b0), X(0x7e7b3082), X(0x7e7ec927), X(0x7e825ba6), X(0x7e85e804), X(0x7e896e48), X(0x7e8cee77), X(0x7e906899), X(0x7e93dcb2), X(0x7e974aca), X(0x7e9ab2e5), X(0x7e9e150b), X(0x7ea17141), X(0x7ea4c78e), X(0x7ea817f7), X(0x7eab6283), X(0x7eaea737), X(0x7eb1e61a), X(0x7eb51f33), X(0x7eb85285), X(0x7ebb8019), X(0x7ebea7f4), X(0x7ec1ca1d), X(0x7ec4e698), X(0x7ec7fd6d), X(0x7ecb0ea1), X(0x7ece1a3a), X(0x7ed1203f), X(0x7ed420b6), X(0x7ed71ba4), X(0x7eda110f), X(0x7edd00ff), X(0x7edfeb78), X(0x7ee2d081), X(0x7ee5b01f), X(0x7ee88a5a), X(0x7eeb5f36), X(0x7eee2eba), X(0x7ef0f8ed), X(0x7ef3bdd3), X(0x7ef67d73), X(0x7ef937d3), X(0x7efbecf9), X(0x7efe9ceb), X(0x7f0147ae), X(0x7f03ed4a), X(0x7f068dc4), X(0x7f092922), X(0x7f0bbf69), X(0x7f0e50a1), X(0x7f10dcce), X(0x7f1363f7), X(0x7f15e622), X(0x7f186355), X(0x7f1adb95), X(0x7f1d4ee9), X(0x7f1fbd57), X(0x7f2226e4), X(0x7f248b96), X(0x7f26eb74), X(0x7f294683), X(0x7f2b9cc9), X(0x7f2dee4d), X(0x7f303b13), X(0x7f328322), X(0x7f34c680), X(0x7f370533), X(0x7f393f40), X(0x7f3b74ad), X(0x7f3da581), X(0x7f3fd1c1), X(0x7f41f972), X(0x7f441c9c), X(0x7f463b43), X(0x7f48556d), X(0x7f4a6b21), X(0x7f4c7c64), X(0x7f4e893c), X(0x7f5091ae), X(0x7f5295c1), X(0x7f54957a), X(0x7f5690e0), X(0x7f5887f7), X(0x7f5a7ac5), X(0x7f5c6951), X(0x7f5e53a0), X(0x7f6039b8), X(0x7f621b9e), X(0x7f63f958), X(0x7f65d2ed), X(0x7f67a861), X(0x7f6979ba), X(0x7f6b46ff), X(0x7f6d1034), X(0x7f6ed560), X(0x7f709687), X(0x7f7253b1), X(0x7f740ce1), X(0x7f75c21f), X(0x7f777370), X(0x7f7920d8), X(0x7f7aca5f), X(0x7f7c7008), X(0x7f7e11db), X(0x7f7fafdd), X(0x7f814a13), X(0x7f82e082), X(0x7f847331), X(0x7f860224), X(0x7f878d62), X(0x7f8914f0), X(0x7f8a98d4), X(0x7f8c1912), X(0x7f8d95b0), X(0x7f8f0eb5), X(0x7f908425), X(0x7f91f605), X(0x7f93645c), X(0x7f94cf2f), X(0x7f963683), X(0x7f979a5d), X(0x7f98fac4), X(0x7f9a57bb), X(0x7f9bb14a), X(0x7f9d0775), X(0x7f9e5a41), X(0x7f9fa9b4), X(0x7fa0f5d3), X(0x7fa23ea4), X(0x7fa3842b), X(0x7fa4c66f), X(0x7fa60575), X(0x7fa74141), X(0x7fa879d9), X(0x7fa9af42), X(0x7faae182), X(0x7fac109e), X(0x7fad3c9a), X(0x7fae657d), X(0x7faf8b4c), X(0x7fb0ae0b), X(0x7fb1cdc0), X(0x7fb2ea70), X(0x7fb40420), X(0x7fb51ad5), X(0x7fb62e95), X(0x7fb73f64), X(0x7fb84d48), X(0x7fb95846), X(0x7fba6062), X(0x7fbb65a2), X(0x7fbc680c), X(0x7fbd67a3), X(0x7fbe646d), X(0x7fbf5e70), X(0x7fc055af), X(0x7fc14a31), X(0x7fc23bf9), X(0x7fc32b0d), X(0x7fc41773), X(0x7fc5012e), X(0x7fc5e844), X(0x7fc6ccba), X(0x7fc7ae94), X(0x7fc88dd8), X(0x7fc96a8a), X(0x7fca44af), X(0x7fcb1c4c), X(0x7fcbf167), X(0x7fccc403), X(0x7fcd9425), X(0x7fce61d3), X(0x7fcf2d11), X(0x7fcff5e3), X(0x7fd0bc4f), X(0x7fd1805a), X(0x7fd24207), X(0x7fd3015c), X(0x7fd3be5d), X(0x7fd47910), X(0x7fd53178), X(0x7fd5e79b), X(0x7fd69b7c), X(0x7fd74d21), X(0x7fd7fc8e), X(0x7fd8a9c8), X(0x7fd954d4), X(0x7fd9fdb5), X(0x7fdaa471), X(0x7fdb490b), X(0x7fdbeb89), X(0x7fdc8bef), X(0x7fdd2a42), X(0x7fddc685), X(0x7fde60be), X(0x7fdef8f0), X(0x7fdf8f20), X(0x7fe02353), X(0x7fe0b58d), X(0x7fe145d3), X(0x7fe1d428), X(0x7fe26091), X(0x7fe2eb12), X(0x7fe373b0), X(0x7fe3fa6f), X(0x7fe47f53), X(0x7fe50260), X(0x7fe5839b), X(0x7fe60308), X(0x7fe680ab), X(0x7fe6fc88), X(0x7fe776a4), X(0x7fe7ef02), X(0x7fe865a7), X(0x7fe8da97), X(0x7fe94dd6), X(0x7fe9bf68), X(0x7fea2f51), X(0x7fea9d95), X(0x7feb0a39), X(0x7feb7540), X(0x7febdeae), X(0x7fec4687), X(0x7fecaccf), X(0x7fed118b), X(0x7fed74be), X(0x7fedd66c), X(0x7fee3698), X(0x7fee9548), X(0x7feef27e), X(0x7fef4e3f), X(0x7fefa88e), X(0x7ff0016f), X(0x7ff058e7), X(0x7ff0aef8), X(0x7ff103a6), X(0x7ff156f6), X(0x7ff1a8eb), X(0x7ff1f988), X(0x7ff248d2), X(0x7ff296cc), X(0x7ff2e37a), X(0x7ff32edf), X(0x7ff378ff), X(0x7ff3c1de), X(0x7ff4097e), X(0x7ff44fe5), X(0x7ff49515), X(0x7ff4d911), X(0x7ff51bde), X(0x7ff55d7f), X(0x7ff59df7), X(0x7ff5dd4a), X(0x7ff61b7b), X(0x7ff6588d), X(0x7ff69485), X(0x7ff6cf65), X(0x7ff70930), X(0x7ff741eb), X(0x7ff77998), X(0x7ff7b03b), X(0x7ff7e5d7), X(0x7ff81a6f), X(0x7ff84e06), X(0x7ff880a1), X(0x7ff8b241), X(0x7ff8e2ea), X(0x7ff912a0), X(0x7ff94165), X(0x7ff96f3d), X(0x7ff99c2b), X(0x7ff9c831), X(0x7ff9f354), X(0x7ffa1d95), X(0x7ffa46f9), X(0x7ffa6f81), X(0x7ffa9731), X(0x7ffabe0d), X(0x7ffae416), X(0x7ffb0951), X(0x7ffb2dbf), X(0x7ffb5164), X(0x7ffb7442), X(0x7ffb965d), X(0x7ffbb7b8), X(0x7ffbd854), X(0x7ffbf836), X(0x7ffc175f), X(0x7ffc35d3), X(0x7ffc5394), X(0x7ffc70a5), X(0x7ffc8d09), X(0x7ffca8c2), X(0x7ffcc3d4), X(0x7ffcde3f), X(0x7ffcf809), X(0x7ffd1132), X(0x7ffd29be), X(0x7ffd41ae), X(0x7ffd5907), X(0x7ffd6fc9), X(0x7ffd85f9), X(0x7ffd9b97), X(0x7ffdb0a7), X(0x7ffdc52b), X(0x7ffdd926), X(0x7ffdec99), X(0x7ffdff88), X(0x7ffe11f4), X(0x7ffe23e0), X(0x7ffe354f), X(0x7ffe4642), X(0x7ffe56bc), X(0x7ffe66bf), X(0x7ffe764e), X(0x7ffe856a), X(0x7ffe9416), X(0x7ffea254), X(0x7ffeb026), X(0x7ffebd8e), X(0x7ffeca8f), X(0x7ffed72a), X(0x7ffee362), X(0x7ffeef38), X(0x7ffefaaf), X(0x7fff05c9), X(0x7fff1087), X(0x7fff1aec), X(0x7fff24f9), X(0x7fff2eb1), X(0x7fff3816), X(0x7fff4128), X(0x7fff49eb), X(0x7fff5260), X(0x7fff5a88), X(0x7fff6266), X(0x7fff69fc), X(0x7fff714b), X(0x7fff7854), X(0x7fff7f1a), X(0x7fff859f), X(0x7fff8be3), X(0x7fff91ea), X(0x7fff97b3), X(0x7fff9d41), X(0x7fffa296), X(0x7fffa7b3), X(0x7fffac99), X(0x7fffb14b), X(0x7fffb5c9), X(0x7fffba15), X(0x7fffbe31), X(0x7fffc21d), X(0x7fffc5dc), X(0x7fffc96f), X(0x7fffccd8), X(0x7fffd016), X(0x7fffd32d), X(0x7fffd61c), X(0x7fffd8e7), X(0x7fffdb8d), X(0x7fffde0f), X(0x7fffe071), X(0x7fffe2b1), X(0x7fffe4d2), X(0x7fffe6d5), X(0x7fffe8bb), X(0x7fffea85), X(0x7fffec34), X(0x7fffedc9), X(0x7fffef45), X(0x7ffff0aa), X(0x7ffff1f7), X(0x7ffff330), X(0x7ffff453), X(0x7ffff562), X(0x7ffff65f), X(0x7ffff749), X(0x7ffff823), X(0x7ffff8ec), X(0x7ffff9a6), X(0x7ffffa51), X(0x7ffffaee), X(0x7ffffb7e), X(0x7ffffc02), X(0x7ffffc7a), X(0x7ffffce7), X(0x7ffffd4a), X(0x7ffffda3), X(0x7ffffdf4), X(0x7ffffe3c), X(0x7ffffe7c), X(0x7ffffeb6), X(0x7ffffee8), X(0x7fffff15), X(0x7fffff3c), X(0x7fffff5e), X(0x7fffff7b), X(0x7fffff95), X(0x7fffffaa), X(0x7fffffbc), X(0x7fffffcb), X(0x7fffffd7), X(0x7fffffe2), X(0x7fffffea), X(0x7ffffff0), X(0x7ffffff5), X(0x7ffffff9), X(0x7ffffffb), X(0x7ffffffd), X(0x7ffffffe), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), }; static LOOKUP_T vwin8192[4096] = { X(0x0000007c), X(0x0000045c), X(0x00000c1d), X(0x000017bd), X(0x0000273e), X(0x00003a9f), X(0x000051e0), X(0x00006d02), X(0x00008c03), X(0x0000aee5), X(0x0000d5a7), X(0x00010049), X(0x00012ecb), X(0x0001612d), X(0x00019770), X(0x0001d193), X(0x00020f96), X(0x00025178), X(0x0002973c), X(0x0002e0df), X(0x00032e62), X(0x00037fc5), X(0x0003d509), X(0x00042e2c), X(0x00048b30), X(0x0004ec13), X(0x000550d7), X(0x0005b97a), X(0x000625fe), X(0x00069661), X(0x00070aa4), X(0x000782c8), X(0x0007fecb), X(0x00087eae), X(0x00090271), X(0x00098a14), X(0x000a1597), X(0x000aa4f9), X(0x000b383b), X(0x000bcf5d), X(0x000c6a5f), X(0x000d0941), X(0x000dac02), X(0x000e52a3), X(0x000efd23), X(0x000fab84), X(0x00105dc3), X(0x001113e3), X(0x0011cde2), X(0x00128bc0), X(0x00134d7e), X(0x0014131b), X(0x0014dc98), X(0x0015a9f4), X(0x00167b30), X(0x0017504a), X(0x00182945), X(0x0019061e), X(0x0019e6d7), X(0x001acb6f), X(0x001bb3e6), X(0x001ca03c), X(0x001d9071), X(0x001e8485), X(0x001f7c79), X(0x0020784b), X(0x002177fc), X(0x00227b8c), X(0x002382fb), X(0x00248e49), X(0x00259d76), X(0x0026b081), X(0x0027c76b), X(0x0028e234), X(0x002a00dc), X(0x002b2361), X(0x002c49c6), X(0x002d7409), X(0x002ea22a), X(0x002fd42a), X(0x00310a08), X(0x003243c5), X(0x00338160), X(0x0034c2d9), X(0x00360830), X(0x00375165), X(0x00389e78), X(0x0039ef6a), X(0x003b4439), X(0x003c9ce6), X(0x003df971), X(0x003f59da), X(0x0040be20), X(0x00422645), X(0x00439247), X(0x00450226), X(0x004675e3), X(0x0047ed7e), X(0x004968f5), X(0x004ae84b), X(0x004c6b7d), X(0x004df28d), X(0x004f7d7a), X(0x00510c44), X(0x00529eeb), X(0x00543570), X(0x0055cfd1), X(0x00576e0f), X(0x00591029), X(0x005ab621), X(0x005c5ff5), X(0x005e0da6), X(0x005fbf33), X(0x0061749d), X(0x00632de4), X(0x0064eb06), X(0x0066ac05), X(0x006870e0), X(0x006a3998), X(0x006c062b), X(0x006dd69b), X(0x006faae6), X(0x0071830d), X(0x00735f10), X(0x00753eef), X(0x007722a9), X(0x00790a3f), X(0x007af5b1), X(0x007ce4fe), X(0x007ed826), X(0x0080cf29), X(0x0082ca08), X(0x0084c8c2), X(0x0086cb57), X(0x0088d1c7), X(0x008adc11), X(0x008cea37), X(0x008efc37), X(0x00911212), X(0x00932bc7), X(0x00954957), X(0x00976ac2), X(0x00999006), X(0x009bb925), X(0x009de61e), X(0x00a016f1), X(0x00a24b9e), X(0x00a48425), X(0x00a6c086), X(0x00a900c0), X(0x00ab44d4), X(0x00ad8cc2), X(0x00afd889), X(0x00b22829), X(0x00b47ba2), X(0x00b6d2f5), X(0x00b92e21), X(0x00bb8d26), X(0x00bdf004), X(0x00c056ba), X(0x00c2c149), X(0x00c52fb1), X(0x00c7a1f1), X(0x00ca180a), X(0x00cc91fb), X(0x00cf0fc5), X(0x00d19166), X(0x00d416df), X(0x00d6a031), X(0x00d92d5a), X(0x00dbbe5b), X(0x00de5333), X(0x00e0ebe3), X(0x00e3886b), X(0x00e628c9), X(0x00e8ccff), X(0x00eb750c), X(0x00ee20f0), X(0x00f0d0ab), X(0x00f3843d), X(0x00f63ba5), X(0x00f8f6e4), X(0x00fbb5fa), X(0x00fe78e5), X(0x01013fa7), X(0x01040a3f), X(0x0106d8ae), X(0x0109aaf2), X(0x010c810c), X(0x010f5afb), X(0x011238c0), X(0x01151a5b), X(0x0117ffcb), X(0x011ae910), X(0x011dd62a), X(0x0120c719), X(0x0123bbdd), X(0x0126b476), X(0x0129b0e4), X(0x012cb126), X(0x012fb53c), X(0x0132bd27), X(0x0135c8e6), X(0x0138d879), X(0x013bebdf), X(0x013f031a), X(0x01421e28), X(0x01453d0a), X(0x01485fbf), X(0x014b8648), X(0x014eb0a4), X(0x0151ded2), X(0x015510d4), X(0x015846a8), X(0x015b8050), X(0x015ebdc9), X(0x0161ff15), X(0x01654434), X(0x01688d24), X(0x016bd9e6), X(0x016f2a7b), X(0x01727ee1), X(0x0175d718), X(0x01793321), X(0x017c92fc), X(0x017ff6a7), X(0x01835e24), X(0x0186c972), X(0x018a3890), X(0x018dab7f), X(0x0191223f), X(0x01949ccf), X(0x01981b2f), X(0x019b9d5f), X(0x019f235f), X(0x01a2ad2f), X(0x01a63acf), X(0x01a9cc3e), X(0x01ad617c), X(0x01b0fa8a), X(0x01b49767), X(0x01b83813), X(0x01bbdc8d), X(0x01bf84d6), X(0x01c330ee), X(0x01c6e0d4), X(0x01ca9488), X(0x01ce4c0b), X(0x01d2075b), X(0x01d5c679), X(0x01d98964), X(0x01dd501d), X(0x01e11aa3), X(0x01e4e8f6), X(0x01e8bb17), X(0x01ec9104), X(0x01f06abd), X(0x01f44844), X(0x01f82996), X(0x01fc0eb5), X(0x01fff7a0), X(0x0203e456), X(0x0207d4d9), X(0x020bc926), X(0x020fc140), X(0x0213bd24), X(0x0217bcd4), X(0x021bc04e), X(0x021fc793), X(0x0223d2a3), X(0x0227e17d), X(0x022bf421), X(0x02300a90), X(0x023424c8), X(0x023842ca), X(0x023c6495), X(0x02408a2a), X(0x0244b389), X(0x0248e0b0), X(0x024d11a0), X(0x02514659), X(0x02557eda), X(0x0259bb24), X(0x025dfb35), X(0x02623f0f), X(0x026686b1), X(0x026ad21a), X(0x026f214b), X(0x02737443), X(0x0277cb02), X(0x027c2588), X(0x028083d5), X(0x0284e5e9), X(0x02894bc2), X(0x028db562), X(0x029222c8), X(0x029693f4), X(0x029b08e6), X(0x029f819d), X(0x02a3fe19), X(0x02a87e5b), X(0x02ad0261), X(0x02b18a2c), X(0x02b615bb), X(0x02baa50f), X(0x02bf3827), X(0x02c3cf03), X(0x02c869a3), X(0x02cd0807), X(0x02d1aa2d), X(0x02d65017), X(0x02daf9c4), X(0x02dfa734), X(0x02e45866), X(0x02e90d5b), X(0x02edc612), X(0x02f2828b), X(0x02f742c6), X(0x02fc06c3), X(0x0300ce80), X(0x030599ff), X(0x030a6940), X(0x030f3c40), X(0x03141302), X(0x0318ed84), X(0x031dcbc6), X(0x0322adc8), X(0x0327938a), X(0x032c7d0c), X(0x03316a4c), X(0x03365b4d), X(0x033b500c), X(0x03404889), X(0x034544c6), X(0x034a44c0), X(0x034f4879), X(0x03544ff0), X(0x03595b24), X(0x035e6a16), X(0x03637cc5), X(0x03689331), X(0x036dad5a), X(0x0372cb40), X(0x0377ece2), X(0x037d1240), X(0x03823b5a), X(0x03876830), X(0x038c98c1), X(0x0391cd0e), X(0x03970516), X(0x039c40d8), X(0x03a18055), X(0x03a6c38d), X(0x03ac0a7f), X(0x03b1552b), X(0x03b6a390), X(0x03bbf5af), X(0x03c14b88), X(0x03c6a519), X(0x03cc0263), X(0x03d16366), X(0x03d6c821), X(0x03dc3094), X(0x03e19cc0), X(0x03e70ca2), X(0x03ec803d), X(0x03f1f78e), X(0x03f77296), X(0x03fcf155), X(0x040273cb), X(0x0407f9f7), X(0x040d83d9), X(0x04131170), X(0x0418a2bd), X(0x041e37c0), X(0x0423d077), X(0x04296ce4), X(0x042f0d04), X(0x0434b0da), X(0x043a5863), X(0x044003a0), X(0x0445b290), X(0x044b6534), X(0x04511b8b), X(0x0456d595), X(0x045c9352), X(0x046254c1), X(0x046819e1), X(0x046de2b4), X(0x0473af39), X(0x04797f6e), X(0x047f5355), X(0x04852aec), X(0x048b0635), X(0x0490e52d), X(0x0496c7d6), X(0x049cae2e), X(0x04a29836), X(0x04a885ed), X(0x04ae7753), X(0x04b46c68), X(0x04ba652b), X(0x04c0619d), X(0x04c661bc), X(0x04cc658a), X(0x04d26d04), X(0x04d8782c), X(0x04de8701), X(0x04e49983), X(0x04eaafb0), X(0x04f0c98a), X(0x04f6e710), X(0x04fd0842), X(0x05032d1e), X(0x050955a6), X(0x050f81d8), X(0x0515b1b5), X(0x051be53d), X(0x05221c6e), X(0x05285748), X(0x052e95cd), X(0x0534d7fa), X(0x053b1dd0), X(0x0541674e), X(0x0547b475), X(0x054e0544), X(0x055459bb), X(0x055ab1d9), X(0x05610d9e), X(0x05676d0a), X(0x056dd01c), X(0x057436d5), X(0x057aa134), X(0x05810f38), X(0x058780e2), X(0x058df631), X(0x05946f25), X(0x059aebbe), X(0x05a16bfa), X(0x05a7efdb), X(0x05ae775f), X(0x05b50287), X(0x05bb9152), X(0x05c223c0), X(0x05c8b9d0), X(0x05cf5382), X(0x05d5f0d6), X(0x05dc91cc), X(0x05e33663), X(0x05e9de9c), X(0x05f08a75), X(0x05f739ee), X(0x05fded07), X(0x0604a3c0), X(0x060b5e19), X(0x06121c11), X(0x0618dda8), X(0x061fa2dd), X(0x06266bb1), X(0x062d3822), X(0x06340831), X(0x063adbde), X(0x0641b328), X(0x06488e0e), X(0x064f6c91), X(0x06564eaf), X(0x065d346a), X(0x06641dc0), X(0x066b0ab1), X(0x0671fb3d), X(0x0678ef64), X(0x067fe724), X(0x0686e27f), X(0x068de173), X(0x0694e400), X(0x069bea27), X(0x06a2f3e6), X(0x06aa013d), X(0x06b1122c), X(0x06b826b3), X(0x06bf3ed1), X(0x06c65a86), X(0x06cd79d1), X(0x06d49cb3), X(0x06dbc32b), X(0x06e2ed38), X(0x06ea1adb), X(0x06f14c13), X(0x06f880df), X(0x06ffb940), X(0x0706f535), X(0x070e34bd), X(0x071577d9), X(0x071cbe88), X(0x072408c9), X(0x072b569d), X(0x0732a802), X(0x0739fcf9), X(0x07415582), X(0x0748b19b), X(0x07501145), X(0x0757747f), X(0x075edb49), X(0x076645a3), X(0x076db38c), X(0x07752503), X(0x077c9a09), X(0x0784129e), X(0x078b8ec0), X(0x07930e70), X(0x079a91ac), X(0x07a21876), X(0x07a9a2cc), X(0x07b130ad), X(0x07b8c21b), X(0x07c05714), X(0x07c7ef98), X(0x07cf8ba6), X(0x07d72b3f), X(0x07dece62), X(0x07e6750e), X(0x07ee1f43), X(0x07f5cd01), X(0x07fd7e48), X(0x08053316), X(0x080ceb6d), X(0x0814a74a), X(0x081c66af), X(0x0824299a), X(0x082bf00c), X(0x0833ba03), X(0x083b8780), X(0x08435882), X(0x084b2d09), X(0x08530514), X(0x085ae0a3), X(0x0862bfb6), X(0x086aa24c), X(0x08728865), X(0x087a7201), X(0x08825f1e), X(0x088a4fbe), X(0x089243de), X(0x089a3b80), X(0x08a236a2), X(0x08aa3545), X(0x08b23767), X(0x08ba3d09), X(0x08c2462a), X(0x08ca52c9), X(0x08d262e7), X(0x08da7682), X(0x08e28d9c), X(0x08eaa832), X(0x08f2c645), X(0x08fae7d4), X(0x09030cdf), X(0x090b3566), X(0x09136168), X(0x091b90e5), X(0x0923c3dc), X(0x092bfa4d), X(0x09343437), X(0x093c719b), X(0x0944b277), X(0x094cf6cc), X(0x09553e99), X(0x095d89dd), X(0x0965d899), X(0x096e2acb), X(0x09768073), X(0x097ed991), X(0x09873625), X(0x098f962e), X(0x0997f9ac), X(0x09a0609e), X(0x09a8cb04), X(0x09b138dd), X(0x09b9aa29), X(0x09c21ee8), X(0x09ca9719), X(0x09d312bc), X(0x09db91d0), X(0x09e41456), X(0x09ec9a4b), X(0x09f523b1), X(0x09fdb087), X(0x0a0640cc), X(0x0a0ed47f), X(0x0a176ba2), X(0x0a200632), X(0x0a28a42f), X(0x0a31459a), X(0x0a39ea72), X(0x0a4292b5), X(0x0a4b3e65), X(0x0a53ed80), X(0x0a5ca006), X(0x0a6555f7), X(0x0a6e0f51), X(0x0a76cc16), X(0x0a7f8c44), X(0x0a884fda), X(0x0a9116d9), X(0x0a99e140), X(0x0aa2af0e), X(0x0aab8043), X(0x0ab454df), X(0x0abd2ce1), X(0x0ac60849), X(0x0acee716), X(0x0ad7c948), X(0x0ae0aedf), X(0x0ae997d9), X(0x0af28437), X(0x0afb73f7), X(0x0b04671b), X(0x0b0d5da0), X(0x0b165788), X(0x0b1f54d0), X(0x0b285579), X(0x0b315983), X(0x0b3a60ec), X(0x0b436bb5), X(0x0b4c79dd), X(0x0b558b63), X(0x0b5ea048), X(0x0b67b88a), X(0x0b70d429), X(0x0b79f324), X(0x0b83157c), X(0x0b8c3b30), X(0x0b95643f), X(0x0b9e90a8), X(0x0ba7c06c), X(0x0bb0f38a), X(0x0bba2a01), X(0x0bc363d1), X(0x0bcca0f9), X(0x0bd5e17a), X(0x0bdf2552), X(0x0be86c81), X(0x0bf1b706), X(0x0bfb04e2), X(0x0c045613), X(0x0c0daa99), X(0x0c170274), X(0x0c205da3), X(0x0c29bc25), X(0x0c331dfb), X(0x0c3c8323), X(0x0c45eb9e), X(0x0c4f576a), X(0x0c58c688), X(0x0c6238f6), X(0x0c6baeb5), X(0x0c7527c3), X(0x0c7ea421), X(0x0c8823cd), X(0x0c91a6c8), X(0x0c9b2d10), X(0x0ca4b6a6), X(0x0cae4389), X(0x0cb7d3b8), X(0x0cc16732), X(0x0ccafdf8), X(0x0cd49809), X(0x0cde3564), X(0x0ce7d609), X(0x0cf179f7), X(0x0cfb212e), X(0x0d04cbad), X(0x0d0e7974), X(0x0d182a83), X(0x0d21ded8), X(0x0d2b9673), X(0x0d355154), X(0x0d3f0f7b), X(0x0d48d0e6), X(0x0d529595), X(0x0d5c5d88), X(0x0d6628be), X(0x0d6ff737), X(0x0d79c8f2), X(0x0d839dee), X(0x0d8d762c), X(0x0d9751aa), X(0x0da13068), X(0x0dab1266), X(0x0db4f7a3), X(0x0dbee01e), X(0x0dc8cbd8), X(0x0dd2bace), X(0x0ddcad02), X(0x0de6a272), X(0x0df09b1e), X(0x0dfa9705), X(0x0e049627), X(0x0e0e9883), X(0x0e189e19), X(0x0e22a6e8), X(0x0e2cb2f0), X(0x0e36c230), X(0x0e40d4a8), X(0x0e4aea56), X(0x0e55033b), X(0x0e5f1f56), X(0x0e693ea7), X(0x0e73612c), X(0x0e7d86e5), X(0x0e87afd3), X(0x0e91dbf3), X(0x0e9c0b47), X(0x0ea63dcc), X(0x0eb07383), X(0x0ebaac6b), X(0x0ec4e883), X(0x0ecf27cc), X(0x0ed96a44), X(0x0ee3afea), X(0x0eedf8bf), X(0x0ef844c2), X(0x0f0293f2), X(0x0f0ce64e), X(0x0f173bd6), X(0x0f21948a), X(0x0f2bf069), X(0x0f364f72), X(0x0f40b1a5), X(0x0f4b1701), X(0x0f557f86), X(0x0f5feb32), X(0x0f6a5a07), X(0x0f74cc02), X(0x0f7f4124), X(0x0f89b96b), X(0x0f9434d8), X(0x0f9eb369), X(0x0fa9351e), X(0x0fb3b9f7), X(0x0fbe41f3), X(0x0fc8cd11), X(0x0fd35b51), X(0x0fddecb2), X(0x0fe88134), X(0x0ff318d6), X(0x0ffdb397), X(0x10085177), X(0x1012f275), X(0x101d9691), X(0x10283dca), X(0x1032e81f), X(0x103d9591), X(0x1048461e), X(0x1052f9c5), X(0x105db087), X(0x10686a62), X(0x10732756), X(0x107de763), X(0x1088aa87), X(0x109370c2), X(0x109e3a14), X(0x10a9067c), X(0x10b3d5f9), X(0x10bea88b), X(0x10c97e31), X(0x10d456eb), X(0x10df32b8), X(0x10ea1197), X(0x10f4f387), X(0x10ffd889), X(0x110ac09b), X(0x1115abbe), X(0x112099ef), X(0x112b8b2f), X(0x11367f7d), X(0x114176d9), X(0x114c7141), X(0x11576eb6), X(0x11626f36), X(0x116d72c1), X(0x11787957), X(0x118382f6), X(0x118e8f9e), X(0x11999f4f), X(0x11a4b208), X(0x11afc7c7), X(0x11bae08e), X(0x11c5fc5a), X(0x11d11b2c), X(0x11dc3d02), X(0x11e761dd), X(0x11f289ba), X(0x11fdb49b), X(0x1208e27e), X(0x12141362), X(0x121f4748), X(0x122a7e2d), X(0x1235b812), X(0x1240f4f6), X(0x124c34d9), X(0x125777b9), X(0x1262bd96), X(0x126e0670), X(0x12795245), X(0x1284a115), X(0x128ff2e0), X(0x129b47a5), X(0x12a69f63), X(0x12b1fa19), X(0x12bd57c7), X(0x12c8b86c), X(0x12d41c08), X(0x12df829a), X(0x12eaec21), X(0x12f6589d), X(0x1301c80c), X(0x130d3a6f), X(0x1318afc4), X(0x1324280b), X(0x132fa344), X(0x133b216d), X(0x1346a286), X(0x1352268e), X(0x135dad85), X(0x1369376a), X(0x1374c43c), X(0x138053fb), X(0x138be6a5), X(0x13977c3b), X(0x13a314bc), X(0x13aeb026), X(0x13ba4e79), X(0x13c5efb5), X(0x13d193d9), X(0x13dd3ae4), X(0x13e8e4d6), X(0x13f491ad), X(0x1400416a), X(0x140bf40b), X(0x1417a98f), X(0x142361f7), X(0x142f1d41), X(0x143adb6d), X(0x14469c7a), X(0x14526067), X(0x145e2734), X(0x1469f0df), X(0x1475bd69), X(0x14818cd0), X(0x148d5f15), X(0x14993435), X(0x14a50c31), X(0x14b0e708), X(0x14bcc4b8), X(0x14c8a542), X(0x14d488a5), X(0x14e06edf), X(0x14ec57f1), X(0x14f843d9), X(0x15043297), X(0x1510242b), X(0x151c1892), X(0x15280fcd), X(0x153409dc), X(0x154006bc), X(0x154c066e), X(0x155808f1), X(0x15640e44), X(0x15701666), X(0x157c2157), X(0x15882f16), X(0x15943fa2), X(0x15a052fb), X(0x15ac691f), X(0x15b8820f), X(0x15c49dc8), X(0x15d0bc4c), X(0x15dcdd98), X(0x15e901ad), X(0x15f52888), X(0x1601522b), X(0x160d7e93), X(0x1619adc1), X(0x1625dfb3), X(0x16321469), X(0x163e4be2), X(0x164a861d), X(0x1656c31a), X(0x166302d8), X(0x166f4555), X(0x167b8a92), X(0x1687d28e), X(0x16941d47), X(0x16a06abe), X(0x16acbaf0), X(0x16b90ddf), X(0x16c56388), X(0x16d1bbeb), X(0x16de1708), X(0x16ea74dd), X(0x16f6d56a), X(0x170338ae), X(0x170f9ea8), X(0x171c0758), X(0x172872bd), X(0x1734e0d6), X(0x174151a2), X(0x174dc520), X(0x175a3b51), X(0x1766b432), X(0x17732fc4), X(0x177fae05), X(0x178c2ef4), X(0x1798b292), X(0x17a538dd), X(0x17b1c1d4), X(0x17be4d77), X(0x17cadbc5), X(0x17d76cbc), X(0x17e4005e), X(0x17f096a7), X(0x17fd2f98), X(0x1809cb31), X(0x1816696f), X(0x18230a53), X(0x182faddc), X(0x183c5408), X(0x1848fcd8), X(0x1855a849), X(0x1862565d), X(0x186f0711), X(0x187bba64), X(0x18887057), X(0x189528e9), X(0x18a1e418), X(0x18aea1e3), X(0x18bb624b), X(0x18c8254e), X(0x18d4eaeb), X(0x18e1b321), X(0x18ee7df1), X(0x18fb4b58), X(0x19081b57), X(0x1914edec), X(0x1921c317), X(0x192e9ad6), X(0x193b7529), X(0x19485210), X(0x19553189), X(0x19621393), X(0x196ef82e), X(0x197bdf59), X(0x1988c913), X(0x1995b55c), X(0x19a2a432), X(0x19af9595), X(0x19bc8983), X(0x19c97ffd), X(0x19d67900), X(0x19e3748e), X(0x19f072a3), X(0x19fd7341), X(0x1a0a7665), X(0x1a177c10), X(0x1a248440), X(0x1a318ef4), X(0x1a3e9c2c), X(0x1a4babe7), X(0x1a58be24), X(0x1a65d2e2), X(0x1a72ea20), X(0x1a8003de), X(0x1a8d201a), X(0x1a9a3ed5), X(0x1aa7600c), X(0x1ab483bf), X(0x1ac1a9ee), X(0x1aced297), X(0x1adbfdba), X(0x1ae92b56), X(0x1af65b69), X(0x1b038df4), X(0x1b10c2f5), X(0x1b1dfa6b), X(0x1b2b3456), X(0x1b3870b5), X(0x1b45af87), X(0x1b52f0ca), X(0x1b60347f), X(0x1b6d7aa4), X(0x1b7ac339), X(0x1b880e3c), X(0x1b955bad), X(0x1ba2ab8b), X(0x1baffdd5), X(0x1bbd528a), X(0x1bcaa9a9), X(0x1bd80332), X(0x1be55f24), X(0x1bf2bd7d), X(0x1c001e3d), X(0x1c0d8164), X(0x1c1ae6ef), X(0x1c284edf), X(0x1c35b932), X(0x1c4325e7), X(0x1c5094fe), X(0x1c5e0677), X(0x1c6b7a4f), X(0x1c78f086), X(0x1c86691b), X(0x1c93e40d), X(0x1ca1615c), X(0x1caee107), X(0x1cbc630c), X(0x1cc9e76b), X(0x1cd76e23), X(0x1ce4f733), X(0x1cf2829a), X(0x1d001057), X(0x1d0da06a), X(0x1d1b32d1), X(0x1d28c78c), X(0x1d365e9a), X(0x1d43f7f9), X(0x1d5193a9), X(0x1d5f31aa), X(0x1d6cd1f9), X(0x1d7a7497), X(0x1d881982), X(0x1d95c0ba), X(0x1da36a3d), X(0x1db1160a), X(0x1dbec422), X(0x1dcc7482), X(0x1dda272b), X(0x1de7dc1a), X(0x1df59350), X(0x1e034ccb), X(0x1e11088a), X(0x1e1ec68c), X(0x1e2c86d1), X(0x1e3a4958), X(0x1e480e20), X(0x1e55d527), X(0x1e639e6d), X(0x1e7169f1), X(0x1e7f37b2), X(0x1e8d07b0), X(0x1e9ad9e8), X(0x1ea8ae5b), X(0x1eb68507), X(0x1ec45dec), X(0x1ed23908), X(0x1ee0165b), X(0x1eedf5e4), X(0x1efbd7a1), X(0x1f09bb92), X(0x1f17a1b6), X(0x1f258a0d), X(0x1f337494), X(0x1f41614b), X(0x1f4f5032), X(0x1f5d4147), X(0x1f6b3489), X(0x1f7929f7), X(0x1f872192), X(0x1f951b56), X(0x1fa31744), X(0x1fb1155b), X(0x1fbf159a), X(0x1fcd17ff), X(0x1fdb1c8b), X(0x1fe9233b), X(0x1ff72c0f), X(0x20053706), X(0x20134420), X(0x2021535a), X(0x202f64b4), X(0x203d782e), X(0x204b8dc6), X(0x2059a57c), X(0x2067bf4e), X(0x2075db3b), X(0x2083f943), X(0x20921964), X(0x20a03b9e), X(0x20ae5fef), X(0x20bc8657), X(0x20caaed5), X(0x20d8d967), X(0x20e7060e), X(0x20f534c7), X(0x21036592), X(0x2111986e), X(0x211fcd59), X(0x212e0454), X(0x213c3d5d), X(0x214a7873), X(0x2158b594), X(0x2166f4c1), X(0x217535f8), X(0x21837938), X(0x2191be81), X(0x21a005d0), X(0x21ae4f26), X(0x21bc9a81), X(0x21cae7e0), X(0x21d93743), X(0x21e788a8), X(0x21f5dc0e), X(0x22043174), X(0x221288da), X(0x2220e23e), X(0x222f3da0), X(0x223d9afe), X(0x224bfa58), X(0x225a5bac), X(0x2268bef9), X(0x2277243f), X(0x22858b7d), X(0x2293f4b0), X(0x22a25fda), X(0x22b0ccf8), X(0x22bf3c09), X(0x22cdad0d), X(0x22dc2002), X(0x22ea94e8), X(0x22f90bbe), X(0x23078482), X(0x2315ff33), X(0x23247bd1), X(0x2332fa5b), X(0x23417acf), X(0x234ffd2c), X(0x235e8173), X(0x236d07a0), X(0x237b8fb4), X(0x238a19ae), X(0x2398a58c), X(0x23a7334d), X(0x23b5c2f1), X(0x23c45477), X(0x23d2e7dd), X(0x23e17d22), X(0x23f01446), X(0x23fead47), X(0x240d4825), X(0x241be4dd), X(0x242a8371), X(0x243923dd), X(0x2447c622), X(0x24566a3e), X(0x24651031), X(0x2473b7f8), X(0x24826194), X(0x24910d03), X(0x249fba44), X(0x24ae6957), X(0x24bd1a39), X(0x24cbccea), X(0x24da816a), X(0x24e937b7), X(0x24f7efcf), X(0x2506a9b3), X(0x25156560), X(0x252422d6), X(0x2532e215), X(0x2541a31a), X(0x255065e4), X(0x255f2a74), X(0x256df0c7), X(0x257cb8dd), X(0x258b82b4), X(0x259a4e4c), X(0x25a91ba4), X(0x25b7eaba), X(0x25c6bb8e), X(0x25d58e1e), X(0x25e46269), X(0x25f3386e), X(0x2602102d), X(0x2610e9a4), X(0x261fc4d3), X(0x262ea1b7), X(0x263d8050), X(0x264c609e), X(0x265b429e), X(0x266a2650), X(0x26790bb3), X(0x2687f2c6), X(0x2696db88), X(0x26a5c5f7), X(0x26b4b213), X(0x26c39fda), X(0x26d28f4c), X(0x26e18067), X(0x26f0732b), X(0x26ff6796), X(0x270e5da7), X(0x271d555d), X(0x272c4eb7), X(0x273b49b5), X(0x274a4654), X(0x27594495), X(0x27684475), X(0x277745f4), X(0x27864910), X(0x27954dc9), X(0x27a4541e), X(0x27b35c0d), X(0x27c26596), X(0x27d170b7), X(0x27e07d6f), X(0x27ef8bbd), X(0x27fe9ba0), X(0x280dad18), X(0x281cc022), X(0x282bd4be), X(0x283aeaeb), X(0x284a02a7), X(0x28591bf2), X(0x286836cb), X(0x28775330), X(0x28867120), X(0x2895909b), X(0x28a4b19e), X(0x28b3d42a), X(0x28c2f83d), X(0x28d21dd5), X(0x28e144f3), X(0x28f06d94), X(0x28ff97b8), X(0x290ec35d), X(0x291df082), X(0x292d1f27), X(0x293c4f4a), X(0x294b80eb), X(0x295ab407), X(0x2969e89e), X(0x29791eaf), X(0x29885639), X(0x29978f3b), X(0x29a6c9b3), X(0x29b605a0), X(0x29c54302), X(0x29d481d7), X(0x29e3c21e), X(0x29f303d6), X(0x2a0246fd), X(0x2a118b94), X(0x2a20d198), X(0x2a301909), X(0x2a3f61e6), X(0x2a4eac2c), X(0x2a5df7dc), X(0x2a6d44f4), X(0x2a7c9374), X(0x2a8be359), X(0x2a9b34a2), X(0x2aaa8750), X(0x2ab9db60), X(0x2ac930d1), X(0x2ad887a3), X(0x2ae7dfd3), X(0x2af73962), X(0x2b06944e), X(0x2b15f096), X(0x2b254e38), X(0x2b34ad34), X(0x2b440d89), X(0x2b536f34), X(0x2b62d236), X(0x2b72368d), X(0x2b819c38), X(0x2b910336), X(0x2ba06b86), X(0x2bafd526), X(0x2bbf4015), X(0x2bceac53), X(0x2bde19de), X(0x2bed88b5), X(0x2bfcf8d7), X(0x2c0c6a43), X(0x2c1bdcf7), X(0x2c2b50f3), X(0x2c3ac635), X(0x2c4a3cbd), X(0x2c59b488), X(0x2c692d97), X(0x2c78a7e7), X(0x2c882378), X(0x2c97a049), X(0x2ca71e58), X(0x2cb69da4), X(0x2cc61e2c), X(0x2cd59ff0), X(0x2ce522ed), X(0x2cf4a723), X(0x2d042c90), X(0x2d13b334), X(0x2d233b0d), X(0x2d32c41a), X(0x2d424e5a), X(0x2d51d9cc), X(0x2d61666e), X(0x2d70f440), X(0x2d808340), X(0x2d90136e), X(0x2d9fa4c7), X(0x2daf374c), X(0x2dbecafa), X(0x2dce5fd1), X(0x2dddf5cf), X(0x2ded8cf4), X(0x2dfd253d), X(0x2e0cbeab), X(0x2e1c593b), X(0x2e2bf4ed), X(0x2e3b91c0), X(0x2e4b2fb1), X(0x2e5acec1), X(0x2e6a6eee), X(0x2e7a1037), X(0x2e89b29b), X(0x2e995618), X(0x2ea8faad), X(0x2eb8a05a), X(0x2ec8471c), X(0x2ed7eef4), X(0x2ee797df), X(0x2ef741dc), X(0x2f06eceb), X(0x2f16990a), X(0x2f264639), X(0x2f35f475), X(0x2f45a3bd), X(0x2f555412), X(0x2f650570), X(0x2f74b7d8), X(0x2f846b48), X(0x2f941fbe), X(0x2fa3d53a), X(0x2fb38bbb), X(0x2fc3433f), X(0x2fd2fbc5), X(0x2fe2b54c), X(0x2ff26fd3), X(0x30022b58), X(0x3011e7db), X(0x3021a55a), X(0x303163d4), X(0x30412348), X(0x3050e3b5), X(0x3060a519), X(0x30706773), X(0x30802ac3), X(0x308fef06), X(0x309fb43d), X(0x30af7a65), X(0x30bf417d), X(0x30cf0985), X(0x30ded27a), X(0x30ee9c5d), X(0x30fe672b), X(0x310e32e3), X(0x311dff85), X(0x312dcd0f), X(0x313d9b80), X(0x314d6ad7), X(0x315d3b12), X(0x316d0c30), X(0x317cde31), X(0x318cb113), X(0x319c84d4), X(0x31ac5974), X(0x31bc2ef1), X(0x31cc054b), X(0x31dbdc7f), X(0x31ebb48e), X(0x31fb8d74), X(0x320b6733), X(0x321b41c7), X(0x322b1d31), X(0x323af96e), X(0x324ad67e), X(0x325ab45f), X(0x326a9311), X(0x327a7291), X(0x328a52e0), X(0x329a33fb), X(0x32aa15e1), X(0x32b9f892), X(0x32c9dc0c), X(0x32d9c04d), X(0x32e9a555), X(0x32f98b22), X(0x330971b4), X(0x33195909), X(0x3329411f), X(0x333929f6), X(0x3349138c), X(0x3358fde1), X(0x3368e8f2), X(0x3378d4c0), X(0x3388c147), X(0x3398ae89), X(0x33a89c82), X(0x33b88b32), X(0x33c87a98), X(0x33d86ab2), X(0x33e85b80), X(0x33f84d00), X(0x34083f30), X(0x34183210), X(0x3428259f), X(0x343819db), X(0x34480ec3), X(0x34580455), X(0x3467fa92), X(0x3477f176), X(0x3487e902), X(0x3497e134), X(0x34a7da0a), X(0x34b7d384), X(0x34c7cda0), X(0x34d7c85e), X(0x34e7c3bb), X(0x34f7bfb7), X(0x3507bc50), X(0x3517b985), X(0x3527b756), X(0x3537b5c0), X(0x3547b4c3), X(0x3557b45d), X(0x3567b48d), X(0x3577b552), X(0x3587b6aa), X(0x3597b895), X(0x35a7bb12), X(0x35b7be1e), X(0x35c7c1b9), X(0x35d7c5e1), X(0x35e7ca96), X(0x35f7cfd6), X(0x3607d5a0), X(0x3617dbf3), X(0x3627e2cd), X(0x3637ea2d), X(0x3647f212), X(0x3657fa7b), X(0x36680366), X(0x36780cd2), X(0x368816bf), X(0x3698212b), X(0x36a82c14), X(0x36b83779), X(0x36c8435a), X(0x36d84fb4), X(0x36e85c88), X(0x36f869d2), X(0x37087793), X(0x371885c9), X(0x37289473), X(0x3738a38f), X(0x3748b31d), X(0x3758c31a), X(0x3768d387), X(0x3778e461), X(0x3788f5a7), X(0x37990759), X(0x37a91975), X(0x37b92bf9), X(0x37c93ee4), X(0x37d95236), X(0x37e965ed), X(0x37f97a08), X(0x38098e85), X(0x3819a363), X(0x3829b8a2), X(0x3839ce3f), X(0x3849e43a), X(0x3859fa91), X(0x386a1143), X(0x387a284f), X(0x388a3fb4), X(0x389a5770), X(0x38aa6f83), X(0x38ba87ea), X(0x38caa0a5), X(0x38dab9b2), X(0x38ead311), X(0x38faecbf), X(0x390b06bc), X(0x391b2107), X(0x392b3b9e), X(0x393b5680), X(0x394b71ac), X(0x395b8d20), X(0x396ba8dc), X(0x397bc4dd), X(0x398be124), X(0x399bfdae), X(0x39ac1a7a), X(0x39bc3788), X(0x39cc54d5), X(0x39dc7261), X(0x39ec902a), X(0x39fcae2f), X(0x3a0ccc70), X(0x3a1ceaea), X(0x3a2d099c), X(0x3a3d2885), X(0x3a4d47a5), X(0x3a5d66f9), X(0x3a6d8680), X(0x3a7da63a), X(0x3a8dc625), X(0x3a9de63f), X(0x3aae0688), X(0x3abe26fe), X(0x3ace47a0), X(0x3ade686d), X(0x3aee8963), X(0x3afeaa82), X(0x3b0ecbc7), X(0x3b1eed32), X(0x3b2f0ec2), X(0x3b3f3075), X(0x3b4f524a), X(0x3b5f7440), X(0x3b6f9656), X(0x3b7fb889), X(0x3b8fdada), X(0x3b9ffd46), X(0x3bb01fce), X(0x3bc0426e), X(0x3bd06526), X(0x3be087f6), X(0x3bf0aada), X(0x3c00cdd4), X(0x3c10f0e0), X(0x3c2113fe), X(0x3c31372d), X(0x3c415a6b), X(0x3c517db7), X(0x3c61a110), X(0x3c71c475), X(0x3c81e7e4), X(0x3c920b5c), X(0x3ca22edc), X(0x3cb25262), X(0x3cc275ee), X(0x3cd2997e), X(0x3ce2bd11), X(0x3cf2e0a6), X(0x3d03043b), X(0x3d1327cf), X(0x3d234b61), X(0x3d336ef0), X(0x3d43927a), X(0x3d53b5ff), X(0x3d63d97c), X(0x3d73fcf1), X(0x3d84205c), X(0x3d9443bd), X(0x3da46711), X(0x3db48a58), X(0x3dc4ad91), X(0x3dd4d0ba), X(0x3de4f3d1), X(0x3df516d7), X(0x3e0539c9), X(0x3e155ca6), X(0x3e257f6d), X(0x3e35a21d), X(0x3e45c4b4), X(0x3e55e731), X(0x3e660994), X(0x3e762bda), X(0x3e864e03), X(0x3e96700d), X(0x3ea691f7), X(0x3eb6b3bf), X(0x3ec6d565), X(0x3ed6f6e8), X(0x3ee71845), X(0x3ef7397c), X(0x3f075a8c), X(0x3f177b73), X(0x3f279c30), X(0x3f37bcc2), X(0x3f47dd27), X(0x3f57fd5f), X(0x3f681d68), X(0x3f783d40), X(0x3f885ce7), X(0x3f987c5c), X(0x3fa89b9c), X(0x3fb8baa7), X(0x3fc8d97c), X(0x3fd8f819), X(0x3fe9167e), X(0x3ff934a8), X(0x40095296), X(0x40197049), X(0x40298dbd), X(0x4039aaf2), X(0x4049c7e7), X(0x4059e49a), X(0x406a010a), X(0x407a1d36), X(0x408a391d), X(0x409a54bd), X(0x40aa7015), X(0x40ba8b25), X(0x40caa5ea), X(0x40dac063), X(0x40eada90), X(0x40faf46e), X(0x410b0dfe), X(0x411b273d), X(0x412b402a), X(0x413b58c4), X(0x414b710a), X(0x415b88fa), X(0x416ba093), X(0x417bb7d5), X(0x418bcebe), X(0x419be54c), X(0x41abfb7e), X(0x41bc1153), X(0x41cc26ca), X(0x41dc3be2), X(0x41ec5099), X(0x41fc64ef), X(0x420c78e1), X(0x421c8c6f), X(0x422c9f97), X(0x423cb258), X(0x424cc4b2), X(0x425cd6a2), X(0x426ce827), X(0x427cf941), X(0x428d09ee), X(0x429d1a2c), X(0x42ad29fb), X(0x42bd3959), X(0x42cd4846), X(0x42dd56bf), X(0x42ed64c3), X(0x42fd7252), X(0x430d7f6a), X(0x431d8c0a), X(0x432d9831), X(0x433da3dd), X(0x434daf0d), X(0x435db9c0), X(0x436dc3f5), X(0x437dcdab), X(0x438dd6df), X(0x439ddf92), X(0x43ade7c1), X(0x43bdef6c), X(0x43cdf691), X(0x43ddfd2f), X(0x43ee0345), X(0x43fe08d2), X(0x440e0dd4), X(0x441e124b), X(0x442e1634), X(0x443e198f), X(0x444e1c5a), X(0x445e1e95), X(0x446e203e), X(0x447e2153), X(0x448e21d5), X(0x449e21c0), X(0x44ae2115), X(0x44be1fd1), X(0x44ce1df4), X(0x44de1b7d), X(0x44ee186a), X(0x44fe14ba), X(0x450e106b), X(0x451e0b7e), X(0x452e05ef), X(0x453dffbf), X(0x454df8eb), X(0x455df173), X(0x456de956), X(0x457de092), X(0x458dd726), X(0x459dcd10), X(0x45adc251), X(0x45bdb6e5), X(0x45cdaacd), X(0x45dd9e06), X(0x45ed9091), X(0x45fd826a), X(0x460d7392), X(0x461d6407), X(0x462d53c8), X(0x463d42d4), X(0x464d3129), X(0x465d1ec6), X(0x466d0baa), X(0x467cf7d3), X(0x468ce342), X(0x469ccdf3), X(0x46acb7e7), X(0x46bca11c), X(0x46cc8990), X(0x46dc7143), X(0x46ec5833), X(0x46fc3e5f), X(0x470c23c6), X(0x471c0867), X(0x472bec40), X(0x473bcf50), X(0x474bb196), X(0x475b9311), X(0x476b73c0), X(0x477b53a1), X(0x478b32b4), X(0x479b10f6), X(0x47aaee67), X(0x47bacb06), X(0x47caa6d1), X(0x47da81c7), X(0x47ea5be7), X(0x47fa3530), X(0x480a0da1), X(0x4819e537), X(0x4829bbf3), X(0x483991d3), X(0x484966d6), X(0x48593afb), X(0x48690e3f), X(0x4878e0a3), X(0x4888b225), X(0x489882c4), X(0x48a8527e), X(0x48b82153), X(0x48c7ef41), X(0x48d7bc47), X(0x48e78863), X(0x48f75396), X(0x49071ddc), X(0x4916e736), X(0x4926afa2), X(0x4936771f), X(0x49463dac), X(0x49560347), X(0x4965c7ef), X(0x49758ba4), X(0x49854e63), X(0x4995102c), X(0x49a4d0fe), X(0x49b490d7), X(0x49c44fb6), X(0x49d40d9a), X(0x49e3ca82), X(0x49f3866c), X(0x4a034159), X(0x4a12fb45), X(0x4a22b430), X(0x4a326c19), X(0x4a4222ff), X(0x4a51d8e1), X(0x4a618dbd), X(0x4a714192), X(0x4a80f45f), X(0x4a90a623), X(0x4aa056dd), X(0x4ab0068b), X(0x4abfb52c), X(0x4acf62c0), X(0x4adf0f44), X(0x4aeebab9), X(0x4afe651c), X(0x4b0e0e6c), X(0x4b1db6a9), X(0x4b2d5dd1), X(0x4b3d03e2), X(0x4b4ca8dd), X(0x4b5c4cbf), X(0x4b6bef88), X(0x4b7b9136), X(0x4b8b31c8), X(0x4b9ad13d), X(0x4baa6f93), X(0x4bba0ccb), X(0x4bc9a8e2), X(0x4bd943d7), X(0x4be8dda9), X(0x4bf87658), X(0x4c080de1), X(0x4c17a444), X(0x4c27397f), X(0x4c36cd92), X(0x4c46607b), X(0x4c55f239), X(0x4c6582cb), X(0x4c75122f), X(0x4c84a065), X(0x4c942d6c), X(0x4ca3b942), X(0x4cb343e6), X(0x4cc2cd57), X(0x4cd25594), X(0x4ce1dc9c), X(0x4cf1626d), X(0x4d00e707), X(0x4d106a68), X(0x4d1fec8f), X(0x4d2f6d7a), X(0x4d3eed2a), X(0x4d4e6b9d), X(0x4d5de8d1), X(0x4d6d64c5), X(0x4d7cdf79), X(0x4d8c58eb), X(0x4d9bd11a), X(0x4dab4804), X(0x4dbabdaa), X(0x4dca3209), X(0x4dd9a520), X(0x4de916ef), X(0x4df88774), X(0x4e07f6ae), X(0x4e17649c), X(0x4e26d13c), X(0x4e363c8f), X(0x4e45a692), X(0x4e550f44), X(0x4e6476a4), X(0x4e73dcb2), X(0x4e83416c), X(0x4e92a4d1), X(0x4ea206df), X(0x4eb16796), X(0x4ec0c6f5), X(0x4ed024fa), X(0x4edf81a5), X(0x4eeedcf3), X(0x4efe36e5), X(0x4f0d8f79), X(0x4f1ce6ad), X(0x4f2c3c82), X(0x4f3b90f4), X(0x4f4ae405), X(0x4f5a35b1), X(0x4f6985fa), X(0x4f78d4dc), X(0x4f882257), X(0x4f976e6a), X(0x4fa6b914), X(0x4fb60254), X(0x4fc54a28), X(0x4fd49090), X(0x4fe3d58b), X(0x4ff31917), X(0x50025b33), X(0x50119bde), X(0x5020db17), X(0x503018dd), X(0x503f552f), X(0x504e900b), X(0x505dc971), X(0x506d0160), X(0x507c37d7), X(0x508b6cd3), X(0x509aa055), X(0x50a9d25b), X(0x50b902e4), X(0x50c831ef), X(0x50d75f7b), X(0x50e68b87), X(0x50f5b612), X(0x5104df1a), X(0x5114069f), X(0x51232ca0), X(0x5132511a), X(0x5141740f), X(0x5150957b), X(0x515fb55f), X(0x516ed3b8), X(0x517df087), X(0x518d0bca), X(0x519c257f), X(0x51ab3da7), X(0x51ba543f), X(0x51c96947), X(0x51d87cbd), X(0x51e78ea1), X(0x51f69ef1), X(0x5205adad), X(0x5214bad3), X(0x5223c662), X(0x5232d05a), X(0x5241d8b9), X(0x5250df7d), X(0x525fe4a7), X(0x526ee835), X(0x527dea26), X(0x528cea78), X(0x529be92c), X(0x52aae63f), X(0x52b9e1b0), X(0x52c8db80), X(0x52d7d3ac), X(0x52e6ca33), X(0x52f5bf15), X(0x5304b251), X(0x5313a3e5), X(0x532293d0), X(0x53318212), X(0x53406ea8), X(0x534f5993), X(0x535e42d2), X(0x536d2a62), X(0x537c1043), X(0x538af475), X(0x5399d6f6), X(0x53a8b7c4), X(0x53b796e0), X(0x53c67447), X(0x53d54ffa), X(0x53e429f6), X(0x53f3023b), X(0x5401d8c8), X(0x5410ad9c), X(0x541f80b5), X(0x542e5213), X(0x543d21b5), X(0x544bef9a), X(0x545abbc0), X(0x54698627), X(0x54784ece), X(0x548715b3), X(0x5495dad6), X(0x54a49e35), X(0x54b35fd0), X(0x54c21fa6), X(0x54d0ddb5), X(0x54df99fd), X(0x54ee547c), X(0x54fd0d32), X(0x550bc41d), X(0x551a793d), X(0x55292c91), X(0x5537de16), X(0x55468dce), X(0x55553bb6), X(0x5563e7cd), X(0x55729213), X(0x55813a87), X(0x558fe127), X(0x559e85f2), X(0x55ad28e9), X(0x55bbca08), X(0x55ca6950), X(0x55d906c0), X(0x55e7a257), X(0x55f63c13), X(0x5604d3f4), X(0x561369f8), X(0x5621fe1f), X(0x56309067), X(0x563f20d1), X(0x564daf5a), X(0x565c3c02), X(0x566ac6c7), X(0x56794faa), X(0x5687d6a8), X(0x56965bc1), X(0x56a4def4), X(0x56b36040), X(0x56c1dfa4), X(0x56d05d1f), X(0x56ded8af), X(0x56ed5255), X(0x56fbca0f), X(0x570a3fdc), X(0x5718b3bc), X(0x572725ac), X(0x573595ad), X(0x574403bd), X(0x57526fdb), X(0x5760da07), X(0x576f423f), X(0x577da883), X(0x578c0cd1), X(0x579a6f29), X(0x57a8cf8a), X(0x57b72df2), X(0x57c58a61), X(0x57d3e4d6), X(0x57e23d50), X(0x57f093cd), X(0x57fee84e), X(0x580d3ad1), X(0x581b8b54), X(0x5829d9d8), X(0x5838265c), X(0x584670dd), X(0x5854b95c), X(0x5862ffd8), X(0x5871444f), X(0x587f86c1), X(0x588dc72c), X(0x589c0591), X(0x58aa41ed), X(0x58b87c40), X(0x58c6b489), X(0x58d4eac7), X(0x58e31ef9), X(0x58f1511f), X(0x58ff8137), X(0x590daf40), X(0x591bdb3a), X(0x592a0524), X(0x59382cfc), X(0x594652c2), X(0x59547675), X(0x59629815), X(0x5970b79f), X(0x597ed513), X(0x598cf071), X(0x599b09b7), X(0x59a920e5), X(0x59b735f9), X(0x59c548f4), X(0x59d359d2), X(0x59e16895), X(0x59ef753b), X(0x59fd7fc4), X(0x5a0b882d), X(0x5a198e77), X(0x5a2792a0), X(0x5a3594a9), X(0x5a43948e), X(0x5a519251), X(0x5a5f8df0), X(0x5a6d876a), X(0x5a7b7ebe), X(0x5a8973ec), X(0x5a9766f2), X(0x5aa557d0), X(0x5ab34685), X(0x5ac1330f), X(0x5acf1d6f), X(0x5add05a3), X(0x5aeaebaa), X(0x5af8cf84), X(0x5b06b12f), X(0x5b1490ab), X(0x5b226df7), X(0x5b304912), X(0x5b3e21fc), X(0x5b4bf8b2), X(0x5b59cd35), X(0x5b679f84), X(0x5b756f9e), X(0x5b833d82), X(0x5b91092e), X(0x5b9ed2a3), X(0x5bac99e0), X(0x5bba5ee3), X(0x5bc821ac), X(0x5bd5e23a), X(0x5be3a08c), X(0x5bf15ca1), X(0x5bff1679), X(0x5c0cce12), X(0x5c1a836c), X(0x5c283686), X(0x5c35e760), X(0x5c4395f7), X(0x5c51424c), X(0x5c5eec5e), X(0x5c6c942b), X(0x5c7a39b4), X(0x5c87dcf7), X(0x5c957df3), X(0x5ca31ca8), X(0x5cb0b915), X(0x5cbe5338), X(0x5ccbeb12), X(0x5cd980a1), X(0x5ce713e5), X(0x5cf4a4dd), X(0x5d023387), X(0x5d0fbfe4), X(0x5d1d49f2), X(0x5d2ad1b1), X(0x5d38571f), X(0x5d45da3c), X(0x5d535b08), X(0x5d60d981), X(0x5d6e55a7), X(0x5d7bcf78), X(0x5d8946f5), X(0x5d96bc1c), X(0x5da42eec), X(0x5db19f65), X(0x5dbf0d86), X(0x5dcc794e), X(0x5dd9e2bd), X(0x5de749d1), X(0x5df4ae8a), X(0x5e0210e7), X(0x5e0f70e7), X(0x5e1cce8a), X(0x5e2a29ce), X(0x5e3782b4), X(0x5e44d93a), X(0x5e522d5f), X(0x5e5f7f23), X(0x5e6cce85), X(0x5e7a1b85), X(0x5e876620), X(0x5e94ae58), X(0x5ea1f42a), X(0x5eaf3797), X(0x5ebc789d), X(0x5ec9b73c), X(0x5ed6f372), X(0x5ee42d41), X(0x5ef164a5), X(0x5efe999f), X(0x5f0bcc2f), X(0x5f18fc52), X(0x5f262a09), X(0x5f335553), X(0x5f407e2f), X(0x5f4da49d), X(0x5f5ac89b), X(0x5f67ea29), X(0x5f750946), X(0x5f8225f2), X(0x5f8f402b), X(0x5f9c57f2), X(0x5fa96d44), X(0x5fb68023), X(0x5fc3908c), X(0x5fd09e7f), X(0x5fdda9fc), X(0x5feab302), X(0x5ff7b990), X(0x6004bda5), X(0x6011bf40), X(0x601ebe62), X(0x602bbb09), X(0x6038b534), X(0x6045ace4), X(0x6052a216), X(0x605f94cb), X(0x606c8502), X(0x607972b9), X(0x60865df2), X(0x609346aa), X(0x60a02ce1), X(0x60ad1096), X(0x60b9f1c9), X(0x60c6d079), X(0x60d3aca5), X(0x60e0864d), X(0x60ed5d70), X(0x60fa320d), X(0x61070424), X(0x6113d3b4), X(0x6120a0bc), X(0x612d6b3c), X(0x613a3332), X(0x6146f89f), X(0x6153bb82), X(0x61607bd9), X(0x616d39a5), X(0x6179f4e5), X(0x6186ad98), X(0x619363bd), X(0x61a01753), X(0x61acc85b), X(0x61b976d3), X(0x61c622bc), X(0x61d2cc13), X(0x61df72d8), X(0x61ec170c), X(0x61f8b8ad), X(0x620557ba), X(0x6211f434), X(0x621e8e18), X(0x622b2568), X(0x6237ba21), X(0x62444c44), X(0x6250dbd0), X(0x625d68c4), X(0x6269f320), X(0x62767ae2), X(0x6283000b), X(0x628f829a), X(0x629c028e), X(0x62a87fe6), X(0x62b4faa2), X(0x62c172c2), X(0x62cde844), X(0x62da5b29), X(0x62e6cb6e), X(0x62f33915), X(0x62ffa41c), X(0x630c0c83), X(0x63187248), X(0x6324d56d), X(0x633135ef), X(0x633d93ce), X(0x6349ef0b), X(0x635647a3), X(0x63629d97), X(0x636ef0e6), X(0x637b418f), X(0x63878f92), X(0x6393daef), X(0x63a023a4), X(0x63ac69b1), X(0x63b8ad15), X(0x63c4edd1), X(0x63d12be3), X(0x63dd674b), X(0x63e9a008), X(0x63f5d61a), X(0x64020980), X(0x640e3a39), X(0x641a6846), X(0x642693a5), X(0x6432bc56), X(0x643ee258), X(0x644b05ab), X(0x6457264e), X(0x64634441), X(0x646f5f83), X(0x647b7814), X(0x64878df3), X(0x6493a120), X(0x649fb199), X(0x64abbf5f), X(0x64b7ca71), X(0x64c3d2ce), X(0x64cfd877), X(0x64dbdb69), X(0x64e7dba6), X(0x64f3d92b), X(0x64ffd3fa), X(0x650bcc11), X(0x6517c16f), X(0x6523b415), X(0x652fa402), X(0x653b9134), X(0x65477bad), X(0x6553636a), X(0x655f486d), X(0x656b2ab3), X(0x65770a3d), X(0x6582e70a), X(0x658ec11a), X(0x659a986d), X(0x65a66d00), X(0x65b23ed5), X(0x65be0deb), X(0x65c9da41), X(0x65d5a3d7), X(0x65e16aac), X(0x65ed2ebf), X(0x65f8f011), X(0x6604aea1), X(0x66106a6e), X(0x661c2377), X(0x6627d9be), X(0x66338d40), X(0x663f3dfd), X(0x664aebf5), X(0x66569728), X(0x66623f95), X(0x666de53b), X(0x6679881b), X(0x66852833), X(0x6690c583), X(0x669c600b), X(0x66a7f7ca), X(0x66b38cc0), X(0x66bf1eec), X(0x66caae4f), X(0x66d63ae6), X(0x66e1c4b3), X(0x66ed4bb4), X(0x66f8cfea), X(0x67045153), X(0x670fcfef), X(0x671b4bbe), X(0x6726c4bf), X(0x67323af3), X(0x673dae58), X(0x67491eee), X(0x67548cb5), X(0x675ff7ab), X(0x676b5fd2), X(0x6776c528), X(0x678227ad), X(0x678d8761), X(0x6798e443), X(0x67a43e52), X(0x67af958f), X(0x67bae9f9), X(0x67c63b8f), X(0x67d18a52), X(0x67dcd640), X(0x67e81f59), X(0x67f3659d), X(0x67fea90c), X(0x6809e9a5), X(0x68152768), X(0x68206254), X(0x682b9a68), X(0x6836cfa6), X(0x6842020b), X(0x684d3199), X(0x68585e4d), X(0x68638829), X(0x686eaf2b), X(0x6879d354), X(0x6884f4a2), X(0x68901316), X(0x689b2eb0), X(0x68a6476d), X(0x68b15d50), X(0x68bc7056), X(0x68c78080), X(0x68d28dcd), X(0x68dd983e), X(0x68e89fd0), X(0x68f3a486), X(0x68fea65d), X(0x6909a555), X(0x6914a16f), X(0x691f9aa9), X(0x692a9104), X(0x69358480), X(0x6940751b), X(0x694b62d5), X(0x69564daf), X(0x696135a7), X(0x696c1abe), X(0x6976fcf3), X(0x6981dc46), X(0x698cb8b6), X(0x69979243), X(0x69a268ed), X(0x69ad3cb4), X(0x69b80d97), X(0x69c2db96), X(0x69cda6b0), X(0x69d86ee5), X(0x69e33436), X(0x69edf6a1), X(0x69f8b626), X(0x6a0372c5), X(0x6a0e2c7e), X(0x6a18e350), X(0x6a23973c), X(0x6a2e4840), X(0x6a38f65d), X(0x6a43a191), X(0x6a4e49de), X(0x6a58ef42), X(0x6a6391be), X(0x6a6e3151), X(0x6a78cdfa), X(0x6a8367ba), X(0x6a8dfe90), X(0x6a98927c), X(0x6aa3237d), X(0x6aadb194), X(0x6ab83cc0), X(0x6ac2c500), X(0x6acd4a55), X(0x6ad7ccbf), X(0x6ae24c3c), X(0x6aecc8cd), X(0x6af74271), X(0x6b01b929), X(0x6b0c2cf4), X(0x6b169dd1), X(0x6b210bc1), X(0x6b2b76c2), X(0x6b35ded6), X(0x6b4043fc), X(0x6b4aa632), X(0x6b55057a), X(0x6b5f61d3), X(0x6b69bb3d), X(0x6b7411b7), X(0x6b7e6541), X(0x6b88b5db), X(0x6b930385), X(0x6b9d4e3f), X(0x6ba79607), X(0x6bb1dadf), X(0x6bbc1cc6), X(0x6bc65bbb), X(0x6bd097bf), X(0x6bdad0d0), X(0x6be506f0), X(0x6bef3a1d), X(0x6bf96a58), X(0x6c0397a0), X(0x6c0dc1f5), X(0x6c17e957), X(0x6c220dc6), X(0x6c2c2f41), X(0x6c364dc9), X(0x6c40695c), X(0x6c4a81fc), X(0x6c5497a7), X(0x6c5eaa5d), X(0x6c68ba1f), X(0x6c72c6eb), X(0x6c7cd0c3), X(0x6c86d7a6), X(0x6c90db92), X(0x6c9adc8a), X(0x6ca4da8b), X(0x6caed596), X(0x6cb8cdab), X(0x6cc2c2ca), X(0x6cccb4f2), X(0x6cd6a424), X(0x6ce0905e), X(0x6cea79a1), X(0x6cf45fee), X(0x6cfe4342), X(0x6d0823a0), X(0x6d120105), X(0x6d1bdb73), X(0x6d25b2e8), X(0x6d2f8765), X(0x6d3958ea), X(0x6d432777), X(0x6d4cf30a), X(0x6d56bba5), X(0x6d608147), X(0x6d6a43f0), X(0x6d7403a0), X(0x6d7dc056), X(0x6d877a13), X(0x6d9130d6), X(0x6d9ae4a0), X(0x6da4956f), X(0x6dae4345), X(0x6db7ee20), X(0x6dc19601), X(0x6dcb3ae7), X(0x6dd4dcd3), X(0x6dde7bc4), X(0x6de817bb), X(0x6df1b0b6), X(0x6dfb46b7), X(0x6e04d9bc), X(0x6e0e69c7), X(0x6e17f6d5), X(0x6e2180e9), X(0x6e2b0801), X(0x6e348c1d), X(0x6e3e0d3d), X(0x6e478b62), X(0x6e51068a), X(0x6e5a7eb7), X(0x6e63f3e7), X(0x6e6d661b), X(0x6e76d552), X(0x6e80418e), X(0x6e89aacc), X(0x6e93110f), X(0x6e9c7454), X(0x6ea5d49d), X(0x6eaf31e9), X(0x6eb88c37), X(0x6ec1e389), X(0x6ecb37de), X(0x6ed48936), X(0x6eddd790), X(0x6ee722ee), X(0x6ef06b4d), X(0x6ef9b0b0), X(0x6f02f315), X(0x6f0c327c), X(0x6f156ee6), X(0x6f1ea852), X(0x6f27dec1), X(0x6f311232), X(0x6f3a42a5), X(0x6f43701a), X(0x6f4c9a91), X(0x6f55c20a), X(0x6f5ee686), X(0x6f680803), X(0x6f712682), X(0x6f7a4203), X(0x6f835a86), X(0x6f8c700b), X(0x6f958291), X(0x6f9e921a), X(0x6fa79ea4), X(0x6fb0a830), X(0x6fb9aebd), X(0x6fc2b24c), X(0x6fcbb2dd), X(0x6fd4b06f), X(0x6fddab03), X(0x6fe6a299), X(0x6fef9730), X(0x6ff888c9), X(0x70017763), X(0x700a62ff), X(0x70134b9c), X(0x701c313b), X(0x702513dc), X(0x702df37e), X(0x7036d021), X(0x703fa9c6), X(0x7048806d), X(0x70515415), X(0x705a24bf), X(0x7062f26b), X(0x706bbd17), X(0x707484c6), X(0x707d4976), X(0x70860b28), X(0x708ec9dc), X(0x70978591), X(0x70a03e48), X(0x70a8f400), X(0x70b1a6bb), X(0x70ba5677), X(0x70c30335), X(0x70cbacf5), X(0x70d453b6), X(0x70dcf77a), X(0x70e59840), X(0x70ee3607), X(0x70f6d0d1), X(0x70ff689d), X(0x7107fd6b), X(0x71108f3b), X(0x71191e0d), X(0x7121a9e2), X(0x712a32b9), X(0x7132b892), X(0x713b3b6e), X(0x7143bb4c), X(0x714c382d), X(0x7154b211), X(0x715d28f7), X(0x71659ce0), X(0x716e0dcc), X(0x71767bbb), X(0x717ee6ac), X(0x71874ea1), X(0x718fb399), X(0x71981594), X(0x71a07493), X(0x71a8d094), X(0x71b1299a), X(0x71b97fa2), X(0x71c1d2af), X(0x71ca22bf), X(0x71d26fd2), X(0x71dab9ea), X(0x71e30106), X(0x71eb4526), X(0x71f3864a), X(0x71fbc472), X(0x7203ff9e), X(0x720c37cf), X(0x72146d05), X(0x721c9f3f), X(0x7224ce7e), X(0x722cfac2), X(0x7235240b), X(0x723d4a59), X(0x72456dad), X(0x724d8e05), X(0x7255ab63), X(0x725dc5c7), X(0x7265dd31), X(0x726df1a0), X(0x72760315), X(0x727e1191), X(0x72861d12), X(0x728e259a), X(0x72962b28), X(0x729e2dbd), X(0x72a62d59), X(0x72ae29fc), X(0x72b623a5), X(0x72be1a56), X(0x72c60e0e), X(0x72cdfece), X(0x72d5ec95), X(0x72ddd764), X(0x72e5bf3b), X(0x72eda41a), X(0x72f58601), X(0x72fd64f1), X(0x730540e9), X(0x730d19e9), X(0x7314eff3), X(0x731cc305), X(0x73249321), X(0x732c6046), X(0x73342a75), X(0x733bf1ad), X(0x7343b5ef), X(0x734b773b), X(0x73533591), X(0x735af0f2), X(0x7362a95d), X(0x736a5ed3), X(0x73721153), X(0x7379c0df), X(0x73816d76), X(0x73891719), X(0x7390bdc7), X(0x73986181), X(0x73a00247), X(0x73a7a01a), X(0x73af3af8), X(0x73b6d2e4), X(0x73be67dc), X(0x73c5f9e1), X(0x73cd88f3), X(0x73d51513), X(0x73dc9e40), X(0x73e4247c), X(0x73eba7c5), X(0x73f3281c), X(0x73faa582), X(0x74021ff7), X(0x7409977b), X(0x74110c0d), X(0x74187daf), X(0x741fec61), X(0x74275822), X(0x742ec0f3), X(0x743626d5), X(0x743d89c7), X(0x7444e9c9), X(0x744c46dd), X(0x7453a101), X(0x745af837), X(0x74624c7f), X(0x74699dd8), X(0x7470ec44), X(0x747837c2), X(0x747f8052), X(0x7486c5f5), X(0x748e08ac), X(0x74954875), X(0x749c8552), X(0x74a3bf43), X(0x74aaf648), X(0x74b22a62), X(0x74b95b90), X(0x74c089d2), X(0x74c7b52a), X(0x74cedd97), X(0x74d6031a), X(0x74dd25b2), X(0x74e44561), X(0x74eb6226), X(0x74f27c02), X(0x74f992f5), X(0x7500a6ff), X(0x7507b820), X(0x750ec659), X(0x7515d1aa), X(0x751cda14), X(0x7523df96), X(0x752ae231), X(0x7531e1e5), X(0x7538deb2), X(0x753fd89a), X(0x7546cf9b), X(0x754dc3b7), X(0x7554b4ed), X(0x755ba33e), X(0x75628eaa), X(0x75697732), X(0x75705cd5), X(0x75773f95), X(0x757e1f71), X(0x7584fc6a), X(0x758bd67f), X(0x7592adb2), X(0x75998203), X(0x75a05371), X(0x75a721fe), X(0x75adeda9), X(0x75b4b673), X(0x75bb7c5c), X(0x75c23f65), X(0x75c8ff8d), X(0x75cfbcd6), X(0x75d6773f), X(0x75dd2ec8), X(0x75e3e373), X(0x75ea953f), X(0x75f1442d), X(0x75f7f03d), X(0x75fe996f), X(0x76053fc5), X(0x760be33d), X(0x761283d8), X(0x76192197), X(0x761fbc7b), X(0x76265482), X(0x762ce9af), X(0x76337c01), X(0x763a0b78), X(0x76409814), X(0x764721d7), X(0x764da8c1), X(0x76542cd1), X(0x765aae08), X(0x76612c67), X(0x7667a7ee), X(0x766e209d), X(0x76749675), X(0x767b0975), X(0x7681799f), X(0x7687e6f3), X(0x768e5170), X(0x7694b918), X(0x769b1deb), X(0x76a17fe9), X(0x76a7df13), X(0x76ae3b68), X(0x76b494ea), X(0x76baeb98), X(0x76c13f74), X(0x76c7907c), X(0x76cddeb3), X(0x76d42a18), X(0x76da72ab), X(0x76e0b86d), X(0x76e6fb5e), X(0x76ed3b7f), X(0x76f378d0), X(0x76f9b352), X(0x76ffeb05), X(0x77061fe8), X(0x770c51fe), X(0x77128145), X(0x7718adbf), X(0x771ed76c), X(0x7724fe4c), X(0x772b225f), X(0x773143a7), X(0x77376223), X(0x773d7dd3), X(0x774396ba), X(0x7749acd5), X(0x774fc027), X(0x7755d0af), X(0x775bde6f), X(0x7761e965), X(0x7767f193), X(0x776df6fa), X(0x7773f998), X(0x7779f970), X(0x777ff681), X(0x7785f0cd), X(0x778be852), X(0x7791dd12), X(0x7797cf0d), X(0x779dbe43), X(0x77a3aab6), X(0x77a99465), X(0x77af7b50), X(0x77b55f79), X(0x77bb40e0), X(0x77c11f85), X(0x77c6fb68), X(0x77ccd48a), X(0x77d2aaec), X(0x77d87e8d), X(0x77de4f6f), X(0x77e41d92), X(0x77e9e8f5), X(0x77efb19b), X(0x77f57782), X(0x77fb3aad), X(0x7800fb1a), X(0x7806b8ca), X(0x780c73bf), X(0x78122bf7), X(0x7817e175), X(0x781d9438), X(0x78234440), X(0x7828f18f), X(0x782e9c25), X(0x78344401), X(0x7839e925), X(0x783f8b92), X(0x78452b46), X(0x784ac844), X(0x7850628b), X(0x7855fa1c), X(0x785b8ef8), X(0x7861211e), X(0x7866b090), X(0x786c3d4d), X(0x7871c757), X(0x78774ead), X(0x787cd351), X(0x78825543), X(0x7887d483), X(0x788d5111), X(0x7892caef), X(0x7898421c), X(0x789db69a), X(0x78a32868), X(0x78a89787), X(0x78ae03f8), X(0x78b36dbb), X(0x78b8d4d1), X(0x78be393a), X(0x78c39af6), X(0x78c8fa06), X(0x78ce566c), X(0x78d3b026), X(0x78d90736), X(0x78de5b9c), X(0x78e3ad58), X(0x78e8fc6c), X(0x78ee48d7), X(0x78f3929b), X(0x78f8d9b7), X(0x78fe1e2c), X(0x79035ffb), X(0x79089f24), X(0x790ddba8), X(0x79131587), X(0x79184cc2), X(0x791d8159), X(0x7922b34d), X(0x7927e29e), X(0x792d0f4d), X(0x7932395a), X(0x793760c6), X(0x793c8591), X(0x7941a7bd), X(0x7946c749), X(0x794be435), X(0x7950fe84), X(0x79561634), X(0x795b2b47), X(0x79603dbc), X(0x79654d96), X(0x796a5ad4), X(0x796f6576), X(0x79746d7e), X(0x797972eb), X(0x797e75bf), X(0x798375f9), X(0x7988739b), X(0x798d6ea5), X(0x79926717), X(0x79975cf2), X(0x799c5037), X(0x79a140e6), X(0x79a62f00), X(0x79ab1a85), X(0x79b00376), X(0x79b4e9d3), X(0x79b9cd9d), X(0x79beaed4), X(0x79c38d79), X(0x79c8698d), X(0x79cd4310), X(0x79d21a03), X(0x79d6ee66), X(0x79dbc03a), X(0x79e08f7f), X(0x79e55c36), X(0x79ea265f), X(0x79eeedfc), X(0x79f3b30c), X(0x79f87590), X(0x79fd3589), X(0x7a01f2f7), X(0x7a06addc), X(0x7a0b6636), X(0x7a101c08), X(0x7a14cf52), X(0x7a198013), X(0x7a1e2e4d), X(0x7a22da01), X(0x7a27832f), X(0x7a2c29d7), X(0x7a30cdfa), X(0x7a356f99), X(0x7a3a0eb4), X(0x7a3eab4c), X(0x7a434561), X(0x7a47dcf5), X(0x7a4c7207), X(0x7a510498), X(0x7a5594a9), X(0x7a5a223a), X(0x7a5ead4d), X(0x7a6335e0), X(0x7a67bbf6), X(0x7a6c3f8f), X(0x7a70c0ab), X(0x7a753f4b), X(0x7a79bb6f), X(0x7a7e3519), X(0x7a82ac48), X(0x7a8720fe), X(0x7a8b933b), X(0x7a9002ff), X(0x7a94704b), X(0x7a98db20), X(0x7a9d437e), X(0x7aa1a967), X(0x7aa60cd9), X(0x7aaa6dd7), X(0x7aaecc61), X(0x7ab32877), X(0x7ab7821b), X(0x7abbd94b), X(0x7ac02e0a), X(0x7ac48058), X(0x7ac8d035), X(0x7acd1da3), X(0x7ad168a1), X(0x7ad5b130), X(0x7ad9f751), X(0x7ade3b05), X(0x7ae27c4c), X(0x7ae6bb27), X(0x7aeaf796), X(0x7aef319a), X(0x7af36934), X(0x7af79e64), X(0x7afbd12c), X(0x7b00018a), X(0x7b042f81), X(0x7b085b10), X(0x7b0c8439), X(0x7b10aafc), X(0x7b14cf5a), X(0x7b18f153), X(0x7b1d10e8), X(0x7b212e1a), X(0x7b2548e9), X(0x7b296155), X(0x7b2d7761), X(0x7b318b0b), X(0x7b359c55), X(0x7b39ab3f), X(0x7b3db7cb), X(0x7b41c1f8), X(0x7b45c9c8), X(0x7b49cf3b), X(0x7b4dd251), X(0x7b51d30b), X(0x7b55d16b), X(0x7b59cd70), X(0x7b5dc71b), X(0x7b61be6d), X(0x7b65b366), X(0x7b69a608), X(0x7b6d9653), X(0x7b718447), X(0x7b756fe5), X(0x7b79592e), X(0x7b7d4022), X(0x7b8124c3), X(0x7b850710), X(0x7b88e70a), X(0x7b8cc4b3), X(0x7b90a00a), X(0x7b947911), X(0x7b984fc8), X(0x7b9c242f), X(0x7b9ff648), X(0x7ba3c612), X(0x7ba79390), X(0x7bab5ec1), X(0x7baf27a5), X(0x7bb2ee3f), X(0x7bb6b28e), X(0x7bba7493), X(0x7bbe344e), X(0x7bc1f1c1), X(0x7bc5acec), X(0x7bc965cf), X(0x7bcd1c6c), X(0x7bd0d0c3), X(0x7bd482d4), X(0x7bd832a1), X(0x7bdbe02a), X(0x7bdf8b70), X(0x7be33473), X(0x7be6db34), X(0x7bea7fb4), X(0x7bee21f4), X(0x7bf1c1f3), X(0x7bf55fb3), X(0x7bf8fb35), X(0x7bfc9479), X(0x7c002b7f), X(0x7c03c04a), X(0x7c0752d8), X(0x7c0ae32b), X(0x7c0e7144), X(0x7c11fd23), X(0x7c1586c9), X(0x7c190e36), X(0x7c1c936c), X(0x7c20166b), X(0x7c239733), X(0x7c2715c6), X(0x7c2a9224), X(0x7c2e0c4e), X(0x7c318444), X(0x7c34fa07), X(0x7c386d98), X(0x7c3bdef8), X(0x7c3f4e26), X(0x7c42bb25), X(0x7c4625f4), X(0x7c498e95), X(0x7c4cf507), X(0x7c50594c), X(0x7c53bb65), X(0x7c571b51), X(0x7c5a7913), X(0x7c5dd4aa), X(0x7c612e17), X(0x7c64855b), X(0x7c67da76), X(0x7c6b2d6a), X(0x7c6e7e37), X(0x7c71ccdd), X(0x7c75195e), X(0x7c7863ba), X(0x7c7babf1), X(0x7c7ef206), X(0x7c8235f7), X(0x7c8577c6), X(0x7c88b774), X(0x7c8bf502), X(0x7c8f306f), X(0x7c9269bd), X(0x7c95a0ec), X(0x7c98d5fe), X(0x7c9c08f2), X(0x7c9f39cb), X(0x7ca26887), X(0x7ca59528), X(0x7ca8bfb0), X(0x7cabe81d), X(0x7caf0e72), X(0x7cb232af), X(0x7cb554d4), X(0x7cb874e2), X(0x7cbb92db), X(0x7cbeaebe), X(0x7cc1c88d), X(0x7cc4e047), X(0x7cc7f5ef), X(0x7ccb0984), X(0x7cce1b08), X(0x7cd12a7b), X(0x7cd437dd), X(0x7cd74330), X(0x7cda4c74), X(0x7cdd53aa), X(0x7ce058d3), X(0x7ce35bef), X(0x7ce65cff), X(0x7ce95c04), X(0x7cec58ff), X(0x7cef53f0), X(0x7cf24cd7), X(0x7cf543b7), X(0x7cf8388f), X(0x7cfb2b60), X(0x7cfe1c2b), X(0x7d010af1), X(0x7d03f7b2), X(0x7d06e26f), X(0x7d09cb29), X(0x7d0cb1e0), X(0x7d0f9696), X(0x7d12794b), X(0x7d1559ff), X(0x7d1838b4), X(0x7d1b156a), X(0x7d1df022), X(0x7d20c8dd), X(0x7d239f9b), X(0x7d26745e), X(0x7d294725), X(0x7d2c17f1), X(0x7d2ee6c4), X(0x7d31b39f), X(0x7d347e81), X(0x7d37476b), X(0x7d3a0e5f), X(0x7d3cd35d), X(0x7d3f9665), X(0x7d425779), X(0x7d451699), X(0x7d47d3c6), X(0x7d4a8f01), X(0x7d4d484b), X(0x7d4fffa3), X(0x7d52b50c), X(0x7d556885), X(0x7d581a0f), X(0x7d5ac9ac), X(0x7d5d775c), X(0x7d60231f), X(0x7d62ccf6), X(0x7d6574e3), X(0x7d681ae6), X(0x7d6abeff), X(0x7d6d612f), X(0x7d700178), X(0x7d729fd9), X(0x7d753c54), X(0x7d77d6e9), X(0x7d7a6f9a), X(0x7d7d0666), X(0x7d7f9b4f), X(0x7d822e55), X(0x7d84bf79), X(0x7d874ebc), X(0x7d89dc1e), X(0x7d8c67a1), X(0x7d8ef144), X(0x7d91790a), X(0x7d93fef2), X(0x7d9682fd), X(0x7d99052d), X(0x7d9b8581), X(0x7d9e03fb), X(0x7da0809b), X(0x7da2fb62), X(0x7da57451), X(0x7da7eb68), X(0x7daa60a8), X(0x7dacd413), X(0x7daf45a9), X(0x7db1b56a), X(0x7db42357), X(0x7db68f71), X(0x7db8f9b9), X(0x7dbb6230), X(0x7dbdc8d6), X(0x7dc02dac), X(0x7dc290b3), X(0x7dc4f1eb), X(0x7dc75156), X(0x7dc9aef4), X(0x7dcc0ac5), X(0x7dce64cc), X(0x7dd0bd07), X(0x7dd31379), X(0x7dd56821), X(0x7dd7bb01), X(0x7dda0c1a), X(0x7ddc5b6b), X(0x7ddea8f7), X(0x7de0f4bd), X(0x7de33ebe), X(0x7de586fc), X(0x7de7cd76), X(0x7dea122e), X(0x7dec5525), X(0x7dee965a), X(0x7df0d5d0), X(0x7df31386), X(0x7df54f7e), X(0x7df789b8), X(0x7df9c235), X(0x7dfbf8f5), X(0x7dfe2dfa), X(0x7e006145), X(0x7e0292d5), X(0x7e04c2ac), X(0x7e06f0cb), X(0x7e091d32), X(0x7e0b47e1), X(0x7e0d70db), X(0x7e0f981f), X(0x7e11bdaf), X(0x7e13e18a), X(0x7e1603b3), X(0x7e182429), X(0x7e1a42ed), X(0x7e1c6001), X(0x7e1e7b64), X(0x7e209518), X(0x7e22ad1d), X(0x7e24c375), X(0x7e26d81f), X(0x7e28eb1d), X(0x7e2afc70), X(0x7e2d0c17), X(0x7e2f1a15), X(0x7e31266a), X(0x7e333115), X(0x7e353a1a), X(0x7e374177), X(0x7e39472e), X(0x7e3b4b3f), X(0x7e3d4dac), X(0x7e3f4e75), X(0x7e414d9a), X(0x7e434b1e), X(0x7e4546ff), X(0x7e474140), X(0x7e4939e0), X(0x7e4b30e2), X(0x7e4d2644), X(0x7e4f1a09), X(0x7e510c30), X(0x7e52fcbc), X(0x7e54ebab), X(0x7e56d900), X(0x7e58c4bb), X(0x7e5aaedd), X(0x7e5c9766), X(0x7e5e7e57), X(0x7e6063b2), X(0x7e624776), X(0x7e6429a5), X(0x7e660a3f), X(0x7e67e945), X(0x7e69c6b8), X(0x7e6ba299), X(0x7e6d7ce7), X(0x7e6f55a5), X(0x7e712cd3), X(0x7e730272), X(0x7e74d682), X(0x7e76a904), X(0x7e7879f9), X(0x7e7a4962), X(0x7e7c173f), X(0x7e7de392), X(0x7e7fae5a), X(0x7e817799), X(0x7e833f50), X(0x7e85057f), X(0x7e86ca27), X(0x7e888d49), X(0x7e8a4ee5), X(0x7e8c0efd), X(0x7e8dcd91), X(0x7e8f8aa1), X(0x7e914630), X(0x7e93003c), X(0x7e94b8c8), X(0x7e966fd4), X(0x7e982560), X(0x7e99d96e), X(0x7e9b8bfe), X(0x7e9d3d10), X(0x7e9eeca7), X(0x7ea09ac2), X(0x7ea24762), X(0x7ea3f288), X(0x7ea59c35), X(0x7ea7446a), X(0x7ea8eb27), X(0x7eaa906c), X(0x7eac343c), X(0x7eadd696), X(0x7eaf777b), X(0x7eb116ed), X(0x7eb2b4eb), X(0x7eb45177), X(0x7eb5ec91), X(0x7eb7863b), X(0x7eb91e74), X(0x7ebab53e), X(0x7ebc4a99), X(0x7ebdde87), X(0x7ebf7107), X(0x7ec1021b), X(0x7ec291c3), X(0x7ec42001), X(0x7ec5acd5), X(0x7ec7383f), X(0x7ec8c241), X(0x7eca4adb), X(0x7ecbd20d), X(0x7ecd57da), X(0x7ecedc41), X(0x7ed05f44), X(0x7ed1e0e2), X(0x7ed3611d), X(0x7ed4dff6), X(0x7ed65d6d), X(0x7ed7d983), X(0x7ed95438), X(0x7edacd8f), X(0x7edc4586), X(0x7eddbc20), X(0x7edf315c), X(0x7ee0a53c), X(0x7ee217c1), X(0x7ee388ea), X(0x7ee4f8b9), X(0x7ee6672f), X(0x7ee7d44c), X(0x7ee94012), X(0x7eeaaa80), X(0x7eec1397), X(0x7eed7b59), X(0x7eeee1c6), X(0x7ef046df), X(0x7ef1aaa5), X(0x7ef30d18), X(0x7ef46e39), X(0x7ef5ce09), X(0x7ef72c88), X(0x7ef889b8), X(0x7ef9e599), X(0x7efb402c), X(0x7efc9972), X(0x7efdf16b), X(0x7eff4818), X(0x7f009d79), X(0x7f01f191), X(0x7f03445f), X(0x7f0495e4), X(0x7f05e620), X(0x7f073516), X(0x7f0882c5), X(0x7f09cf2d), X(0x7f0b1a51), X(0x7f0c6430), X(0x7f0daccc), X(0x7f0ef425), X(0x7f103a3b), X(0x7f117f11), X(0x7f12c2a5), X(0x7f1404fa), X(0x7f15460f), X(0x7f1685e6), X(0x7f17c47f), X(0x7f1901db), X(0x7f1a3dfb), X(0x7f1b78e0), X(0x7f1cb28a), X(0x7f1deafa), X(0x7f1f2231), X(0x7f20582f), X(0x7f218cf5), X(0x7f22c085), X(0x7f23f2de), X(0x7f252401), X(0x7f2653f0), X(0x7f2782ab), X(0x7f28b032), X(0x7f29dc87), X(0x7f2b07aa), X(0x7f2c319c), X(0x7f2d5a5e), X(0x7f2e81f0), X(0x7f2fa853), X(0x7f30cd88), X(0x7f31f18f), X(0x7f33146a), X(0x7f343619), X(0x7f35569c), X(0x7f3675f6), X(0x7f379425), X(0x7f38b12c), X(0x7f39cd0a), X(0x7f3ae7c0), X(0x7f3c0150), X(0x7f3d19ba), X(0x7f3e30fe), X(0x7f3f471e), X(0x7f405c1a), X(0x7f416ff3), X(0x7f4282a9), X(0x7f43943e), X(0x7f44a4b2), X(0x7f45b405), X(0x7f46c239), X(0x7f47cf4e), X(0x7f48db45), X(0x7f49e61f), X(0x7f4aefdc), X(0x7f4bf87e), X(0x7f4d0004), X(0x7f4e0670), X(0x7f4f0bc2), X(0x7f500ffb), X(0x7f51131c), X(0x7f521525), X(0x7f531618), X(0x7f5415f4), X(0x7f5514bb), X(0x7f56126e), X(0x7f570f0c), X(0x7f580a98), X(0x7f590511), X(0x7f59fe78), X(0x7f5af6ce), X(0x7f5bee14), X(0x7f5ce44a), X(0x7f5dd972), X(0x7f5ecd8b), X(0x7f5fc097), X(0x7f60b296), X(0x7f61a389), X(0x7f629370), X(0x7f63824e), X(0x7f647021), X(0x7f655ceb), X(0x7f6648ad), X(0x7f673367), X(0x7f681d19), X(0x7f6905c6), X(0x7f69ed6d), X(0x7f6ad40f), X(0x7f6bb9ad), X(0x7f6c9e48), X(0x7f6d81e0), X(0x7f6e6475), X(0x7f6f460a), X(0x7f70269d), X(0x7f710631), X(0x7f71e4c6), X(0x7f72c25c), X(0x7f739ef4), X(0x7f747a8f), X(0x7f75552e), X(0x7f762ed1), X(0x7f770779), X(0x7f77df27), X(0x7f78b5db), X(0x7f798b97), X(0x7f7a605a), X(0x7f7b3425), X(0x7f7c06fa), X(0x7f7cd8d9), X(0x7f7da9c2), X(0x7f7e79b7), X(0x7f7f48b8), X(0x7f8016c5), X(0x7f80e3e0), X(0x7f81b009), X(0x7f827b40), X(0x7f834588), X(0x7f840edf), X(0x7f84d747), X(0x7f859ec1), X(0x7f86654d), X(0x7f872aec), X(0x7f87ef9e), X(0x7f88b365), X(0x7f897641), X(0x7f8a3832), X(0x7f8af93a), X(0x7f8bb959), X(0x7f8c7890), X(0x7f8d36df), X(0x7f8df448), X(0x7f8eb0ca), X(0x7f8f6c67), X(0x7f90271e), X(0x7f90e0f2), X(0x7f9199e2), X(0x7f9251f0), X(0x7f93091b), X(0x7f93bf65), X(0x7f9474ce), X(0x7f952958), X(0x7f95dd01), X(0x7f968fcd), X(0x7f9741ba), X(0x7f97f2ca), X(0x7f98a2fd), X(0x7f995254), X(0x7f9a00d0), X(0x7f9aae71), X(0x7f9b5b38), X(0x7f9c0726), X(0x7f9cb23b), X(0x7f9d5c78), X(0x7f9e05de), X(0x7f9eae6e), X(0x7f9f5627), X(0x7f9ffd0b), X(0x7fa0a31b), X(0x7fa14856), X(0x7fa1ecbf), X(0x7fa29054), X(0x7fa33318), X(0x7fa3d50b), X(0x7fa4762c), X(0x7fa5167e), X(0x7fa5b601), X(0x7fa654b5), X(0x7fa6f29b), X(0x7fa78fb3), X(0x7fa82bff), X(0x7fa8c77f), X(0x7fa96234), X(0x7fa9fc1e), X(0x7faa953e), X(0x7fab2d94), X(0x7fabc522), X(0x7fac5be8), X(0x7facf1e6), X(0x7fad871d), X(0x7fae1b8f), X(0x7faeaf3b), X(0x7faf4222), X(0x7fafd445), X(0x7fb065a4), X(0x7fb0f641), X(0x7fb1861b), X(0x7fb21534), X(0x7fb2a38c), X(0x7fb33124), X(0x7fb3bdfb), X(0x7fb44a14), X(0x7fb4d56f), X(0x7fb5600c), X(0x7fb5e9ec), X(0x7fb6730f), X(0x7fb6fb76), X(0x7fb78323), X(0x7fb80a15), X(0x7fb8904d), X(0x7fb915cc), X(0x7fb99a92), X(0x7fba1ea0), X(0x7fbaa1f7), X(0x7fbb2497), X(0x7fbba681), X(0x7fbc27b5), X(0x7fbca835), X(0x7fbd2801), X(0x7fbda719), X(0x7fbe257e), X(0x7fbea331), X(0x7fbf2032), X(0x7fbf9c82), X(0x7fc01821), X(0x7fc09311), X(0x7fc10d52), X(0x7fc186e4), X(0x7fc1ffc8), X(0x7fc277ff), X(0x7fc2ef89), X(0x7fc36667), X(0x7fc3dc9a), X(0x7fc45221), X(0x7fc4c6ff), X(0x7fc53b33), X(0x7fc5aebe), X(0x7fc621a0), X(0x7fc693db), X(0x7fc7056f), X(0x7fc7765c), X(0x7fc7e6a3), X(0x7fc85645), X(0x7fc8c542), X(0x7fc9339b), X(0x7fc9a150), X(0x7fca0e63), X(0x7fca7ad3), X(0x7fcae6a2), X(0x7fcb51cf), X(0x7fcbbc5c), X(0x7fcc2649), X(0x7fcc8f97), X(0x7fccf846), X(0x7fcd6058), X(0x7fcdc7cb), X(0x7fce2ea2), X(0x7fce94dd), X(0x7fcefa7b), X(0x7fcf5f7f), X(0x7fcfc3e8), X(0x7fd027b7), X(0x7fd08aed), X(0x7fd0ed8b), X(0x7fd14f90), X(0x7fd1b0fd), X(0x7fd211d4), X(0x7fd27214), X(0x7fd2d1bf), X(0x7fd330d4), X(0x7fd38f55), X(0x7fd3ed41), X(0x7fd44a9a), X(0x7fd4a761), X(0x7fd50395), X(0x7fd55f37), X(0x7fd5ba48), X(0x7fd614c9), X(0x7fd66eba), X(0x7fd6c81b), X(0x7fd720ed), X(0x7fd77932), X(0x7fd7d0e8), X(0x7fd82812), X(0x7fd87eae), X(0x7fd8d4bf), X(0x7fd92a45), X(0x7fd97f40), X(0x7fd9d3b0), X(0x7fda2797), X(0x7fda7af5), X(0x7fdacdca), X(0x7fdb2018), X(0x7fdb71dd), X(0x7fdbc31c), X(0x7fdc13d5), X(0x7fdc6408), X(0x7fdcb3b6), X(0x7fdd02df), X(0x7fdd5184), X(0x7fdd9fa5), X(0x7fdded44), X(0x7fde3a60), X(0x7fde86fb), X(0x7fded314), X(0x7fdf1eac), X(0x7fdf69c4), X(0x7fdfb45d), X(0x7fdffe76), X(0x7fe04811), X(0x7fe0912e), X(0x7fe0d9ce), X(0x7fe121f0), X(0x7fe16996), X(0x7fe1b0c1), X(0x7fe1f770), X(0x7fe23da4), X(0x7fe2835f), X(0x7fe2c89f), X(0x7fe30d67), X(0x7fe351b5), X(0x7fe3958c), X(0x7fe3d8ec), X(0x7fe41bd4), X(0x7fe45e46), X(0x7fe4a042), X(0x7fe4e1c8), X(0x7fe522da), X(0x7fe56378), X(0x7fe5a3a1), X(0x7fe5e358), X(0x7fe6229b), X(0x7fe6616d), X(0x7fe69fcc), X(0x7fe6ddbb), X(0x7fe71b39), X(0x7fe75847), X(0x7fe794e5), X(0x7fe7d114), X(0x7fe80cd5), X(0x7fe84827), X(0x7fe8830c), X(0x7fe8bd84), X(0x7fe8f78f), X(0x7fe9312f), X(0x7fe96a62), X(0x7fe9a32b), X(0x7fe9db8a), X(0x7fea137e), X(0x7fea4b09), X(0x7fea822b), X(0x7feab8e5), X(0x7feaef37), X(0x7feb2521), X(0x7feb5aa4), X(0x7feb8fc1), X(0x7febc478), X(0x7febf8ca), X(0x7fec2cb6), X(0x7fec603e), X(0x7fec9363), X(0x7fecc623), X(0x7fecf881), X(0x7fed2a7c), X(0x7fed5c16), X(0x7fed8d4e), X(0x7fedbe24), X(0x7fedee9b), X(0x7fee1eb1), X(0x7fee4e68), X(0x7fee7dc0), X(0x7feeacb9), X(0x7feedb54), X(0x7fef0991), X(0x7fef3771), X(0x7fef64f5), X(0x7fef921d), X(0x7fefbee8), X(0x7fefeb59), X(0x7ff0176f), X(0x7ff0432a), X(0x7ff06e8c), X(0x7ff09995), X(0x7ff0c444), X(0x7ff0ee9c), X(0x7ff1189b), X(0x7ff14243), X(0x7ff16b94), X(0x7ff1948e), X(0x7ff1bd32), X(0x7ff1e581), X(0x7ff20d7b), X(0x7ff2351f), X(0x7ff25c70), X(0x7ff2836d), X(0x7ff2aa17), X(0x7ff2d06d), X(0x7ff2f672), X(0x7ff31c24), X(0x7ff34185), X(0x7ff36695), X(0x7ff38b55), X(0x7ff3afc4), X(0x7ff3d3e4), X(0x7ff3f7b4), X(0x7ff41b35), X(0x7ff43e69), X(0x7ff4614e), X(0x7ff483e6), X(0x7ff4a631), X(0x7ff4c82f), X(0x7ff4e9e1), X(0x7ff50b47), X(0x7ff52c62), X(0x7ff54d33), X(0x7ff56db9), X(0x7ff58df5), X(0x7ff5ade7), X(0x7ff5cd90), X(0x7ff5ecf1), X(0x7ff60c09), X(0x7ff62ada), X(0x7ff64963), X(0x7ff667a5), X(0x7ff685a1), X(0x7ff6a357), X(0x7ff6c0c7), X(0x7ff6ddf1), X(0x7ff6fad7), X(0x7ff71778), X(0x7ff733d6), X(0x7ff74fef), X(0x7ff76bc6), X(0x7ff78759), X(0x7ff7a2ab), X(0x7ff7bdba), X(0x7ff7d888), X(0x7ff7f315), X(0x7ff80d61), X(0x7ff8276c), X(0x7ff84138), X(0x7ff85ac4), X(0x7ff87412), X(0x7ff88d20), X(0x7ff8a5f0), X(0x7ff8be82), X(0x7ff8d6d7), X(0x7ff8eeef), X(0x7ff906c9), X(0x7ff91e68), X(0x7ff935cb), X(0x7ff94cf2), X(0x7ff963dd), X(0x7ff97a8f), X(0x7ff99105), X(0x7ff9a742), X(0x7ff9bd45), X(0x7ff9d30f), X(0x7ff9e8a0), X(0x7ff9fdf9), X(0x7ffa131a), X(0x7ffa2803), X(0x7ffa3cb4), X(0x7ffa512f), X(0x7ffa6573), X(0x7ffa7981), X(0x7ffa8d59), X(0x7ffaa0fc), X(0x7ffab46a), X(0x7ffac7a3), X(0x7ffadaa8), X(0x7ffaed78), X(0x7ffb0015), X(0x7ffb127f), X(0x7ffb24b6), X(0x7ffb36bb), X(0x7ffb488d), X(0x7ffb5a2e), X(0x7ffb6b9d), X(0x7ffb7cdb), X(0x7ffb8de9), X(0x7ffb9ec6), X(0x7ffbaf73), X(0x7ffbbff1), X(0x7ffbd03f), X(0x7ffbe05e), X(0x7ffbf04f), X(0x7ffc0012), X(0x7ffc0fa6), X(0x7ffc1f0d), X(0x7ffc2e47), X(0x7ffc3d54), X(0x7ffc4c35), X(0x7ffc5ae9), X(0x7ffc6971), X(0x7ffc77ce), X(0x7ffc8600), X(0x7ffc9407), X(0x7ffca1e4), X(0x7ffcaf96), X(0x7ffcbd1f), X(0x7ffcca7e), X(0x7ffcd7b4), X(0x7ffce4c1), X(0x7ffcf1a5), X(0x7ffcfe62), X(0x7ffd0af6), X(0x7ffd1763), X(0x7ffd23a9), X(0x7ffd2fc8), X(0x7ffd3bc1), X(0x7ffd4793), X(0x7ffd533f), X(0x7ffd5ec5), X(0x7ffd6a27), X(0x7ffd7563), X(0x7ffd807a), X(0x7ffd8b6e), X(0x7ffd963d), X(0x7ffda0e8), X(0x7ffdab70), X(0x7ffdb5d5), X(0x7ffdc017), X(0x7ffdca36), X(0x7ffdd434), X(0x7ffdde0f), X(0x7ffde7c9), X(0x7ffdf161), X(0x7ffdfad8), X(0x7ffe042f), X(0x7ffe0d65), X(0x7ffe167b), X(0x7ffe1f71), X(0x7ffe2848), X(0x7ffe30ff), X(0x7ffe3997), X(0x7ffe4211), X(0x7ffe4a6c), X(0x7ffe52a9), X(0x7ffe5ac8), X(0x7ffe62c9), X(0x7ffe6aae), X(0x7ffe7275), X(0x7ffe7a1f), X(0x7ffe81ad), X(0x7ffe891f), X(0x7ffe9075), X(0x7ffe97b0), X(0x7ffe9ece), X(0x7ffea5d2), X(0x7ffeacbb), X(0x7ffeb38a), X(0x7ffeba3e), X(0x7ffec0d8), X(0x7ffec758), X(0x7ffecdbf), X(0x7ffed40d), X(0x7ffeda41), X(0x7ffee05d), X(0x7ffee660), X(0x7ffeec4b), X(0x7ffef21f), X(0x7ffef7da), X(0x7ffefd7e), X(0x7fff030b), X(0x7fff0881), X(0x7fff0de0), X(0x7fff1328), X(0x7fff185b), X(0x7fff1d77), X(0x7fff227e), X(0x7fff276f), X(0x7fff2c4b), X(0x7fff3112), X(0x7fff35c4), X(0x7fff3a62), X(0x7fff3eeb), X(0x7fff4360), X(0x7fff47c2), X(0x7fff4c0f), X(0x7fff504a), X(0x7fff5471), X(0x7fff5885), X(0x7fff5c87), X(0x7fff6076), X(0x7fff6452), X(0x7fff681d), X(0x7fff6bd6), X(0x7fff6f7d), X(0x7fff7313), X(0x7fff7698), X(0x7fff7a0c), X(0x7fff7d6f), X(0x7fff80c2), X(0x7fff8404), X(0x7fff8736), X(0x7fff8a58), X(0x7fff8d6b), X(0x7fff906e), X(0x7fff9362), X(0x7fff9646), X(0x7fff991c), X(0x7fff9be3), X(0x7fff9e9c), X(0x7fffa146), X(0x7fffa3e2), X(0x7fffa671), X(0x7fffa8f1), X(0x7fffab65), X(0x7fffadca), X(0x7fffb023), X(0x7fffb26f), X(0x7fffb4ae), X(0x7fffb6e0), X(0x7fffb906), X(0x7fffbb20), X(0x7fffbd2e), X(0x7fffbf30), X(0x7fffc126), X(0x7fffc311), X(0x7fffc4f1), X(0x7fffc6c5), X(0x7fffc88f), X(0x7fffca4d), X(0x7fffcc01), X(0x7fffcdab), X(0x7fffcf4a), X(0x7fffd0e0), X(0x7fffd26b), X(0x7fffd3ec), X(0x7fffd564), X(0x7fffd6d2), X(0x7fffd838), X(0x7fffd993), X(0x7fffdae6), X(0x7fffdc31), X(0x7fffdd72), X(0x7fffdeab), X(0x7fffdfdb), X(0x7fffe104), X(0x7fffe224), X(0x7fffe33c), X(0x7fffe44d), X(0x7fffe556), X(0x7fffe657), X(0x7fffe751), X(0x7fffe844), X(0x7fffe930), X(0x7fffea15), X(0x7fffeaf3), X(0x7fffebca), X(0x7fffec9b), X(0x7fffed66), X(0x7fffee2a), X(0x7fffeee8), X(0x7fffefa0), X(0x7ffff053), X(0x7ffff0ff), X(0x7ffff1a6), X(0x7ffff247), X(0x7ffff2e4), X(0x7ffff37a), X(0x7ffff40c), X(0x7ffff499), X(0x7ffff520), X(0x7ffff5a3), X(0x7ffff621), X(0x7ffff69b), X(0x7ffff710), X(0x7ffff781), X(0x7ffff7ee), X(0x7ffff857), X(0x7ffff8bb), X(0x7ffff91c), X(0x7ffff979), X(0x7ffff9d2), X(0x7ffffa27), X(0x7ffffa79), X(0x7ffffac8), X(0x7ffffb13), X(0x7ffffb5b), X(0x7ffffba0), X(0x7ffffbe2), X(0x7ffffc21), X(0x7ffffc5d), X(0x7ffffc96), X(0x7ffffccd), X(0x7ffffd01), X(0x7ffffd32), X(0x7ffffd61), X(0x7ffffd8e), X(0x7ffffdb8), X(0x7ffffde0), X(0x7ffffe07), X(0x7ffffe2b), X(0x7ffffe4d), X(0x7ffffe6d), X(0x7ffffe8b), X(0x7ffffea8), X(0x7ffffec3), X(0x7ffffedc), X(0x7ffffef4), X(0x7fffff0a), X(0x7fffff1f), X(0x7fffff33), X(0x7fffff45), X(0x7fffff56), X(0x7fffff66), X(0x7fffff75), X(0x7fffff82), X(0x7fffff8f), X(0x7fffff9a), X(0x7fffffa5), X(0x7fffffaf), X(0x7fffffb8), X(0x7fffffc0), X(0x7fffffc8), X(0x7fffffce), X(0x7fffffd5), X(0x7fffffda), X(0x7fffffdf), X(0x7fffffe4), X(0x7fffffe8), X(0x7fffffeb), X(0x7fffffef), X(0x7ffffff1), X(0x7ffffff4), X(0x7ffffff6), X(0x7ffffff8), X(0x7ffffff9), X(0x7ffffffb), X(0x7ffffffc), X(0x7ffffffd), X(0x7ffffffd), X(0x7ffffffe), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), }; core/tremor/CHANGELOG000664 001750 001750 00000000723 12702465756 015374 0ustar00sergiosergio000000 000000 *** 20020517: 1.0.2 *** Playback bugfix to floor1; mode mistakenly used for sizing instead of blockflag *** 20020515: 1.0.1 *** Added complete API documentation to source tarball. No code changes. *** 20020412: 1.0.1 *** Fixed a clipping bug that affected ARM processors; negative overflows were being properly clipped, but then clobbered to positive by the positive overflow chec (asm_arm.h:CLIP_TO_15) *** 20020403: 1.0.0 *** Initial versiongx/images/Key_A_gcn.png000664 001750 001750 00000003251 12702465756 016131 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/12/09'IDATxMW}{ν=v&Gj&4q!KQF]XRAN R\(RnEZ$t&Isg|E'ҪosZZCSJ9Q]PRjVHkϞ4+WL4(m5[-yK7V+  wZEdX)z& ßOE̍j_{I$-cZ?A7EwPJ=ST~=9S.2AͰ5CJ!iٌ4N踷^|{wҭ|GD~u|t^|3͛&+ :8Vݍ>͡V EZ cp+]ݺKwD;W})!a)WwbV_꟮cqc4EZg9*]XRKc+/[+mv(tj0b K xL}" ipU )X,|f1>6S1NFm*6wr hvi[ڷ}hO>B ~78:gB֤{:.qNp97L bDfr:Vจ4=i:5n/xukZ40 qXACn Y;{Sƺ*m/?8Ԩ[tn0A2dt;&7E7̧Sʔ{hn2VqS[tzEٿ9%ۉ!ܿ+"J$ȁ6*b#^}ODF ?ߖE*b }'nIENDB`core/tremor/Version_script.in000664 001750 001750 00000001443 12702465756 017523 0ustar00sergiosergio000000 000000 # # Export file for libvorbisidec # # Only the symbols listed in the global section will be callable from # applications linking to libvorbisidec. # @PACKAGE@.so.1 { global: ov_clear; ov_open; ov_open_callbacks; ov_test; ov_test_callbacks; ov_test_open; ov_bitrate; ov_bitrate_instant; ov_streams; ov_seekable; ov_serialnumber; ov_raw_total; ov_pcm_total; ov_time_total; ov_raw_seek; ov_pcm_seek; ov_pcm_seek_page; ov_time_seek; ov_time_seek_page; ov_raw_tell; ov_pcm_tell; ov_time_tell; ov_info; ov_comment; ov_read; vorbis_info_init; vorbis_info_clear; vorbis_info_blocksize; vorbis_comment_init; vorbis_comment_add; vorbis_comment_add_tag; vorbis_comment_query; vorbis_comment_query_count; vorbis_comment_clear; local: *; }; libretro/jni/Android.mk000664 001750 001750 00000001353 12702465756 016235 0ustar00sergiosergio000000 000000 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) WANT_CRC32 := 1 CORE_DIR := ../.. TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor LIBRETRO_DIR := .. LOCAL_MODULE := retro ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS += -DANDROID_ARM -D_ARM_ASSEM_ LOCAL_ARM_MODE := arm endif include $(LIBRETRO_DIR)/Makefile.common LOCAL_SRC_FILES := $(SOURCES_C) LOCAL_C_INCLUDES = $(foreach dir,$(GENPLUS_SRC_DIR),$(LOCAL_PATH)/$(dir)) \ $(LOCAL_PATH)/$(TREMOR_SRC_DIR) \ $(LOCAL_PATH)/$(LIBRETRO_DIR) LOCAL_CFLAGS += -ffast-math -O2 -funroll-loops -DINLINE="static inline" -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DALIGN_LONG -DALIGN_WORD include $(BUILD_SHARED_LIBRARY) gx/images/Button_icon_sm.png000664 001750 001750 00000011571 12702465756 017300 0ustar00sergiosergio000000 000000 PNG  IHDR4 83xsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/01/09IDATxypŝǿ=ǻu=¶$_%$(@8 b! UeE6j I%!r61`%v6! ɶd;g?e<~l-S5̛_=DJ-uGP]2,9>ι9W3GrBXwy+!{!9BF5M;VTTl~4B>_oWz{{1V)q Bpp.Bp!&?)Wn5]x!$2KJ) w~#//]f.SIB"YH )5JMSQSSO)Lqh`'zB| @d77߮DѥBht0bŊ)=i.v4 v!:D0yR ެbx<>1N@!mGaa4eDU1J)LDUU7TTW(Ysh"p ODt+Y>% V5p4M˗Ì 7Ty \B@dœFb1|.;svXQ2Vhf)z| \AU0` LgY]f gѲ/7JKK!8KYJyO4sJJ >q'Ϛ 5_: QUL!4z=t؃P'|vZꂢyR,9@BJ)eB.qU>yd^'Nkq'`C&BnǪ7 D2=aoZ[g9Ӿ} 䦫he5UU{屑3ȑBJ+Օ vv29TEQjN$:{J&,ގPxIJR٦1ĆNT)9xuk9g` NG)%RS 0H$ǑH$L&'LD"gϞEN| E2cӤZQ0' ap o+W8jȲ9{ʝp-+,`7eB>*`F M_Qgň'e걮%>ki gaϪ $bmf8mfիW7 W?&NۻO9GCM$$zK|v9|alfFZK_Q}󷡨CWVj$`@eeN8E >Pi9Xа`ۋ[ 8e`ߺ\Yn2: ii9::/yiVARVi {nC=i7+z,@ ܷql?~)PJ1ήLU"]~Vct³R2Lg'u$[Ӥh4z9w}KK =\ \.H</;$mn _amSU5e]<ΐ*W(gM0sPu/Eא!6Mi'-EYXSO7^y[?+HW]?WV+ZAl۶ ju$"}hR%{ԞFYfn[[8KGVRp!FkaժU0M<>S})H"!46!dZtc] wɩv"I'w͚5ǎ{s^ARZ}ʯTt8/Q9 =C@WyYcYA.@˿wvH*۱ex06,IpHa j&J('+$˖-[<00 ^N ݌9+NQlހ-;Pd!n64444-HB4Mi pf)n8PUB466W_@qէPFHiF|͈ AJ)y0XDyOy͍D"R6H %WkpH?Nގ޶=0E]]\s -Z6V4WӋjl㭭8z'ODgg'0 +V`&83{`@H)1u/MIOBI M}_ksq۶C]ˆ Nzzgt7X`ttِR"0 / `9 RBRQ$c܋HIHArM&hz<O0CQ,$Q)Z{LJz kew$@!$u#0sN!:sH83! H@-A}RI%U{֑4R4ˏ2^CuMIl/(KLyHGT&D,W/S֪(,O;KR9ڗݝ75U"mF[sgAϬgHH.f:tW4;'tz Iؼ)L@kڝ$ng"\{RN dޠl4^JR铛{R!̅DI@'/D"ңᨃwH"@j.6y9Mm8_h ê@ˆON.v+q@"11і1]& -3qbwITlx j5 Q ;/Á6&p-H ,0i64 ˏ-ׯ0,~.w}K_.O(*8QiPn)ƠtQazPKYay73y4ox7P[Y:IcI\?}s<+^&[+;'a%wuVeĕg\-9lVʆN 5u^ xH&ha 4D]M/8nҌ5tx?WzXwc;tl^2k (5h(m%Nx5ǪlAWP0V{&iE$Ծqk4_m}fj-"G|+@q!A~uYhIl]RBsOʚ?thFL6|QZFuK`F,Ew {|_tl`0<pmی%w;4ơc' u"O+'|( {!]h rfC7jA&l?csp1iWr/4۞0FinFO('@̩{vDIٌo* _|N8 g7MBh.*Xq a11l]mګԧE=@F4ac*YE#Z D,iێ}W%Zx8B Q XØvT>H*g(R+l vp? ;bpP0*!Pmr->^Cl~J+^%fSa5}ƎMbSKX;  )bm꼄)#,B!mx$ԇ"ՔL"kvdBa}S4O5z THo;$}IENDB`gx/images/Key_Plus_wii.png000664 001750 001750 00000002502 12702465756 016713 0ustar00sergiosergio000000 000000 PNG  IHDRw=sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/10/10 IDATx_hGǿ-kPsڦ4TFA(#RAJ_J% }` RJ֪-4x^.䎒˅rbevw7aD"Ǯ_i.\.7M$b_O<Ӊ'V7<|L&,ǺlڴyJB lӧ7 -AD.]tvbbϓnݺETر\+VӋyoo BA뒮TThttnѣG/_^  8iRT1F7[\rL&DDmTը\.ST%:s )2p%r7o|СCmA۷ocrri h:G!ws^ܻwd2ٱQ !NNQ._le`"y8}+|R===ADD", >Zǁ8}b1c6dYs8x<DT*++ LӄeYp]7^xpmöm eYymӢ*c}F!&md?kkk|@"'Owug ɠ a0 4d_={"TUزe c`AQ!±mCPaP(~SԏwM۳i ~M I4M0M3T`apΛ8,BZpzZ-T^if(7_FD8~ۜ󅉉 )EϞazza`߾}`030MW^B.-Nwwtpm`7iB4TUTUh˲`6fff055uX,n۶-ؘk0PaY?~8gđ#G9>>uCeY!Z]133;wFf;Y drԩSҁ:ȵi똛ÃDP^j{3E__}}}wpJKKK|qqqyyyDo jZ @7Q/y^7?h;XbIENDB`gx/images/Ctrl_config.png000664 001750 001750 00000001173 12702465756 016544 0ustar00sergiosergio000000 000000 PNG  IHDR szzsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATx׽kA&6BB B FB-DB > TX؈MH%?"kd3!/ ̾37EY3vEQwY˲aΠey X`OQ7׀Lsnζ5!p!0;L ׻q=f/qlIkTP +So+x{Ko #r"1q~ u|kzp4|(FgY ^D[FWI:"?.=iM VPƈ.,E໦O"7+%|+ xEhK oeYt)^Npj EڞB n2S|@ͫj NUl;S*>1Tu̥>cg_IENDB`core/input_hw/mouse.h000664 001750 001750 00000004464 12702465756 016016 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Mouse support * * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _MOUSE_H_ #define _MOUSE_H_ /* Function prototypes */ extern void mouse_reset(int port); extern unsigned char mouse_read(void); extern void mouse_write(unsigned char data, unsigned char mask); #endif core/m68k/m68k.h000664 001750 001750 00000033221 12702465756 014374 0ustar00sergiosergio000000 000000 #ifndef M68K__HEADER #define M68K__HEADER /* ======================================================================== */ /* ========================= LICENSING & COPYRIGHT ======================== */ /* ======================================================================== */ /* * MUSASHI * Version 3.32 * * A portable Motorola M680x0 processor emulation engine. * Copyright Karl Stenerud. All rights reserved. * * This code may be freely used for non-commercial purposes as long as this * copyright notice remains unaltered in the source code and any binary files * containing this code in compiled form. * * All other licensing terms must be negotiated with the author * (Karl Stenerud). * * The latest version of this code can be obtained at: * http://kstenerud.cjb.net */ /* Modified by Eke-Eke for Genesis Plus GX: - removed unused stuff to reduce memory usage / optimize execution (multiple CPU types support, NMI support, ...) - moved stuff to compile statically in a single object file - implemented support for global cycle count (shared by 68k & Z80 CPU) - added support for interrupt latency (Sesame's Street Counting Cafe, Fatal Rewind) - added proper cycle use on reset - added cycle accurate timings for MUL/DIV instructions (thanks to Jorge Cwik !) - fixed undocumented flags for DIV instructions (Blood Shot) - added MAIN-CPU & SUB-CPU support for Mega CD emulation */ /* ======================================================================== */ /* ================================ INCLUDES ============================== */ /* ======================================================================== */ #include #include "macros.h" /* ======================================================================== */ /* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */ /* ======================================================================== */ /* Check for > 32bit sizes */ #if UINT_MAX > 0xffffffff #define M68K_INT_GT_32_BIT 1 #else #define M68K_INT_GT_32_BIT 0 #endif /* Data types used in this emulation core */ #undef sint8 #undef sint16 #undef sint32 #undef sint64 #undef uint8 #undef uint16 #undef uint32 #undef uint64 #undef sint #undef uint #define sint8 signed char /* ASG: changed from char to signed char */ #define sint16 signed short #define sint32 signed int /* AWJ: changed from long to int */ #define uint8 unsigned char #define uint16 unsigned short #define uint32 unsigned int /* AWJ: changed from long to int */ /* signed and unsigned int must be at least 32 bits wide */ #define sint signed int #define uint unsigned int #if M68K_USE_64_BIT #define sint64 signed long long #define uint64 unsigned long long #else #define sint64 sint32 #define uint64 uint32 #endif /* M68K_USE_64_BIT */ /* Allow for architectures that don't have 8-bit sizes */ /*#if UCHAR_MAX == 0xff*/ #define MAKE_INT_8(A) (sint8)(A) /*#else #undef sint8 #define sint8 signed int #undef uint8 #define uint8 unsigned int INLINE sint MAKE_INT_8(uint value) { return (value & 0x80) ? value | ~0xff : value & 0xff; }*/ /*#endif *//* UCHAR_MAX == 0xff */ /* Allow for architectures that don't have 16-bit sizes */ /*#if USHRT_MAX == 0xffff*/ #define MAKE_INT_16(A) (sint16)(A) /*#else #undef sint16 #define sint16 signed int #undef uint16 #define uint16 unsigned int INLINE sint MAKE_INT_16(uint value) { return (value & 0x8000) ? value | ~0xffff : value & 0xffff; }*/ /*#endif *//* USHRT_MAX == 0xffff */ /* Allow for architectures that don't have 32-bit sizes */ /*#if UINT_MAX == 0xffffffff*/ #define MAKE_INT_32(A) (sint32)(A) /*#else #undef sint32 #define sint32 signed int #undef uint32 #define uint32 unsigned int INLINE sint MAKE_INT_32(uint value) { return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff; }*/ /*#endif *//* UINT_MAX == 0xffffffff */ /* ======================================================================== */ /* ============================ GENERAL DEFINES =========================== */ /* ======================================================================== */ /* There are 7 levels of interrupt to the 68K. * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). */ #define M68K_IRQ_NONE 0 #define M68K_IRQ_1 1 #define M68K_IRQ_2 2 #define M68K_IRQ_3 3 #define M68K_IRQ_4 4 #define M68K_IRQ_5 5 #define M68K_IRQ_6 6 #define M68K_IRQ_7 7 /* Special interrupt acknowledge values. * Use these as special returns from the interrupt acknowledge callback * (specified later in this header). */ /* Causes an interrupt autovector (0x18 + interrupt level) to be taken. * This happens in a real 68K if VPA or AVEC is asserted during an interrupt * acknowledge cycle instead of DTACK. */ #define M68K_INT_ACK_AUTOVECTOR 0xffffffff /* Causes the spurious interrupt vector (0x18) to be taken * This happens in a real 68K if BERR is asserted during the interrupt * acknowledge cycle (i.e. no devices responded to the acknowledge). */ #define M68K_INT_ACK_SPURIOUS 0xfffffffe /* Registers used by m68k_get_reg() and m68k_set_reg() */ typedef enum { /* Real registers */ M68K_REG_D0, /* Data registers */ M68K_REG_D1, M68K_REG_D2, M68K_REG_D3, M68K_REG_D4, M68K_REG_D5, M68K_REG_D6, M68K_REG_D7, M68K_REG_A0, /* Address registers */ M68K_REG_A1, M68K_REG_A2, M68K_REG_A3, M68K_REG_A4, M68K_REG_A5, M68K_REG_A6, M68K_REG_A7, M68K_REG_PC, /* Program Counter */ M68K_REG_SR, /* Status Register */ M68K_REG_SP, /* The current Stack Pointer (located in A7) */ M68K_REG_USP, /* User Stack Pointer */ M68K_REG_ISP, /* Interrupt Stack Pointer */ #if M68K_EMULATE_PREFETCH /* Assumed registers */ /* These are cheat registers which emulate the 1-longword prefetch * present in the 68000 and 68010. */ M68K_REG_PREF_ADDR, /* Last prefetch address */ M68K_REG_PREF_DATA, /* Last prefetch data */ #endif /* Convenience registers */ M68K_REG_IR /* Instruction register */ } m68k_register_t; /* 68k memory map structure */ typedef struct { unsigned char *base; /* memory-based access (ROM, RAM) */ unsigned int (*read8)(unsigned int address); /* I/O byte read access */ unsigned int (*read16)(unsigned int address); /* I/O word read access */ void (*write8)(unsigned int address, unsigned int data); /* I/O byte write access */ void (*write16)(unsigned int address, unsigned int data); /* I/O word write access */ } cpu_memory_map; /* 68k idle loop detection */ typedef struct { uint pc; uint cycle; uint detected; } cpu_idle_t; typedef struct { cpu_memory_map memory_map[256]; /* memory mapping */ cpu_idle_t poll; /* polling detection */ uint cycles; /* current master cycle count */ uint cycle_end; /* aimed master cycle count for current execution frame */ uint dar[16]; /* Data and Address Registers */ uint pc; /* Program Counter */ uint sp[5]; /* User and Interrupt Stack Pointers */ uint ir; /* Instruction Register */ uint t1_flag; /* Trace 1 */ uint s_flag; /* Supervisor */ uint x_flag; /* Extend */ uint n_flag; /* Negative */ uint not_z_flag; /* Zero, inverted for speedups */ uint v_flag; /* Overflow */ uint c_flag; /* Carry */ uint int_mask; /* I0-I2 */ uint int_level; /* State of interrupt pins IPL0-IPL2 -- ASG: changed from ints_pending */ uint stopped; /* Stopped state */ uint pref_addr; /* Last prefetch address */ uint pref_data; /* Data in the prefetch queue */ uint instr_mode; /* Stores whether we are in instruction mode or group 0/1 exception mode */ uint run_mode; /* Stores whether we are processing a reset, bus error, address error, or something else */ uint aerr_enabled; /* Enables/deisables address error checks at runtime */ jmp_buf aerr_trap; /* Address error jump */ uint aerr_address; /* Address error location */ uint aerr_write_mode; /* Address error write mode */ uint aerr_fc; /* Address error FC code */ uint tracing; /* Tracing enable flag */ uint address_space; /* Current FC code */ /* Callbacks to host */ int (*int_ack_callback)(int int_line); /* Interrupt Acknowledge */ void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ int (*tas_instr_callback)(void); /* Called when a TAS instruction is encountered, allows / disallows writeback */ void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */ } m68ki_cpu_core; /* CPU cores */ extern m68ki_cpu_core m68k; extern m68ki_cpu_core s68k; /* ======================================================================== */ /* ============================== CALLBACKS =============================== */ /* ======================================================================== */ /* These functions allow you to set callbacks to the host when specific events * occur. Note that you must enable the corresponding value in m68kconf.h * in order for these to do anything useful. * Note: I have defined default callbacks which are used if you have enabled * the corresponding #define in m68kconf.h but either haven't assigned a * callback or have assigned a callback of NULL. */ #if M68K_EMULATE_INT_ACK == OPT_ON /* Set the callback for an interrupt acknowledge. * You must enable M68K_EMULATE_INT_ACK in m68kconf.h. * The CPU will call the callback with the interrupt level being acknowledged. * The host program must return either a vector from 0x02-0xff, or one of the * special interrupt acknowledge values specified earlier in this header. * If this is not implemented, the CPU will always assume an autovectored * interrupt, and will automatically clear the interrupt request when it * services the interrupt. * Default behavior: return M68K_INT_ACK_AUTOVECTOR. */ void m68k_set_int_ack_callback(int (*callback)(int int_level)); #endif #if M68K_EMULATE_RESET == OPT_ON /* Set the callback for the RESET instruction. * You must enable M68K_EMULATE_RESET in m68kconf.h. * The CPU calls this callback every time it encounters a RESET instruction. * Default behavior: do nothing. */ void m68k_set_reset_instr_callback(void (*callback)(void)); #endif #if M68K_TAS_HAS_CALLBACK == OPT_ON /* Set the callback for the TAS instruction. * You must enable M68K_TAS_HAS_CALLBACK in m68kconf.h. * The CPU calls this callback every time it encounters a TAS instruction. * Default behavior: return 1, allow writeback. */ void m68k_set_tas_instr_callback(int (*callback)(void)); #endif #if M68K_EMULATE_FC == OPT_ON /* Set the callback for CPU function code changes. * You must enable M68K_EMULATE_FC in m68kconf.h. * The CPU calls this callback with the function code before every memory * access to set the CPU's function code according to what kind of memory * access it is (supervisor/user, program/data and such). * Default behavior: do nothing. */ void m68k_set_fc_callback(void (*callback)(unsigned int new_fc)); #endif /* ======================================================================== */ /* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */ /* ======================================================================== */ /* Do whatever initialisations the core requires. Should be called * at least once at init time. */ extern void m68k_init(void); extern void s68k_init(void); /* Pulse the RESET pin on the CPU. * You *MUST* reset the CPU at least once to initialize the emulation */ extern void m68k_pulse_reset(void); extern void s68k_pulse_reset(void); /* Run until given cycle count is reached */ extern void m68k_run(unsigned int cycles); extern void s68k_run(unsigned int cycles); /* Set the IPL0-IPL2 pins on the CPU (IRQ). * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI). * Setting IRQ to 0 will clear an interrupt request. */ extern void m68k_set_irq(unsigned int int_level); extern void m68k_set_irq_delay(unsigned int int_level); extern void m68k_update_irq(unsigned int mask); extern void s68k_update_irq(unsigned int mask); /* Halt the CPU as if you pulsed the HALT pin. */ extern void m68k_pulse_halt(void); extern void m68k_clear_halt(void); extern void s68k_pulse_halt(void); extern void s68k_clear_halt(void); /* Peek at the internals of a CPU context. This can either be a context * retrieved using m68k_get_context() or the currently running context. * If context is NULL, the currently running CPU context will be used. */ extern unsigned int m68k_get_reg(m68k_register_t reg); extern unsigned int s68k_get_reg(m68k_register_t reg); /* Poke values into the internals of the currently running CPU context */ extern void m68k_set_reg(m68k_register_t reg, unsigned int value); extern void s68k_set_reg(m68k_register_t reg, unsigned int value); /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ #endif /* M68K__HEADER */ core/input_hw/input.h000664 001750 001750 00000015571 12702465756 016026 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Input peripherals support * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _INPUT_H_ #define _INPUT_H_ /* Max. number of devices */ #define MAX_DEVICES (8) /* Ports configuration */ #define NO_SYSTEM (0) /* unconnected port*/ #define SYSTEM_GAMEPAD (1) /* 2-buttons, 3-buttons or 6-buttons Control Pad */ #define SYSTEM_MOUSE (2) /* Sega Mouse (only supported in either port A or port B) */ #define SYSTEM_MENACER (3) /* Sega Menacer (only supported in port B) */ #define SYSTEM_JUSTIFIER (4) /* Konami Justifiers (only supported in port B) */ #define SYSTEM_XE_1AP (5) /* XE-1AP analog controller */ #define SYSTEM_ACTIVATOR (6) /* Sega Activator */ #define SYSTEM_LIGHTPHASER (7) /* Sega Light Phaser */ #define SYSTEM_PADDLE (8) /* Sega Paddle Control */ #define SYSTEM_SPORTSPAD (9) /* Sega Sports Pad */ #define SYSTEM_GRAPHIC_BOARD (10) /* Sega Graphic Board */ #define SYSTEM_MASTERTAP (11) /* Multi Tap -- Furrtek's Master Tap (unofficial) */ #define SYSTEM_TEAMPLAYER (12) /* Multi Tap -- Sega TeamPlayer */ #define SYSTEM_WAYPLAY (13) /* Multi Tap -- EA 4-Way Play (use both ports) */ /* Device type */ #define NO_DEVICE (0xff) /* unconnected device (fixed ID for Team Player) */ #define DEVICE_PAD3B (0x00) /* 3-buttons Control Pad (fixed ID for Team Player)*/ #define DEVICE_PAD6B (0x01) /* 6-buttons Control Pad (fixed ID for Team Player) */ #define DEVICE_PAD2B (0x02) /* 2-buttons Control Pad */ #define DEVICE_MOUSE (0x03) /* Sega Mouse */ #define DEVICE_LIGHTGUN (0x04) /* Sega Light Phaser, Menacer or Konami Justifiers */ #define DEVICE_PADDLE (0x05) /* Sega Paddle Control */ #define DEVICE_SPORTSPAD (0x06) /* Sega Sports Pad */ #define DEVICE_GRAPHIC_BOARD (0x07) /* Sega Graphic Board */ #define DEVICE_PICO (0x08) /* PICO tablet */ #define DEVICE_TEREBI (0x09) /* Terebi Oekaki tablet */ #define DEVICE_XE_1AP (0x0a) /* XE-1AP analog controller */ #define DEVICE_ACTIVATOR (0x0b) /* Activator */ /* Default Input bitmasks */ #define INPUT_MODE (0x0800) #define INPUT_X (0x0400) #define INPUT_Y (0x0200) #define INPUT_Z (0x0100) #define INPUT_START (0x0080) #define INPUT_A (0x0040) #define INPUT_C (0x0020) #define INPUT_B (0x0010) #define INPUT_RIGHT (0x0008) #define INPUT_LEFT (0x0004) #define INPUT_DOWN (0x0002) #define INPUT_UP (0x0001) /* Master System specific bitmasks */ #define INPUT_BUTTON2 (0x0020) #define INPUT_BUTTON1 (0x0010) /* Mega Mouse specific bitmask */ #define INPUT_MOUSE_CENTER (0x0040) #define INPUT_MOUSE_RIGHT (0x0020) #define INPUT_MOUSE_LEFT (0x0010) /* Pico hardware specific bitmask */ #define INPUT_PICO_PEN (0x0080) #define INPUT_PICO_RED (0x0010) /* XE-1AP specific bitmask */ #define INPUT_XE_E1 (0x2000) #define INPUT_XE_E2 (0x1000) #define INPUT_XE_START (0x0800) #define INPUT_XE_SELECT (0x0400) #define INPUT_XE_A (0x0200) #define INPUT_XE_B (0x0100) #define INPUT_XE_A2 (0x0080) #define INPUT_XE_B2 (0x0040) #define INPUT_XE_C (0x0020) #define INPUT_XE_D (0x0010) /* Activator specific bitmasks */ #define INPUT_ACTIVATOR_8U (0x8000) #define INPUT_ACTIVATOR_8L (0x4000) #define INPUT_ACTIVATOR_7U (0x2000) #define INPUT_ACTIVATOR_7L (0x1000) #define INPUT_ACTIVATOR_6U (0x0800) #define INPUT_ACTIVATOR_6L (0x0400) #define INPUT_ACTIVATOR_5U (0x0200) #define INPUT_ACTIVATOR_5L (0x0100) #define INPUT_ACTIVATOR_4U (0x0080) #define INPUT_ACTIVATOR_4L (0x0040) #define INPUT_ACTIVATOR_3U (0x0020) #define INPUT_ACTIVATOR_3L (0x0010) #define INPUT_ACTIVATOR_2U (0x0008) #define INPUT_ACTIVATOR_2L (0x0004) #define INPUT_ACTIVATOR_1U (0x0002) #define INPUT_ACTIVATOR_1L (0x0001) /* Graphic Board specific bitmasks */ #define INPUT_GRAPHIC_PEN (0x0004) #define INPUT_GRAPHIC_DO (0x0002) #define INPUT_GRAPHIC_MENU (0x0001) typedef struct { uint8 system[2]; /* can be one of the SYSTEM_* values */ uint8 dev[MAX_DEVICES]; /* can be one of the DEVICE_* values */ uint16 pad[MAX_DEVICES]; /* digital inputs (any of INPUT_* values) */ int16 analog[MAX_DEVICES][2]; /* analog inputs (x/y) */ int x_offset; /* gun horizontal offset */ int y_offset; /* gun vertical offset */ } t_input; /* Global variables */ extern t_input input; extern int old_system[2]; /* Function prototypes */ extern void input_init(void); extern void input_reset(void); extern void input_refresh(void); extern void input_end_frame(unsigned int cycles); #endif psp2/error.h000664 001750 001750 00000000263 12702465756 014107 0ustar00sergiosergio000000 000000 #ifndef _ERROR_H_ #define _ERROR_H_ /* Function prototypes */ void error_init(void); void error_shutdown(void); void error(char *format, ...); #endif /* _ERROR_H_ */ core/input_hw/mouse.c000664 001750 001750 00000010700 12702465756 015777 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Mouse support * * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; uint8 Counter; uint8 Wait; uint8 Port; } mouse; void mouse_reset(int port) { input.analog[port][0] = 0; input.analog[port][1] = 0; mouse.State = 0x60; mouse.Counter = 0; mouse.Wait = 0; mouse.Port = port; } unsigned char mouse_read() { unsigned int temp = 0x00; int x = input.analog[mouse.Port][0]; int y = input.analog[mouse.Port][1]; switch (mouse.Counter) { case 0: /* initial */ temp = 0x00; break; case 1: /* xxxx1011 */ temp = 0x0B; break; case 2: /* xxxx1111 */ temp = 0x0F; break; case 3: /* xxxx1111 */ temp = 0x0F; break; case 4: /* Axis sign & overflow (not emulated) bits */ temp |= (x < 0); temp |= (y < 0) << 1; /* temp |= (abs(x) > 255) << 2; temp |= (abs(y) > 255) << 3; */ break; case 5: /* START, A, B, C buttons state (active high) */ temp = (input.pad[mouse.Port] >> 4) & 0x0F; break; case 6: /* X Axis MSB */ temp = (x >> 4) & 0x0F; break; case 7: /* X Axis LSB */ temp = (x & 0x0F); break; case 8: /* Y Axis MSB */ temp = (y >> 4) & 0x0F; break; case 9: /* Y Axis LSB */ temp = (y & 0x0F); break; } /* TL = busy status */ if (mouse.Wait) { /* wait before ACK, fix some buggy mouse routine (Cannon Fodder, Shangai 2, Wack World,...) */ mouse.Wait = 0; /* TL = !TR */ temp |= (~mouse.State & 0x20) >> 1; } else { /* TL = TR (data is ready) */ temp |= (mouse.State & 0x20) >> 1; } return temp; } void mouse_write(unsigned char data, unsigned char mask) { /* update bits set as output only */ data = (mouse.State & ~mask) | (data & mask); /* TH transition */ if ((mouse.State ^ data) & 0x40) { /* start (TH=0) or stop (TH=1) acquisition */ mouse.Counter = 1 - ((data & 0x40) >> 6); } /* TR transition */ if ((mouse.State ^ data) & 0x20) { /* acquisition in progress */ if ((mouse.Counter > 0) && (mouse.Counter < 10)) { /* increment phase */ mouse.Counter++; } /* TL handshake latency */ mouse.Wait = 1; } /* update internal state */ mouse.State = data; } core/ntsc/md_ntsc_impl.h000664 001750 001750 00000032054 12702465756 016444 0ustar00sergiosergio000000 000000 /* md_ntsc 0.1.2. http://www.slack.net/~ant/ */ /* Common implementation of NTSC filters */ #include #include /* Copyright (C) 2006-2007 Shay Green. This module is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define DISABLE_CORRECTION 0 #undef PI #define PI 3.14159265358979323846f #ifndef LUMA_CUTOFF #define LUMA_CUTOFF 0.20 #endif #ifndef gamma_size #define gamma_size 1 #endif #ifndef rgb_bits #define rgb_bits 8 #endif #ifndef artifacts_max #define artifacts_max (artifacts_mid * 1.5f) #endif #ifndef fringing_max #define fringing_max (fringing_mid * 2) #endif #ifndef STD_HUE_CONDITION #define STD_HUE_CONDITION( setup ) 1 #endif #define ext_decoder_hue (std_decoder_hue + 15) #define rgb_unit (1 << rgb_bits) #define rgb_offset (rgb_unit * 2 + 0.5f) enum { burst_size = md_ntsc_entry_size / burst_count }; enum { kernel_half = 16 }; enum { kernel_size = kernel_half * 2 + 1 }; typedef struct init_t { float to_rgb [burst_count * 6]; float to_float [gamma_size]; float contrast; float brightness; float artifacts; float fringing; float kernel [rescale_out * kernel_size * 2]; } init_t; #define ROTATE_IQ( i, q, sin_b, cos_b ) {\ float t;\ t = i * cos_b - q * sin_b;\ q = i * sin_b + q * cos_b;\ i = t;\ } static void init_filters( init_t* impl, md_ntsc_setup_t const* setup ) { #if rescale_out > 1 float kernels [kernel_size * 2]; #else float* const kernels = impl->kernel; #endif /* generate luma (y) filter using sinc kernel */ { /* sinc with rolloff (dsf) */ float const rolloff = 1 + (float) setup->sharpness * (float) 0.032; float const maxh = 32; float const pow_a_n = (float) pow( rolloff, maxh ); float sum; int i; /* quadratic mapping to reduce negative (blurring) range */ float to_angle = (float) setup->resolution + 1; to_angle = PI / maxh * (float) LUMA_CUTOFF * (to_angle * to_angle + 1); kernels [kernel_size * 3 / 2] = maxh; /* default center value */ for ( i = 0; i < kernel_half * 2 + 1; i++ ) { int x = i - kernel_half; float angle = x * to_angle; /* instability occurs at center point with rolloff very close to 1.0 */ if ( x || pow_a_n > (float) 1.056 || pow_a_n < (float) 0.981 ) { float rolloff_cos_a = rolloff * (float) cos( angle ); float num = 1 - rolloff_cos_a - pow_a_n * (float) cos( maxh * angle ) + pow_a_n * rolloff * (float) cos( (maxh - 1) * angle ); float den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff; float dsf = num / den; kernels [kernel_size * 3 / 2 - kernel_half + i] = dsf - (float) 0.5; } } /* apply blackman window and find sum */ sum = 0; for ( i = 0; i < kernel_half * 2 + 1; i++ ) { float x = PI * 2 / (kernel_half * 2) * i; float blackman = 0.42f - 0.5f * (float) cos( x ) + 0.08f * (float) cos( x * 2 ); sum += (kernels [kernel_size * 3 / 2 - kernel_half + i] *= blackman); } /* normalize kernel */ sum = 1.0f / sum; for ( i = 0; i < kernel_half * 2 + 1; i++ ) { int x = kernel_size * 3 / 2 - kernel_half + i; kernels [x] *= sum; assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } /* generate chroma (iq) filter using gaussian kernel */ { float const cutoff_factor = -0.03125f; float cutoff = (float) setup->bleed; int i; if ( cutoff < 0 ) { /* keep extreme value accessible only near upper end of scale (1.0) */ cutoff *= cutoff; cutoff *= cutoff; cutoff *= cutoff; cutoff *= -30.0f / 0.65f; } cutoff = cutoff_factor - 0.65f * cutoff_factor * cutoff; for ( i = -kernel_half; i <= kernel_half; i++ ) kernels [kernel_size / 2 + i] = (float) exp( i * i * cutoff ); /* normalize even and odd phases separately */ for ( i = 0; i < 2; i++ ) { float sum = 0; int x; for ( x = i; x < kernel_size; x += 2 ) sum += kernels [x]; sum = 1.0f / sum; for ( x = i; x < kernel_size; x += 2 ) { kernels [x] *= sum; assert( kernels [x] == kernels [x] ); /* catch numerical instability */ } } } /* printf( "luma:\n" ); for ( i = kernel_size; i < kernel_size * 2; i++ ) printf( "%f\n", kernels [i] ); printf( "chroma:\n" ); for ( i = 0; i < kernel_size; i++ ) printf( "%f\n", kernels [i] ); */ /* generate linear rescale kernels */ #if rescale_out > 1 { float weight = 1.0f; float* out = impl->kernel; int n = rescale_out; do { float remain = 0; int i; weight -= 1.0f / rescale_in; for ( i = 0; i < kernel_size * 2; i++ ) { float cur = kernels [i]; float m = cur * weight; *out++ = m + remain; remain = cur - m; } } while ( --n ); } #endif } static float const default_decoder [6] = { 0.956f, 0.621f, -0.272f, -0.647f, -1.105f, 1.702f }; static void init( init_t* impl, md_ntsc_setup_t const* setup ) { impl->brightness = (float) setup->brightness * (0.5f * rgb_unit) + rgb_offset; impl->contrast = (float) setup->contrast * (0.5f * rgb_unit) + rgb_unit; #ifdef default_palette_contrast if ( !setup->palette ) impl->contrast *= default_palette_contrast; #endif impl->artifacts = (float) setup->artifacts; if ( impl->artifacts > 0 ) impl->artifacts *= artifacts_max - artifacts_mid; impl->artifacts = impl->artifacts * artifacts_mid + artifacts_mid; impl->fringing = (float) setup->fringing; if ( impl->fringing > 0 ) impl->fringing *= fringing_max - fringing_mid; impl->fringing = impl->fringing * fringing_mid + fringing_mid; init_filters( impl, setup ); /* generate gamma table */ if ( gamma_size > 1 ) { float const to_float = 1.0f / (gamma_size - (gamma_size > 1)); float const gamma = 1.1333f - (float) setup->gamma * 0.5f; /* match common PC's 2.2 gamma to TV's 2.65 gamma */ int i; for ( i = 0; i < gamma_size; i++ ) impl->to_float [i] = (float) pow( i * to_float, gamma ) * impl->contrast + impl->brightness; } /* setup decoder matricies */ { float hue = (float) setup->hue * PI + PI / 180 * ext_decoder_hue; float sat = (float) setup->saturation + 1; float const* decoder = setup->decoder_matrix; if ( !decoder ) { decoder = default_decoder; if ( STD_HUE_CONDITION( setup ) ) hue += PI / 180 * (std_decoder_hue - ext_decoder_hue); } { float s = (float) sin( hue ) * sat; float c = (float) cos( hue ) * sat; float* out = impl->to_rgb; int n; n = burst_count; do { float const* in = decoder; int n = 3; do { float i = *in++; float q = *in++; *out++ = i * c - q * s; *out++ = i * s + q * c; } while ( --n ); if ( burst_count <= 1 ) break; ROTATE_IQ( s, c, 0.866025f, -0.5f ); /* +120 degrees */ } while ( --n ); } } } /* kernel generation */ #define RGB_TO_YIQ( r, g, b, y, i ) (\ (y = (r) * 0.299f + (g) * 0.587f + (b) * 0.114f),\ (i = (r) * 0.596f - (g) * 0.275f - (b) * 0.321f),\ ((r) * 0.212f - (g) * 0.523f + (b) * 0.311f)\ ) #define YIQ_TO_RGB( y, i, q, to_rgb, type, r, g ) (\ r = (type) (y + to_rgb [0] * i + to_rgb [1] * q),\ g = (type) (y + to_rgb [2] * i + to_rgb [3] * q),\ (type) (y + to_rgb [4] * i + to_rgb [5] * q)\ ) #define PACK_RGB( r, g, b ) ((r) << 21 | (g) << 11 | (b) << 1) enum { rgb_kernel_size = burst_size / alignment_count }; enum { rgb_bias = rgb_unit * 2 * md_ntsc_rgb_builder }; typedef struct pixel_info_t { int offset; float negate; float kernel [4]; } pixel_info_t; #if rescale_in > 1 #define PIXEL_OFFSET_( ntsc, scaled ) \ (kernel_size / 2 + ntsc + (scaled != 0) + (rescale_out - scaled) % rescale_out + \ (kernel_size * 2 * scaled)) #define PIXEL_OFFSET( ntsc, scaled ) \ PIXEL_OFFSET_( ((ntsc) - (scaled) / rescale_out * rescale_in),\ (((scaled) + rescale_out * 10) % rescale_out) ),\ (1.0f - (((ntsc) + 100) & 2)) #else #define PIXEL_OFFSET( ntsc, scaled ) \ (kernel_size / 2 + (ntsc) - (scaled)),\ (1.0f - (((ntsc) + 100) & 2)) #endif extern pixel_info_t const md_ntsc_pixels [alignment_count]; /* Generate pixel at all burst phases and column alignments */ static void gen_kernel( init_t* impl, float y, float i, float q, md_ntsc_rgb_t* out ) { /* generate for each scanline burst phase */ float const* to_rgb = impl->to_rgb; int burst_remain = burst_count; y -= rgb_offset; do { /* Encode yiq into *two* composite signals (to allow control over artifacting). Convolve these with kernels which: filter respective components, apply sharpening, and rescale horizontally. Convert resulting yiq to rgb and pack into integer. Based on algorithm by NewRisingSun. */ pixel_info_t const* pixel = md_ntsc_pixels; int alignment_remain = alignment_count; do { /* negate is -1 when composite starts at odd multiple of 2 */ float const yy = y * impl->fringing * pixel->negate; float const ic0 = (i + yy) * pixel->kernel [0]; float const qc1 = (q + yy) * pixel->kernel [1]; float const ic2 = (i - yy) * pixel->kernel [2]; float const qc3 = (q - yy) * pixel->kernel [3]; float const factor = impl->artifacts * pixel->negate; float const ii = i * factor; float const yc0 = (y + ii) * pixel->kernel [0]; float const yc2 = (y - ii) * pixel->kernel [2]; float const qq = q * factor; float const yc1 = (y + qq) * pixel->kernel [1]; float const yc3 = (y - qq) * pixel->kernel [3]; float const* k = &impl->kernel [pixel->offset]; int n; ++pixel; for ( n = rgb_kernel_size; n; --n ) { float i = k[0]*ic0 + k[2]*ic2; float q = k[1]*qc1 + k[3]*qc3; float y = k[kernel_size+0]*yc0 + k[kernel_size+1]*yc1 + k[kernel_size+2]*yc2 + k[kernel_size+3]*yc3 + rgb_offset; if ( rescale_out <= 1 ) k--; else if ( k < &impl->kernel [kernel_size * 2 * (rescale_out - 1)] ) k += kernel_size * 2 - 1; else k -= kernel_size * 2 * (rescale_out - 1) + 2; { int r, g, b = YIQ_TO_RGB( y, i, q, to_rgb, int, r, g ); *out++ = PACK_RGB( r, g, b ) - rgb_bias; } } } while ( alignment_count > 1 && --alignment_remain ); if ( burst_count <= 1 ) break; to_rgb += 6; ROTATE_IQ( i, q, -0.866025f, -0.5f ); /* -120 degrees */ } while ( --burst_remain ); } static void correct_errors( md_ntsc_rgb_t color, md_ntsc_rgb_t* out ); #if DISABLE_CORRECTION #define CORRECT_ERROR( a ) { out [i] += rgb_bias; } #define DISTRIBUTE_ERROR( a, b, c ) { out [i] += rgb_bias; } #else #define CORRECT_ERROR( a ) { out [a] += error; } #define DISTRIBUTE_ERROR( a, b, c ) {\ md_ntsc_rgb_t fourth = (error + 2 * md_ntsc_rgb_builder) >> 2;\ fourth &= (rgb_bias >> 1) - md_ntsc_rgb_builder;\ fourth -= rgb_bias >> 2;\ out [a] += fourth;\ out [b] += fourth;\ out [c] += fourth;\ out [i] += error - (fourth * 3);\ } #endif #define RGB_PALETTE_OUT( rgb, out_ )\ {\ unsigned char* out = (out_);\ md_ntsc_rgb_t clamped = (rgb);\ MD_NTSC_CLAMP_( clamped, (8 - rgb_bits) );\ out [0] = (unsigned char) (clamped >> 21);\ out [1] = (unsigned char) (clamped >> 11);\ out [2] = (unsigned char) (clamped >> 1);\ } /* blitter related */ #ifndef restrict #if defined (__GNUC__) #define restrict __restrict__ #elif defined (_MSC_VER) && _MSC_VER > 1300 #define restrict #else /* no support for restricted pointers */ #define restrict #endif #endif #include #if MD_NTSC_OUT_DEPTH <= 16 #if USHRT_MAX == 0xFFFF typedef unsigned short md_ntsc_out_t; #else #error "Need 16-bit int type" #endif #else #if UINT_MAX == 0xFFFFFFFF typedef unsigned int md_ntsc_out_t; #elif ULONG_MAX == 0xFFFFFFFF typedef unsigned long md_ntsc_out_t; #else #error "Need 32-bit int type" #endif #endif core/input_hw/input.c000664 001750 001750 00000024114 12702465756 016012 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Input peripherals support * * Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "gamepad.h" #include "lightgun.h" #include "mouse.h" #include "activator.h" #include "xe_1ap.h" #include "teamplayer.h" #include "paddle.h" #include "sportspad.h" #include "terebi_oekaki.h" #include "graphic_board.h" t_input input; int old_system[2] = {-1,-1}; void input_init(void) { int i, padtype; int player = 0; for (i=0; i> 2); break; } case DEVICE_XE_1AP: { xe_1ap_reset(i); break; } case DEVICE_PADDLE: { paddle_reset(i); break; } case DEVICE_SPORTSPAD: { sportspad_reset(i); break; } case DEVICE_TEREBI: { terebi_oekaki_reset(); break; } case DEVICE_GRAPHIC_BOARD: { graphic_board_reset(i); break; } default: { break; } } } /* Team Player */ for (i=0; i<2; i++) { if (input.system[i] == SYSTEM_TEAMPLAYER) { teamplayer_reset(i); } } } void input_refresh(void) { int i; for (i=0; i /* for abs() */ #if defined(GEKKO) && !defined(__LIBRETRO__) #include #endif #ifndef _V_WIDE_MATH #define _V_WIDE_MATH #ifndef _LOW_ACCURACY_ /* 64 bit multiply */ #if !(defined WIN32 && defined WINCE) #include #endif #if BYTE_ORDER==BIG_ENDIAN union magic { struct { ogg_int32_t hi; ogg_int32_t lo; } halves; ogg_int64_t whole; }; #elif BYTE_ORDER==LITTLE_ENDIAN union magic { struct { ogg_int32_t lo; ogg_int32_t hi; } halves; ogg_int64_t whole; }; #endif STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { union magic magic; magic.whole = (ogg_int64_t)x * y; return magic.halves.hi; } STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { return MULT32(x,y)<<1; } STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { union magic magic; magic.whole = (ogg_int64_t)x * y; return ((ogg_uint32_t)(magic.halves.lo)>>15) | ((magic.halves.hi)<<17); } #else /* 32 bit multiply, more portable but less accurate */ /* * Note: Precision is biased towards the first argument therefore ordering * is important. Shift values were chosen for the best sound quality after * many listening tests. */ /* * For MULT32 and MULT31: The second argument is always a lookup table * value already preshifted from 31 to 8 bits. We therefore take the * opportunity to save on text space and use unsigned char for those * tables in this case. */ STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { return (x >> 9) * y; /* y preshifted >>23 */ } STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { return (x >> 8) * y; /* y preshifted >>23 */ } STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { return (x >> 6) * y; /* y preshifted >>9 */ } #endif /* * This should be used as a memory barrier, forcing all cached values in * registers to wr writen back to memory. Might or might not be beneficial * depending on the architecture and compiler. */ #define MB() /* * The XPROD functions are meant to optimize the cross products found all * over the place in mdct.c by forcing memory operation ordering to avoid * unnecessary register reloads as soon as memory is being written to. * However this is only beneficial on CPUs with a sane number of general * purpose registers which exclude the Intel x86. On Intel, better let the * compiler actually reload registers directly from original memory by using * macros. */ #ifdef __i386__ #define XPROD32(_a, _b, _t, _v, _x, _y) \ { *(_x)=MULT32(_a,_t)+MULT32(_b,_v); \ *(_y)=MULT32(_b,_t)-MULT32(_a,_v); } #define XPROD31(_a, _b, _t, _v, _x, _y) \ { *(_x)=MULT31(_a,_t)+MULT31(_b,_v); \ *(_y)=MULT31(_b,_t)-MULT31(_a,_v); } #define XNPROD31(_a, _b, _t, _v, _x, _y) \ { *(_x)=MULT31(_a,_t)-MULT31(_b,_v); \ *(_y)=MULT31(_b,_t)+MULT31(_a,_v); } #else STIN void XPROD32(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { *x = MULT32(a, t) + MULT32(b, v); *y = MULT32(b, t) - MULT32(a, v); } STIN void XPROD31(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { *x = MULT31(a, t) + MULT31(b, v); *y = MULT31(b, t) - MULT31(a, v); } STIN void XNPROD31(ogg_int32_t a, ogg_int32_t b, ogg_int32_t t, ogg_int32_t v, ogg_int32_t *x, ogg_int32_t *y) { *x = MULT31(a, t) - MULT31(b, v); *y = MULT31(b, t) + MULT31(a, v); } #endif #endif #ifndef _V_CLIP_MATH #define _V_CLIP_MATH STIN ogg_int32_t CLIP_TO_15(ogg_int32_t x) { int ret=x; ret-= ((x<=32767)-1)&(x-32767); ret-= ((x>=-32768)-1)&(x+32768); return(ret); } #endif STIN ogg_int32_t VFLOAT_MULT(ogg_int32_t a,ogg_int32_t ap, ogg_int32_t b,ogg_int32_t bp, ogg_int32_t *p){ if(a && b){ #ifndef _LOW_ACCURACY_ *p=ap+bp+32; return MULT32(a,b); #else *p=ap+bp+31; return (a>>15)*(b>>16); #endif }else return 0; } int _ilog(unsigned int); STIN ogg_int32_t VFLOAT_MULTI(ogg_int32_t a,ogg_int32_t ap, ogg_int32_t i, ogg_int32_t *p){ int ip=_ilog(abs(i))-31; return VFLOAT_MULT(a,ap,i<<-ip,ip,p); } STIN ogg_int32_t VFLOAT_ADD(ogg_int32_t a,ogg_int32_t ap, ogg_int32_t b,ogg_int32_t bp, ogg_int32_t *p){ if(!a){ *p=bp; return b; }else if(!b){ *p=ap; return a; } /* yes, this can leak a bit. */ if(ap>bp){ int shift=ap-bp+1; *p=ap+1; a>>=1; if(shift<32){ b=(b+(1<<(shift-1)))>>shift; }else{ b=0; } }else{ int shift=bp-ap+1; *p=bp+1; b>>=1; if(shift<32){ a=(a+(1<<(shift-1)))>>shift; }else{ a=0; } } a+=b; if((a&0xc0000000)==0xc0000000 || (a&0xc0000000)==0){ a<<=1; (*p)--; } return(a); } #endif gx/images/Main_file.png000664 001750 001750 00000017534 12702465756 016206 0ustar00sergiosergio000000 000000 PNG  IHDRP\2sBIT|d pHYs B4tEXtCreation Time02/17/09P)_ tEXtSoftwareMacromedia Fireworks MX*$IDATxyt[սg,ٖ'yc+dG"Є 826ZJ}wIaAU(Д׼ܐLMDęc;cǓxmClKY-/'MR9ke9g{~y)W^Mijj c&Ĩ^FWWEV&BwݻwSRRCz(,,غu/]7>X[TTt,<<˲sލM `M I<σvϲ4ݎ={߿?733󥌌:<@#;/iw`d1t:y޽0 $ XE}}=USS3M(NX)J95s:n S1x,b֬YRѨy<σ HReQVVƜ;wHRegg;vAPYz\w!i~G^WFHxKQ0 `xx'OVqϟ"GN?6ޮ0IL&p\"JJJVt}羠i4PZPvjrssۧkKA4xVk@n]]vksrr֮][2k֬/): p˖-S)AZǩGvo+ @#<<󼲬LYUUi -:x(==sHJe׋L...d2  @ / W.\xPtt5Mӝ^k"ClN2 Ji#BCPpV0 Aww7v׮] ^5f9rA,J2۫k$a 0 hv!& `H$R16`Y+Vp֭K p7Jօ7oߘzHOOGDDDbI룿OydOvFǗr qy"w9k͚5!' `\.&99;''q W͏y N3r|8t:ʕ+dwx~F1r ¹jA${$ ݻ1n;-Y6e `0} x^B\sMMM*A<LRiP0Ȳ0| LD1,)ѣG;E1p BNs"ĈLO>S8`Ā$%%umٲŹo> ˲߫qL& y4d_~zhhH>ހpaHÑ{0~a@ +q @ uZvHfsEQׄFӧͩ?$IR8~V͛7YYYhnnƅ @QŋC-?$۷oOZdeV~_|1e sakA?j0k,0zTDEE=@ ϝ)$>/_cxGrrr&}nFs=|xx8 F~111NMMMhjjlnD IVMvvv@C"4(Y$INq˅4 @Rbbb@t 8@ $&&4 ^wjVZj$$%%ax~cpHr@ƍ1ČT?*D Գgkjj…BԩSR$>OVURYY)\jKFXXؘg"aaa H$۷$I?FMM L&"##AQΝ;6q80 Xt)""":wpϞ=?)//W:7R_w:K,ڵk~rf[[eYaAEQ ( ˲杻mycXyy9222|miiACCNBL2iiihhh@?AGGjkkQWW׋\z[n˫< _',^#gXn_va7x`0 333/=Suww?~|]YYYebccΝg…W[[[wޕE6vVVk{?EEvinڴi{fϞ}F${ygJ*,,l޼ypc۷x@ fY;{sO> ؒ>###z5kv@ccc'[V^ŋÇ8qb9s ˗/UG|>eYbԩtoo?|ɂ JhXr}r!@ jkkmmm600£>#x={;{&ZG}E&Q*j AGGO :w/5EwuulK~y=[nڵk/9rիYU.\x$APʕ+5k?~IUUv~Ϝ>}!Tm(--}oɋCDDT*UIQUPpz;v쥏>H۷ѣ3g[SS#=|Ɵ?>{x\e 1!aˇ׿uqAAɊ͛7 kgJ>zfnoo;v/>zћok>ӹ/yN`HXzu ,R<}eY k12d$h4(ʽd2ilڴۗ_7y_gϞ>aaaToڴg̘2L| hnnO+|f۽Ar`<*o233ʄA1ddd  knݝq\#Gfi4|߰a?~$c?o;~.\P-x<֢yU*OZ/\m8vvΝ:TJ&&&Ĉ1EQ{V. EQRuՔ>)|rY 0L`6uX,_@ ]SS#r\3Ɲ /𧖖vuu lKe^L&|X ]M#o&.**(-4 H `}>۶m{[}}Anh]]]Fl޼a0c Z:|4Iv04)˲)W\!5MGZZڞ Œr!--w[Hdd$t:\|lH܏=X` ē$9 ^lۭK?zhE*ƕvZkZ充UV] ==' n<Ͳ,QVV6///8H$2TTT[ZVV7ߤr(cYYYm!M;?^/IKY8J%$$-[v822DtttdWWWE"-MQC&n8v؆nHhY~(mI,)R|sL?{hz[@27S( _C054ۀVl-@2)s2W6.P2 dt]ms^dS@1l.pB."e c=:N5-@9Ċ;=!,ׁ\G }*)Dz4# :LED<U -_hT1.0G8b |F37!ކJEd2ZIwq*}nS0޽OWnu(a:"jGĭbȚcma4>*ygZ1Ŀ <"8,p_ _ "@PTCU4lʨ9 !&a`ڜov~y+ybj`d4: hHm$VA;iA1ďϙkd?qi+mgQUSC (0K5D!_ttn i&$@ViU \wL!ˁWIPqhW`9ږ:m42s28UCadS{GN*z2 FS"t8\@8`bCKDAL*Qu]vrzV0_PD#(_~bzf7P\h4N8a>'pqq8/}G=cpX.!dׯ a  ssM Q,*ڦ2NRq=s08444x;wtl7ښ~}uywx'x6yV6DqFu7jDZ2c=---m۶y===a6MW3 }ݎ~{{;'N`Ν\./n`0>)!s=uv}k_ ܹs8h\.)ϓdؿ?R XXX… d2IdY穭exxT*vm鮮DR)HӤR)|Mxk|W U6N q@upT&Gg$W^ _xo],LNN+D.q t833Ccc#]]]:t>tL~?}mmm "˧$ :6;P s\T*QWWDž `ll.y\.hlldzz5ȑ#NX,:9s8w#իA}}C1 D1i5TxgK.]=rDgg'gϞexx#Go$lt:M2=_s/|/VΞ=˗n099APJ$8LNN=A$Z&,HFnED>kmF+02iN:Xg?Y1{(eӚY9:`n6ZY lu IM0 A +m`I{dAI"Q` "i;gM!9h7ަM?fHzs.k^U V@SӦEsvCIè> E46E& :ߊTZM;f@F$2[Djfb"2;vu5@9ͼs テy-` o# t#~sqţD%4݆&H iE0AZWhvoA1>R5#`oG ܄ 0Id_J!δ!\68톉$"Zl6̫W%WtR( BDU`]e&~(]&*̾-V5mFlS o# "޿Md04LkgndoB AKl-UvYZk@* @IkNEx(Ƙ6Ɩ3viä \[p}pue$f X5Gfkd^hGwxjG+ZlfߏudY^~[Lj*٢g4i^#`/~%Z6DƮZ'Cf_GF;Z*~g푵qk5vZ(#X&'uxq3~NZib } T7ZTA5XjK\+v'!n0mTuR-Q(W ߳G?E3mjI1~q˭: ס O beS6Os{a6\x\= x3H! (3i'=`{=;6hV;Fhcy| 5>LXtфmѫ Y\R\\"LX k-) 2%ƙ+kۍxi󵄸*,p4 Eq Ze:X!|x ~xWm~535ׂ؁⣨FB5OvZYUYXzChZTyOę-QZ@$"0̰v^@e81{_ɱڈ;vq/Z׸ĭ( z_p(ZGs '> }o? RDI5d5^TEZxmPѵ%^Wԕ!ѺefA8@VazX$nGR[qnV$uZi ,€m<뿺<2>22MkJS0XmD}M,! #2c٬ԙ6R~E4Ddayb5G  2&"cDoU 1TCD?ϐMN [M7l5`;tV [M7l5`;tV [Mx7<%(xxxYzҵ /[Ǿ| 93oy6׉1 'H=⟐U룋Tih^u~R{෸~ ڥi ҄uKkB̷Wa8KKw<#- =滐=e[C\aZ6}= <FL5LIENDB`core/input_hw/lightgun.c000664 001750 001750 00000024655 12702465756 016506 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Light Phaser, Menacer & Konami Justifiers support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" /************************************************************************************/ /* */ /* H-counter values returned in H40 & H32 modes */ /* */ /* Inside VDP, dot counter register is 9-bit, with only upper 8 bits being returned */ /* */ /* The number of dots per raster line is 342 in H32 mode and 420 in H40 mode */ /* */ /************************************************************************************/ static const uint8 hc_256[171] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; static const uint8 hc_320[210] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; static struct { uint8 State; uint8 Port; } lightgun; void lightgun_reset(int port) { input.analog[port][0] = bitmap.viewport.w / 2; input.analog[port][1] = bitmap.viewport.h / 2; lightgun.State = 0x40; lightgun.Port = 4; } void lightgun_refresh(int port) { /* Check that lightgun is enabled */ if (port == lightgun.Port) { /* screen Y position */ int y = input.analog[port][1] + input.y_offset; /* check if active line falls within current gun Y position */ if ((y == v_counter) && (y < bitmap.viewport.h)) { /* HL enabled ? */ if (io_reg[5] & 0x80) { /* screen X position */ int x = input.analog[port][0]; /* Sega Menacer specific */ if (input.system[1] == SYSTEM_MENACER) { /* raw position is scaled up by games */ if (system_hw == SYSTEM_MCD) { x = (x * 304) / 320; } else { x = (x * 289) / 320; } } /* External Interrupt enabled ? */ if (reg[11] & 0x08) { m68k_update_irq(2); } /* HVC latch enabled ? */ if (reg[0] & 0x02) { /* line accurate V-Counter value */ hvc_latch = 0x10000 | (y << 8); } else { /* HACK: force HVC latch even when disabled (a few games does not lock HV Counter but instead applies larger offset value) */ hvc_latch = 0x20000 | (y << 8); } /* pixel accurate H-Counter value */ if (reg[12] & 1) { hvc_latch |= hc_320[((x / 2) + input.x_offset) % 210]; } else { hvc_latch |= hc_256[((x / 2) + input.x_offset) % 171]; } } } else if (hvc_latch & 0x20000) { /* HVC should be free-running on other lines when latch is disabled (fixes "Gunfight - 3 in 1" randomization) */ hvc_latch = 0; } } } /*--------------------------------------------------------------------------*/ /* Sega Phaser */ /*--------------------------------------------------------------------------*/ INLINE unsigned char phaser_read(int port) { /* TL returns TRIGGER (INPUT_A) button status (active low) */ unsigned char temp = ~((input.pad[port] >> 2) & 0x10); /* Check that TH is set as an input */ if (io_reg[0x0F] & (0x02 << (port >> 1))) { /* Get current X position (phaser is only used in MS compatiblity mode) */ int hcounter = hctab[(Z80.cycles + SMS_CYCLE_OFFSET) % MCYCLES_PER_LINE]; /* Compare with gun position */ int dx = input.analog[port][0] - (hcounter << 1); int dy = input.analog[port][1] - (v_counter); /* Check if current pixel is within lightgun spot ? */ if ((abs(dy) <= 5) && (abs(dx) <= 60)) { /* set TH low */ temp &= ~0x40; /* prevents multiple latch at each port read */ if (lightgun.State) { /* latch estimated HC value */ hvc_latch = 0x10000 | (input.x_offset + (input.analog[port][0] >> 1)); lightgun.State = 0; } else { lightgun.State = 1; } } } return temp & 0x7F; } unsigned char phaser_1_read(void) { return phaser_read(0); } unsigned char phaser_2_read(void) { return phaser_read(4); } /*--------------------------------------------------------------------------*/ /* Sega Menacer */ /*--------------------------------------------------------------------------*/ unsigned char menacer_read(void) { /* D0=??? (INPUT_B), D1=TRIGGER (INPUT_A), D2=??? (INPUT_C), D3= START (INPUT_START) (active high) */ /* TL & TR pins always return 0 (normally set as output) */ /* TH always return 1 (0 on active pixel but button acquisition is always done during VBLANK) */ unsigned data = input.pad[4] >> 4; return ((data & 0x09) | ((data >> 1) & 0x02) | ((data << 1) & 0x04) | 0x40); } /*--------------------------------------------------------------------------*/ /* Konami Justifiers */ /*--------------------------------------------------------------------------*/ unsigned char justifier_read(void) { /* Gun detection */ if (lightgun.State & 0x40) { return 0x30; } /* Return TRIGGER (INPUT_A) & START (INPUT_START) button status in D0-D1 (active low) */ /* TL & TR pins should always return 1 (normally set as output) */ /* LEFT & RIGHT pins should always return 0 */ return (((~input.pad[lightgun.Port] >> 6) & 0x03) | 0x70); } void justifier_write(unsigned char data, unsigned char mask) { /* update bits set as output only, other bits are cleared (fixes Lethal Enforcers 2) */ data &= mask; /* gun index */ lightgun.Port = 4 + ((data >> 5) & 1); /* update internal state */ lightgun.State = data; } HISTORY.txt000664 001750 001750 00000167245 12702465756 013641 0ustar00sergiosergio000000 000000 --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/Misc] --------------- * added optional dynamic allocation of cartridge/CD hardware buffer (for platforms with BSS size limitation) * improved frame emulation timing, now starts with vertical blanking to reduce input lag by one more frame (!!!warning: this breaks compatibility with previous savestates!!!) * various code cleanup [Core/CD] --------------- * added CD-AUDIO & CD+G support * added optional support for external VORBIS library * added CDC & GFX register polling detection / synchronization * improved CDC emulation (fixes random freezes during Jeopardy & ESPN Sunday Night NFL intro) * improved emulation of mirrored memory areas * improved savestate format * improved Sub-CPU synchronization with Main-CPU (fixes "Soul Star") * improved Main-CPU & Sub-CPU idle loop detection (fixes "Super League CD") * disabled 68k and Z80 access to PRG-RAM when SUB-CPU is running (fixes "Dungeon Explorer") * disabled CD hardware reset on Soft-Reset (verified on real hardware) * fixed DATA track minimal length (fixes BIOS refusing to boot small homebrew demos) * fixed CDD "no disc" status code (fixes boot sequence loading time when no disc is loaded) * fixed AUDIO tracks length calculation when using separated files (WAV/OGG/BIN) with INDEX pause defined in CUE file * fixed OGG file seeking when using with CUE file * fixed PRG-RAM access from MAIN-CPU side on system reset * fixed state loading bug when SUB-CPU interrupt is pending * fixed incorrect masking of Level 3 (GFX) interrupts (spurious freeze during Japanese BIOS intro) * fixed H-INT vector handling when using Mode 1 * fixed access to "write-only" communication flags (verified on real hardware by Notaz) * fixed pending level 1 interrupts when GFX interrupt is disabled (fixes random freezes out of "Batman Returns" option menu) * fixed CDD seek command again (Final Fight CD freeze with model 2 BIOS) * optimized Sub-CPU / Main-CPU synchronization [Core/MD] --------------- * added support for some new unlicensed games with copy protection (Thunderbolt II, Tom Clown, Chaoji Puke / Super Poker) * added support for Everdrive extended SSF mapper * improved console region auto-detection for a few PAL-only games (The Smurfs Travel the World & Williams Arcade's Greatest Hits) * improved I2C EEPROM boards emulation accuracy * fixed Game Genie / Pro Action Replay lock-on support when Mega CD hardware is enabled * fixed SRAM support in Triple Play 96 & Triple Play - Gold Edition * fixed automatic CD loading with .md ROM files * fixed ROM padding for Sonic & Knuckles * fixed SRAM detection for games where it is mapped to work RAM ("Feng Kuang Tao Hua Yuan" crash) * fixed 1.7.4 regression with games using SRAM bank-switching [Core/MS] --------------- * added support for new SMS Power dump Jang Pung II (KR) * added support for Hi-Com X-in-1 mapper (thanks to Bock from SMS Power) * improved console hardware auto-detection * improved emulation accuracy of SG-1000 & Mark-III hardware * improved emulation accuracy of Japanese Master System I/O chip (315-5297) * fixed Boot ROM loading when switching system hardware * fixed 4MB ROM support [Core/GG] --------------- * added optional LCD ghosting software filter * fixed mirrored access to I/O control register (G-LOC Air Battle) [Core/SG] --------------- * added support for SG-1000 II clone hardware (2KB RAM + integrated VDP/PSG chip 315-5066) * fixed SG-1000 internal RAM size (1KB instead of 2KB) * restored SG-1000 Pause button support [Core/CPU] --------------- * fixed Z80 SP register initialization on power-on for Master System & Game Gear (Ace of Aces, Shadow Dancer, Ecco the Dolphin, Evander Holyfield Real Deal Boxing) [Core/IO] --------------- * added Sega Graphic Board support (thanks to SMS Power) * added Master Tap emulation (multi-player support in Boom homebrew) * added gamepad type auto-detection * added support for XE-1AP controller on both ports * improved XE-1AP controller emulation * improved HVC latch behavior for gun emulation (fixes "Gunfight - 3 in 1" randomization when using Justifier) * improved control pad emulation accuracy (verified on real hardware) * improved 4 Way-Play emulation (fixes multitap detection in CD games) * fixed TeamPlayer emulation (fixes multitap detection in Gauntlet 4) [Core/VDP] --------------- * implemented proper FIFO ring-buffer & unused bits behavior on CRAM/VSRAM reads (verified on real hardware by Nemesis) * improved accuracy of DMA Copy/Fill & added support for CRAM/VSRAM Fill (verified on real hardware by Nemesis) * improved V28/V30 mode switching during active display (verified on real hardware) * improved Mode 5 sprites parsing accuracy (verified on real hardware) * improved Mode 5 sprites rendering timings (fixes "Overdrive" demo) * improved FIFO timings accuracy (fixes "Overdrive" Demo) * improved H-Counter accuracy in H32 mode * improved accuracy of Master System color palette brightness range (verified against real hardware) * fixed misaligned buffer writes in Mode 4 when -DALIGN_LONG option is used * fixed alpha channel for 15-bit (RGB555) and 32-bit (RGB888) color support * fixed register #10 state on VDPreset (fixes GG Terminator 2: Judgment Day) * fixed Mode 1 rendering (TMS99xx "text" mode) * fixed Master System II extended video modes sprite parsing (fixes Mega Man 2 demo) * fixed Game Gear display rendering regression when left/right borders were disabled * fixed 68k cycles delay on invalid VRAM writes (fixes "Microcosm" intro loop) * optimized tile caching [Gamecube/Wii] --------------- * added configurable BIOS & Lock-on ROM files * added configurable NTSC filter * added configurable FPS display & toggleable fast-forward key combo (HOME + MINUS with Wii controllers or R TRIGGER + START with Gamecube controller) * added 50hz progressive mode (576p) support for emulation * reduced SRAM files size * improved A/V Sync: when VSYNC is enabled, audio resampler output rate is now adjusted (+/-0,1 %) to always keep audio & video synchronized and input lag is reduced by one frame. * improved GX video rendering (fixes screen tearing when VSYNC is disabled) * improved ROM browser scrolling speed and added support for Classic Controller +/- buttons for page scrolling * improved Cheats Menu * fixed bug with PICO pointer * fixed lightgun crosshair & CD leds positionning when using NTSC filter * fixed low-pass filter menu setting * various code cleanup & optimizations [Gamecube] --------------- * improved progressive mode switch request on startup when component cable is detected * disabled simultaneous multiple .ogg files opening (fixes crashes caused to RAM size limitation) * fixed broken DVD support [Wii] --------------- * added support for Wii U Pro Controller * added Wiimote pointer calibration in Menu settings * added configurable Wiimote timeout * added game auto-load support through DOL args (compatible with "Wiiflow" plugin arguments) * fixed support for 3rd-party classic controllers with invalid calibration settings [GCW0] --------------- * added GCW Zero port by Shin-NiL & David Knight (based on SDL port) [PSP2] --------------- * added PS VITA port by frangarcj [libretro] --------------- * added optional bootrom support for Master System, Game Gear & Mega Drive / Genesis * added support for all emulated devices (except Activator) * added support for in-game resolution changes through RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO * added support for .mdx ROM files * added missing core settings (system hardware, region, lock-on, multitap, master system FM,...) * fixed incorrect SRAM file saving * fixed framebuffer size for PAL interlaced mode * fixed viewport width when NTSC Filter is enabled with Mega Drive or Mega CD games using H-32 mode * code cleanup --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.4 (21/06/2013) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * fixed access to read-only registers on Main-CPU side ("Batman Returns" platform level freeze) * fixed & improved emulation of PRG-RAM write protection register ("Lunar Eternal Blue" japanese version freeze) * improved SUB & MAIN-CPU synchronization ("Dracula Unleashed" freeze when using US Model 2 BIOS) * improved CPU polling detection * improved CDD emulation & added CD drive access time for SEEK command ("Panic!/Switch" intro missing scene) * added missing reinitialization of MAIN-CPU PRG-RAM bank on reset * added .OGG audio tracks support through LIBTREMOR [Core/Sound] --------------- * fixed YM2612 configurable DAC depth emulation * improved Low-Pass filter * added optional "MONO" output mode [Core/VDP] --------------- * fixed FIFO access timings when using invalid write code value ("Clue" menu) * fixed DMA Copy with undocumented code value ("Fatal Labyrinth" end sequence) * minor code fixes & optimizations [Core/CPU] --------------- * optimized 68k stack read/write functions * fixed broken 68k address error emulation * fixed 68k interrupt behavior (prevents interrupts from being executed multiple time when 68k is halted) * fixed Z80 registers initial state, added proper initialization when using PBC (verified on real hardware by Charles McDonald) [Core/MD] --------------- * fixed SRAM incompatibilities between BIG ENDIAN & LITTLE ENDIAN platforms (note: this breaks old .srm files with LITTLE ENDIAN platform ports) * added support for a few recently dumped unlicensed games * added auto-detection of byte-swapped ROM files [Gamecube/Wii] --------------- * fixed CD Leds positioning when using NTSC filter * improved on-screen CD Leds (thanks to Iceknight) * various code fixes & improvements --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.3 (26/11/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Gamecube/Wii] --------------- * fixed broken input system initialization --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.2 (24/11/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added default TOC for Shadow of the Beast II (prevent hangs when audio tracks are missing) * fixed CD-DA fader muting * fixed PCM channels panning on reset * fixed backup RAM file management when using disc swap with Mode 1 cartridge * incremented CD drive read latency: fixes Space Adventure Cobra (freeze when opening coffin at 2nd morgue scene) * improved CDD emulation accuracy: fixes Snatcher (freeze at the end of Act 2) & various CD player bugs * improved MAIN-SUB memory map mirroring in SCD mode (verified on real hardware by Charles McDonald) * implemented cycle-accurate "stopwatch" register emulation [Core/Sound] --------------- * fixed broken PSG noise frequency * fixed incorrect Game Gear PSG stereo emulation * implemented cycle-accurate Game Gear PSG stereo [Core/VDP] --------------- * fixed broken VDP DMA from SVP ROM latency (graphic errors in Virtua Racing) [Core/MD] --------------- * added Super Mario World 64 (unlicensed) cartridge hardware emulation [Core/Input] --------------- * added automatic detection for CD games with Justifier/Menacer support * improved Justifier/Menacer emulation [Gamecube/Wii] --------------- * fixed screen rendering when borders are disabled * added configurable on-screen CD leds [Wii] --------------- * DVD light now indicates when virtual CD tray is open * fixed automatic input settings detection * improved lightgun crosshair positionning --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.1 (13/10/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added support for CUE files * added CD-DA tracks emulation (needs CUE+BIN or ISO+WAV images) * added CD fader emulation * added CDD "Fast FW" & "Fast RW" commands emulation * improved CDD TOC emulation (random freezes in Sonic CD, Switch/Panic, Final Fight CD and probably many others) * improved PCM chip synchronization with SUB-CPU (missing speeches in Willy Beamish) * fixed PCM chip emulation (random hangs in Snatcher, missing sound effects in Switch/Panic, Final Fight CD, Wonderdog...) * fixed Word-RAM memory mode on soft-reset (missing logo gfx effects) * fixed SUB-CPU access to unused areas when using PC-relative instructions (Final Fight CD first boss random crash) * fixed CPU idle loop detection on memory mode register access (Pugsy CD first boss slowdown) * fixed Mode 1 emulation (cartridge boot mode) [Core/Sound] --------------- * replaced FIR resampler by Blip Buffer for FM resampling * modified SN76489 core for use of Blip Buffer * improved PSG & FM chips synchronization using Blip Buffer * added Game Gear PSG stereo support * fixed SG-1000 specific PSG noise * fixed YM2612 LFO AM waveform (California Games surfing event) * fixed YM2612 phase precision * minor optimizations to YM2612 core [Core/Game Gear] --------------- * added support for CJ Elephant Fugitive (recently released by SMS Power) * added Game Gear extended screen option [Core/Genesis] --------------- * added support for a few recently dumped (but unreleased) games [Core/General] --------------- * improved ROM & CD image file loading * various code cleanup [Gamecube/Wii] --------------- * added automatic disc swap feature * removed automatic frameskipping (no use) * improved general audio/video sync * various code cleanup & bugfixes --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.7.0 (01/07/2012) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/SCD] --------------- * added Mega CD / Sega CD hardware emulation (incl. Sub 68K, CDD, CDC, PCM, GFX rotation/scaling, etc) * added .ISO & .BIN CD image file support * added 512K backup cartridge RAM support * added savestate support for CD games NOTES: ~~~~~~ * to play CD games, original BIOS ROM files are required in /genplus/bios/ directory: unzip & rename them to bios_CD_U.bin, bios_CD_E.bin, bios_CD_J.bin * CD audio tracks (CD-DA) are not supported (yet) [Core/CPU] --------------- * modified 68k core for Mega CD / Sega CD support * optimized 68k core using prebuild const tables [Core/VDP] --------------- * improved DMA accuracy * improved accuracy of nametables register & VSRAM writes during HBLANK: fixes "The Adventures of Batman & Robin" (graphical issues during 2nd Boss fight). * added support for 8-bit VRAM writes with undocumented code value (verified on real hardware by Nemesis) [Core/Sound] --------------- * improved synchronization between SN76489 & YM2162 cores. * improved accuracy of SN76489 core timings. [Core/MD] --------------- * added support for some recently dumped unlicensed games. * improved emulation of 32k bankswitch hardware used by a few unlicensed games. * fixed behavior of Z80 banked reads from 68k RAM (verified on real hardware). * fixed support for 128K Pro Action Replay ROM. [Core/MS] --------------- * added support for all recent korean ROM dumps by SMS Power. * added emulation of korean multi-game mapper (4-Pak All Action) * added pseudo-random RAM pattern initialization on Mark-III and Japanese Master System (fixes "Alibaba and 40 Thieves" & "Block Hole") * added port $3E emulation & internal BOOTROM support (Master System & Game Gear only). [Core/General] --------------- * added an option to set VDP mode (PAL/NTSC) independently from console region. * added an option to select original system master clock frequency (PAL/NTSC/AUTO), emulation will run at selected frequency when VSYNC is disabled. * fixed 68k context loading/saving (Sol Deace). * fixed C89 incompatibilities for better portability. * removed use of "long int" type for portability on 64-bit platforms. * moved savestate zlib compression out of emulation core (for ports that don't use it). * various optimizations. [Gamecube/Wii] --------------- * removed ROM load device selection from Load Menu: default ROM device must now be configured in menu settings. * added specific load buttons, browsers & saved paths for each systems, this also fixes slowdowns caused by screenshot loading when browsing from slow devices. * added support for left/right buttons as page up/down keys in ROM browsers * added right analog stick as default "return to menu" key for Gamecube controllers * added alternate remappable menu key combo for Gamecube controllers * added an option to disable VSYNC (emulator is synced with audio hardware instead of video). * added an option to boot system from "BIOS", with or without cartridge. * added Master System & Game Gear "BIOS" support (files should be named bios_U.sms, bios_J.sms, bios_E.sms & bios.gg and copied to /genplus/bios directory). * replaced "Hard Reset" button by a Soft Reset for systems having a Reset button (Mega Drive / Genesis & Master System) * State & SRAM files are now only compressed when saving to Gamecube Memory Cards * various fixes & cleanup. * compiled with devkitPPC r26 & libogc 1.8.11. [Gamecube] ---------- * improved progressive mode support when component cable is detected (hold B during startup to switch menu video mode configuration) --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.6.0 (07/08/2011) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/Sound] --------------- * added YM2413 emulation in Master System compatibility mode. * fixed SN76489 noise boost initialization. * minor YM2612 core optimizations. [Core/VDP] --------------- * added accurate emulation of SG-1000, Master System (315-5124, 315-5246) & Game Gear VDP. * added support for all TMS9918 rendering modes. * improved Mega Drive VDP timings accuracy in Master System Compatibility mode. * fixed color palette initialization. * fixed shifted sprites rendering in Mode 4. * modified pixel rendering support (pixel depth is now forced at compilation time). [Core/CPU] --------------- * optimized 68k core (rewrote 68k interrupt handling, removed multiple CPU types support & unused code) for 5~8% speed improvment [Core/IO] --------------- * added accurate emulation of Master System (315-5216, 315-5237, 315-5297) & Game Gear I/O controllers. * added Terebi Oekaki tablet emulation. * improved Mouse emulation (fixes mouse support in Cannon Fodder). * improved Justifier emulation (fixes gun support in Lethal Enforcers 2). * improved 6-Buttons control pad emulation (fixes Duke Nukem 3D) * modified lightgun emulation to use common key inputs for all devices. * 2-buttons controller is now picked by default for Master System games. [Core/MD] --------------- * added copy-protection hardware emulation for some new dumped games (Tiny Toon Adventures 3, Mighty Morphin Power Rangers & The Battle of Red Cliffs). * added Game Toshokan in EEPROM database (verified on real cartridge). * fixed Micro Machines 2 - Turbo Tournament EEPROM size (verified on real cartridge). * modified SRAM banswitch hardware emulation to be more compatible with some hacks. [Core/MS] --------------- * added Cyborg Z to Korean mapper database. * [Core/GG] --------------- * added 93C46 EEPROM emulation (Majors Pro Baseball, World Series Baseball & World Series Baseball 95). [Core/General] --------------- * added support for .mdx ROM format. * added Game Gear & SG-1000 ROM support. * added accurate emulation of SG-1000, Master System (I, II) & Game Gear hardware models for 100% compatibility. * updated to new Genesis Plus license (see http://cgfm2.emuviews.com/) * various code cleanup. [Gamecube/Wii] --------------- * IMPORTANT: cheats, screenshots & save files are now stored in console-specific directories (ex: /snaps/md, /cheats/ms, /saves/gg, ...) * added 8-bit Action Replay & Game Genie codes support (for Master System & Game Gear games). * improved audio/video synchronization for PAL games in 50Hz TV modes (now use VSYNC like NTSC games in 60hz modes). * improved gun cursor positioning accuracy. * improved horizontal scaling & screenshots rendering in H32 mode. * fixed a bug with ROM file extension handling that would affect cheats, snapshots, sram & savestate files. * removed ARAM/injected ROM support (unused). * removed WPAD_ and PAD_ update from VSYNC callback. * increased GCC inlining limits for some speed improvment. * compiled with devkitPPC r24 & libogc 1.8.7. --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.5.0 (31/03/2011) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/VDP] --------------- * added support for Master System compatibility mode (Z80 ports access mode), incl. Mode 5 rendering. * added Mode 4 rendering for both Genesis & Master System modes. * added alternate BG planes rendering functions (should be faster on PPC architectures). [Core/IO] --------------- * added support for Master System compatibility mode (Z80 ports access mode). * added Master System peripherals emulation (Control Pad, Paddle, Sports Pad & Light Phaser). * added XE-1AP (analog controller) emulation. * added Activator emulation. [Core/Extra] --------------- * added support for all known Master System cartridge mappers. * added copy-protection hardware emulation for a few MD unlicensed games: fixes 777 Casino (crash when talking to bunny girls). (NB: most of those unlicensed games seem to have been already patched by ROM dumpers, main purpose is documenting them) * added support for Top Shooter arcade board controller. (A=Shoot, B=Bet, C/RIGHT=Coins, START=Start, hold UP on startup to enter service mode) * improved King of Fighters 98 mapper emulation (registers address decoding is now 100% accurate) * fixed Game Genie when several codes affect same ROM address. * fixed EEPROM types for Brian Lara Cricket & NBA Jam TE (verified on real cartridges) [Core/General] --------------- * added Master System compatibility mode emulation (automatically enabled when loading ROM file with .sms extension). * improved savestate stability & compatibility (support for old 1.4.x savestates is preserved) * various code cleanup & comments. [Gamecube/Wii] --------------- * fixed cheat codes handling when several codes affect same ROM address. * improved input controller detection on menu exit. * improved key remapping dialog box to match emulated device * changed Menu key for Gamecube controller to allow MODE button mapping * fixed DVD not being unmounted on swap (memory leak) [Wii only] --------------- * added USB mouse support for Sega Mouse emulation * compiled with latest libogc: improves USB compatibility & fixes stability issues with Wiimotes. --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.4.1 (04/12/2010) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/VDP] --------------- * improved VBLANK flag accuracy, as observed on real hardware. * improved DMA operations accuracy, writes are now performed on a scanline basis: fixes Gaiares (flickering title screen). * improved DMA Fill timing accuracy. * fixed DMA with bad code values: fixes Williams Arcade Classics (corrupted gfx after soft reset). * fixed horizontal resolution changes during HBLANK: fixes Bugs Bunny in Double Trouble (2nd stage). * fixed Vertical Counter in interlace mode 1, as observed on real hardware. * fixed horizontal border width, as observed on real hardware. * various code improvments & optimizations. [Core/Extra] --------------- * improved savestate format: added DMA, SVP, cartridge mapping & internal registers state informations * improved unlicensed ROM mappers emulation * added Chinese Fighters III mapper support * added Top Fighter mapper support * fixed Barver Battle Saga mapper support * fixed cartridge hardware soft-reset (Game Genie, SVP, ...) * fixed Game Genie registers byte reads [Gamecube/Wii] --------------- * added message box when inputs config uses disconnected controllers. * added message box when settings are reseted to default on startup. * fixed default inputs configuration. * fixed memory leak in Cheat Menu causing spurious resets. * added an option to enable/disable automatic cheat activation * increased max number of cheat codes * optimized cheat codes requiring RAM patching. * improved default horizontal scaling to better match output from a real Mega Drive [Gamecube specific] --------------- * fixed inverted keys in cheat menu. * fixed audio input frequency, now use exact audio hardware samplerate, as measured on my Game Cube (~48044 Hz), (NB: Wii samplerate has been verified to be closer to 48000 Hz) [Wii specific] --------------- * added the possibility for any wiimotes to be used as input device, regardless of the connected expansion controller. * fixed USB drive not being detected when application is loaded from USB (HBC), thanks to Tantric for the tips. --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.4.0 (01/11/2010) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core/Sound] --------------- * completely rewrote sound processing/mixing: sound chips are now clocked with exact output framerate to ensure 100% smooth video & audio playback, with no lag or skipping, while rendering an accurate number of samples per frame and keeping PSG & FM chips in sync. * improved PSG & FM chips synchronization with CPU execution (fixed point precision). * improved YM2612 core general accuracy (SSG-EG, CSM mode,...) (based upon Nemesis recent tests on real hardware) * improved YM2612 LFO emulation accuracy: fixes "Spider-Man & Venom : Separation Anxiety" (intro) * fixed YM2612 bug with Timer B: fixes "Langrisser Hikari II"/"Der Langrisser II" (Sega logo) * fixed YM2612 context saving/loading. * fixed YM2612 state on reset. * removed outdated & less accurate Gens YM2612 core * added configurable YM2612 DAC resolution emulation. * added configurable & faster FIR resampler (thanks to Blargg & AamirM), removed libsamplerate support. * added configurable Low-Pass filtering * added configurable 3-Band Equalizer (thanks to Neil C). * added an option to boost SN76489 Noise Channel. * adjusted SN76489 cut-off frequency. * implemented Blargg's blip buffer in SN76489 core (all channels are now lineary interpolated) [Core/VDP] --------------- * added support for CRAM writes during horizontal blanking (Striker, Zero the Kamikaze Squirrel,...) * added support for 2-Cell vertical scrolling in Interlaced 2 mode * added support for some undocumented mode register bits * added proper emulation of HV Counter latch: fixes Sunset Riders intro * added pixel-accurate emulation of mid-line display on/off (Nigel Mansell World Championship PAL, Ren & Stimpy's Invention PAL,...) * improved 2-cell vscroll emulation accuracy, as verified on real hardware (Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge) * improved FIFO timings accuracy: fixes Sol Deace intro * improved sprite masking accuracy (thanks to Nemesis for his test program) * improved sprites processing accuracy: fixes (un)masked sprites in Mickey Mania (3D level), Sonic 2 (VS mode). * improved HBLANK flag timing accuracy: fixes Mega Turrican (Sky level) * improved horizontal blanking & HINT/VINT occurence timing accuracy, as measured on real hardware. * improved HCounter accuracy in 40-cell mode, as measured on real hardware. * improved color accuracy in VDP highlight mode to match results observed on real hardware [Core/CPU] --------------- * updated Z80 core to last version (fixes interrupt Mode 0 timing and some BIT instructions). * fixed some Z80 instructions timing. * fixed state of Z80 registers on reset (sound issues with Defender & Defender 2 in Williams Arcade Classics) * improved Z80 interrupt accuracy * improved 68k accuracy (initial Reset timing + auto-vectored interrupts handling). * improved 68k timing accuracy for DIVU/DVIS (thanks to Jorge Cwik) & MULU/MULS instructions. * implemented 68k undocumented flags behavior for DIVU/DIVS instructions (Bloodshot / Battle Frenzy) * improved Z80 & 68k cpu execution/synchronization accuracy by using Master Clock as common reference (now run exactly 3420 M-Cycles per line). * modified Z80 & 68k cores to directly use external cycle count instead of intermediate counters. [Core/Extra] --------------- * added Game Genie hardware emulation. * added Action Replay & Pro Action Replay hardware emulation (only preliminary Pro Action Replay 2 support). * added Sonic & Knuckles "Lock-On" support. * added Cartridge "Hot Swap" feature. * added missing EEPROM support in more games. * added VDP lock-out emulation (TMSS). * improved emulation of copy-protection hardware found in some unlicensed cartridges (Mulan, Pocket Monsters II). * fixed Realtec mapper emulation: fixes missing sound in Balloon Boy / Funny World. * fixed lightgun auto-detection: fixes default cursor position in Lethal Enforcers II. * enabled simultaneous use of multitap & J-CART (Super Skidmarks 6-player mode) * lots of code cleanup, bugfixes & optimization. [Gamecube/Wii] --------------- * implemented custom FONT engine (uses internal IPL font & GX hardware rendering). * implemented custom GUI engine (uses GX hardware rendering & multithreading) * implemented advanced menu interface (IR pointing, game snapshots, cheats & saves manager, visual & sound effects, BGM support, etc). * improved audio/video synchronization to ensure 100% smooth video & audio playback. * improved soft-reset button support, now works more like real Mega Drive / Genesis (model 1) reset button. * improved lightgun cursors layout. * added automatic ROM loading feature (last played game launches immediately when starting the emulator) * added PAR codes and .pat files support * fixed lot of stability issues and potential memory leaks. [Wii specific] --------------- * added Video Hardware "Gamma" control * added Video Hardware "Trap Filter" control * improved Mouse emulation through Wii remote * compiled with devkitPPC r22 & libOGC 1.8.5 (includes SDHC & USB2 support through IOS58, removes DVDX support) --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.3.1 (20/12/2008) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Gamecube/Wii] * improved sound engine * modified frame synchronization (now use audio DMA interrupt) --------------------------------------------------------------------------------------------------------- Genesis Plus GX 1.3.0 (14/12/2008) (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * YM2612 bugfixes (MAME core): .fixed EG Decay->Substain transition when SL & DR are minimals: fix tracks #3 and #9 in "Mega Turrican" .fixed a bug in SSG-EG emulation code: fix Level 1 music in "Alisia Dragoon" .modified SSG-EG Decay End Level: fix some sound effects (ChainSaw, Zap...) in "Beavis & Butthead" .improved Detune overflow accuracy: fix very high frequency sounds in many games .fixed registers 0x20-0x26 Reset state: fix intro music in "B.O.B" .reverted incorrect fix with KEY ON: fix "Flamethrower" sound effect in "Alien 3" and many others * adjusted HCounter values: fixes line flickering in "Sonic 3D" bonus stage * adjusted VINT timing: fixes hang-up in "V.R Troopers" * improved HBLANK flag accuracy: fixes line flickering in "Gouketsuji Ichizoku" * fixed broken Z80 access to WRAM: fixes hang-up in "Mamono Hunter Youko" * modified JCART emulation: fixes corrupted tracks logo in "Micro Machines 2" * added Blargg's NTSC Filters support (NTSC video artifacts emulation) * optimized VDP rendering core, rewrote 68k interface (memory handlers, cycle execution, interrupts): greatly improved emulation speed [Gamecube/Wii] * remove slowest libsamplerate settings under "HQ YM2612" option, only keeps SRC_LINEAR (faster) and SRC_SINC_FAST (better) * added an option to enable/disable bilinear filtering * rewrote video engine: improved horizontal scaling (VI+GX), improved rendering speed (direct texture mapping) * removed embedded font, (re)enabled IPL font support: now should works for Qoob users too (thanks to emukiddid) * fixed "Reset" button behavior, now acts more like Genesis Reset button ;-) * patched libfat for faster SDCARD accesses (thanks to svpe) * SRAM and SaveState filenames are now based on the ROM filename (for FAT devices only) * various bugfixes, menu tweaks and code cleanup [Gamecube] * added 480p support in menu [Wii] * implemented fast scrolling in menu using Wiimote D-PAD * added "Power" button support * added USB Storage support * Widescreen menu fix * *new* libogc 1.7.0 features: SDHC support, Wiimote shutdown button support --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080826 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * YM2612(MAME): fixed LFO phase update for CH3 special mode: fix sound effects in Warlock & Aladdin (thanks to AamirM) * YM2612(MAME): fixed EG attenuation level on "KEY ON": fix Ecco 2's splash sound * YM2612(MAME): fixed SSG-EG emulation: fix Bubba'n Stix (Track 5) and many others * YM2612(MAME): replaced sample interpolation with libsamplerate support, High Quality mode is now more accurate * implemented cycle-accurate HINT timings: every timing sensitive games/demos are now *finally* working fine * fixed a bug affecting CRAM/VSRAM DMA timings * fixed Sprite Attribute Table address mask for VRAM writes * improved accuracy of 68k access to Z80: fix music in Pacman 2 when entering PAUSE menu * disabled "Address Error" emulation when UMK3 hack is loaded: fix game crashing after a round ends up * added support for some more unlicensed games: Pocket Monster, King of Fighter 98, Soul Blade (credits to Haze) * improved Menacer emulation: fix lightgun support in Body Count & T2: The Arcade Game * added Konami Justifier emulation: fix lightgun support in Lethal Enforcers 1 & 2 * added Sega Mouse emulation (Populous 2, Body Count, Shangai 2, Fun'n Games, ...) [Gamecube/Wii] * added Wiimote support for Menacer/Justifier/Mouse * added DVD support in Wii mode (no modchip required) * added "Gun cursor" option to enable/disable gun position display * added "Invert Mouse" option to invert Sega Mouse vertical axe (required by some games) * improved Controller options: Wiimote/Nunchuk and Classical Controllers can now be affected separately to ANY player --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080716 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * adjusted (again) HINT timings: fix Double Dragon 2 (game freezed), hopefully does not break anything else * fixed broken EEPROM support for Codemaster games * modified input update timings: fix Dungeons & Dragons * Warriors of the Eternal Sun (thanks to Notaz) * added support for "Ultimate Mortal Kombat Trilogy" hack (max. size supported is 10MBytes) * added (VERY) preliminar support for PICO roms (credits to Notaz for his documentation) * improved YM2612 emulation (credits to Nemesis for his tests on real hardware): .implemented phase overflow emulation: improved fix for special music instrument used in Comix Zone, Flashback, Ariel, Shaq Fu... .improved SSG-EG emulation in MAME core (also based on additional code from Alone Coder) .improved Timers emulation accuracy .improved Enveloppe Generator accuracy .fixed Channel 3 CSM mode emulation .implemented sample interpolation in MAME core to emulate the chip at original frequency (HQ YM2612 mode, from gens) [Gamecube/Wii] * added automatic alphabetical filesorting (Marty Disibio) * added ROM History for faster ROM access (Marty Disibio) * fixed a silly input bug in "ROM Infos" & "Game Genie" menus * modified "Hard Reset" option * improved display sharpness in original rendering mode (H40 cell mode only), filtering is now completely disabled * enabled overscan emulation in "STRETCH" aspect mode also * added support for horizontal wiimote handling in Menu (automatically used when the wiimote is not pointed towards the screen) * improved Controller options .prevented keys reconfiguration if device is not detected .added support for up to 8 players (ISS Pro Deluxe, ...) .each player can be affected to a custom device (GAMECUBE Pad, WIIMOTE/NUNCHUK or CLASSIC) .added the ability to use classic controller & wiimote pad from the same port separately .modified "soft-reset" key on the Wiimote to avoid "accidental" resets (now press Buttons + & * simultaneously) .added MODE button mapping: use "START+Z" on gamepad or "Button Minus" on wiimote/classic (not reconfigurable) .added automatic configuration save for controller options --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080601 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * improved HCounter accuracy: fix graphic glitches in "Striker (Europe)" * improved HINT timing accuracy: fix flickering in "Zero The Kamikaze Squirrel (USA)" * improved rendering accuracy when backdrop color is modified during HBLANK (Road Rash I/II/III) * fixed broken Game Genie support [Gamecube/Wii] * added full horizontal scaling (up to 720 pixels) when using "stretch" aspect mode (use Xscale to increase width) * added progressive mode support (480p) in menu also * added automatic SRAM/FreezeState support (OFF by default, check "system options") * added automatic configuration file support * /genplus/saves is now automatically created if it does not exist * use libfat automatic SDCARD detection: default slot is now always used when accessing SDCARD * assigned Reset Button to Genesis Soft-Reset [Wii] * added automatic TV mode detection (from SYSCONF), no more PAL60 version needed * added option to return to Wii System Menu * fixed "TP reload" option: now compatible with HB channel * removed SD-Gekko support (Wii slot becomes default slot) * added Wii SD slot support for SRAM & FreezeState files * added Wiimote, Nunchuk & Classic controllers support through libwiiuse (see User Manual for default keys) * added customizable key mapping (for each configurations: wiimote only, wiimote+nunchuk or classic) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080419 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * modified VINT timings a little bit: fix lockup during Desert Strike's intro * corrected 68k interrupts handling: fix graphic glitches in Darius II/Sagaia [Gamecube/Wii] * fixed 60Hz "Bilinear" rendering mode (was broken in last release) * fixed issue with the 1st file when browsing SDCARD through SD-Gekko * fixed GX initialization: fix "freeze" issue that occured sometime when starting a game * added "Wii Reboot" option * added PAL 50hz support in menu (black borders) * added progressive rendering mode support (480p) in Wii mode (not supported by the PAL60 version, use the other one !) * compiled with a modified libogc: should definitely fix the PAL "red screen" issue for RGB-cable users (still use the PAL60 version !) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080406 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * updated SVP core: fix some perspective issues in Virtua Racing (thanks to Notaz) * added internal SAT update during VRAM Fill: fix unmasked sprites during Battletech's intro * fixed m68k core issues with gcc 4.2.3: fix Xperts, Lemmings 2, M1 Abrams Battle Tank * forced YM2612 Enveloppe update: fix intro music in Batman&Robin (thanks to Aamir) [Gamecube/Wii] * removed not working DVD features (Wii mode only) * fixed Timers with PAL roms * added EURGB60 TV mode support: fix "red screen" issue with PAL Wii when using RGB cable * added PAL50 TV mode support (PAL and NTSC roms), see video options * added "TP reload" option, use "System Reboot" (Wii mode only) * added Front SD rom loading support with LFN & subdirectory browsing (Wii mode only) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080301 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * added SVP emulation: Virtua Racing is now emulated (big thanks to Notaz and TascoDeluxe) * fixed VDP registers behaviour when VDP Mode 4 is enabled: fix Bass Masters Classic Pro, Captain Planet & The Planeeters * corrected a bug in DMA Fill operation: fix James Pond 3, Rockman World/Megaman Willy Wars (corrupted VRAM) * corrected typo errors in CPU cycle counters update: fix optiom screen music in "College Slam" and probably others games. * added preliminary support of undocumented YM2612 bug: fixes soundtracks of Shaq Fu, Spiderman, Comix Zone, Ariel and some others * added support for mappers & copy protection devices used in many unlicensed/pirate cartridges (see cart_hw.c for details) * rewrote memory handlers for better modularity and some (little) speedup * reduced Savestate size [Gamecube] * compiled with last LibOGC (20080228): fix issues when unplugging controller, support for Wii mode (see release.txt) * added "hard-coded" IPL font (no more direct access to BOOTROM): fix font problem for Qoob users * added SDCARD Slot B support for loading Roms * removed unused MAME PSG Core * added 'Force DTACK' option for prototype games usually hanging on real hardware (example: Sonic Crackers) * added an option to underclock SVP core (with default cycle count, Virtua Racing actually does not run fullspeed in GC mode) * fixed frame timing in PAL mode * fixed analog stick sensitivity --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 080107 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * fixed interleaved rom detection: roms with .smd extension should now work fine * fixed a recently introduced bug in VDP registers writes: fixes bad colors in Toy Story (intro) * updated list of games using EEPROM: added Sports Talk Baseball (internal memory check fixed) and Brian Lara Cricket * fixed VINT flag update when VINT is disabled: fixes NCAA College Football * adjusted DMA timings in H32 mode: fixes flickering in Out of this World, Kawasaki Superbike Challenge & Formula One * adjusted line rendering and HBLANK timings: fixes flickering in Nigel Mansell's World Championship Racing, Deadly Moves/Power Athlete * fixed unmapped ROM reads through Z80 Bank: fixes Zombie High (Proto) * added support for custom ROM/RAM mapping used by Game no Kanzume Otokuyou [Gamecube] * fixed broken SDCARD support for SRAM and Savestate files --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 071230 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Gamecube] * fixed ROM injector base address (DATA section 1) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 071228 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * many sourcecode cleanup and optimization * completely rewrote EEPROM emulation: now support all known EEPROM types (24C01-24C65) and mappers (Sega, Acclaim, EA, Codemasters) used in a few games (now use internal game database) as external RAM. This should at least fix save support in the following games: . NBA Jam (alternate Acclaim mapper) . College Slam, Frank Thomas Big Hurt Baseball (24C65 type) . NHLPA Hockey 93, Rings of Power (EA mapper) . Micro Machines serie, Brian Lara Cricket 96/Shane Warne Cricket (Codemasters mapper) * external RAM is now initialized to 0xFF by default: fix Micromachines 2, Dino Dini Soccer * fixed SRAM 16-bits memory handlers: fix some Sega Sports and EA Sports games (NFL95, NBA Action 95, NHL97, NHL98,...) * modified WRITE_xxx & READ_xxx macros for better portability and faster memory access on BIG ENDIAN platform * completely rewrote BIG ENDIAN support in render.c and vdp.c: rendering should be a little faster * rewrote ROM bankswitch emulation (Super Street Fighter II): ROM access are faster, using memory pointers instead of reading ROM copy from ARAM * fixed leftmost Window/PlaneA column render and implemented Window bug (as described by Charles Mc Donald) * improved "Sprite Limit" and "Sprite Collision" detection accuracy * modified RGB565 Color Palette to use the full available color range (0-31;0-63) * implemented "cycle accurate" HV Interrupt timings: fix Sesame's Street Counting Cafe, Legend of Galahad (intro) * improved VDP access timings accuracy (added FIFO emulation): fix Double Clutch * improved DMA timings accuracy: fix Winter Olympics (E), Arch Rivals and probably more * fixed HCounter again: Road Rash serie (I,II,III) don't need timing hacks anymore * fixed VCounter in Interlaced 2 mode: fix Combat Cars "VS-Mode" * improved Interlaced 2 mode (double resolution) rendering: Sonic 2, Combat Cars ("VS-Modes") look far better * added TMSS BIOS support (optional) * rewrote part of the YM2162 MAME's core: fixed internal FM timers handling, removed non-YM2612 emulation code and unused multiple cpu support * implemented "cycle accurate" FM timers & sound samples rendering * improved Z80 Interrupt timing accuracy: fix Sonic 3 music slowdowns * updated Z80 & 68000 cores to last MAME versions * improved Soft Reset emulation: X-Men 2 and Eternal Champions (random character selection) now work more like on real hardware. * added full overscan emulation (vertical & horizontal borders) for "pixel perfect" aspect ratio (tested against a real genesis) [Gamecube] * fixed rom checksum calculation (only used for rom information) * some modifications in GX rendering code. * added support for original Genesis/Megadrive NTSC & PAL video modes: this makes games looking exactly as on original hardware (progressive rendering with reduced resolution) * added "Aspect" option to switch between ORIGINAL (aspect ratio is fixed and borders are emulated) and MANUAL SET (horizontal and vertical scaling can be manually configured, borders are not emulated) * added "Overscan" option to disable the original borders color and always use black borders (only used when ORIGINAL Aspect mode is enabled) * added support for up to 720 pixels horizontal resolution (needed for proper aspect ratio emulation) * added "TV Mode" option to enable automatic switching to PAL(50Hz) TV mode when the Genesis runs in PAL mode * added "Xshift" & "Yshift" settings to let you adjust display area position while keeping the original aspect ratio * added option to disable/enable SSG-EG support in FM cores: this special mode is indeed not properly emulated and some games might sound wrong when enabled * removed "CPU Type" option, you can also now force Region (JAP/EUR/USA) without reseting the game, choose USA or JAP for 60hz, EUR for 50hz, this can be useful to bypass game region protection at startup. --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070720 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * corrected TeamPlayer support: fix multiplayer in Gauntlet 4 (Sept. version), Pengo and a lot of others * added J-Cart support: enable multiplayer in Codemasters games (Pete Sampras, Micromachines games, Super Skidmarks) * added serial EEPROM autodetection: fix games with bad SRAM informations in header (NBA Jam TE) * added SVP faking: display 2D graphics in Virtua Racing (the game is however still unplayable) * added support for more internal IO registers: fixe some unlicensed games (Wisdom Tree games...) * added preliminary support for unmapped protection device: fix some unlicensed games with special built-in hardware (Squirell King, Lion King 2...) * added "Soft Reset" combo (in game, use L+Z triggers): this should be like pressing the RESET button on a real Genesis and this is required in some games to enable special features or even complete the game (ex: X-Men). [Gamecube] * added separate configuration for PortA/PortB inputs (GAMEPAD, MULTITAP or NONE, see Joypad Config): this let you setting PORTB as unplugged, which is needed in some games to access special modes or enable cheat codes (Alien Storm, X-Men...) * Freezestate & SRAM files are now compressed (using zlib) * FreezeState & SRAM files can now be saved/loaded to/from SDCARD: located in /genplus/saves/ from the root of your SDCARD * changed initial ROMS directory for SDCARD user: now looking for /genplus/roms/ from the root of your SDCARD * added user-transparent SRAM autoload (detection order is MCARD then SDCARD, SLOTA then SLOTB) * "System reboot" is now used for console reboot and SD/PSO reload (if detected) * added new font: now use original IPL font, extracted from Bootrom * modified controls when going into the rom selection menu (DVD or SDCARD): . use B button to go up one directory . use Z button to quit the file selection menu . use L/R triggers to go down/up one full page . use Left/Right buttons or Analog stick to scroll the selected entry's filename when it can't be full displayed * various menu rearrangment, minor bugfixes & sourcecode cleanup --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070621 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * added Multitap support (EA 4-Way Play and Sega Teamplayer): allowed up to four players in games supporting those peripherals * added partial Sega Menacer lightgun support: automatically set when detecting the 6-in-1 Menacer game [Gamecube] * added 4.7GB DVD support for WII drives (the maximal allowed size for Gamecube DVD is still 1.35GB) * removed MPAL video timings, always use 60Hz NTSC: fix display problems for PAL wii users (no more PAL50 version needed) * added Console Reboot option in main menu (IPL Reboot) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070518 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * you can now switch between FM cores without reseting the game. FM registers value are automatically restored when switching. * removed the previous VINT timings modification because it brokes some games (Rocket Knight, Thunderforce III,...) * added automatic Timing configuration (VDP latency, VINT timing & alternate Line Timing) at game loading, based upon specific romname detection. This means you can still modify some of these options afterwards but they are now automatically set/unset when loading a game which need special timing fixes. These fixes are also automatically desactivated when the current game doesn't need them. For information, games that are actually detected and need special timings to run properly are: .Legend of Galahad & Road Rash series (single line not rendered properly) .Sesame Street Counting Cafe (don't boot) .Chaos Engine/Soldiers of Fortune (graphic glitches on scrolling) [Gamecube] * modified PAL framesync a little bit: the 20ms period is now applied between the start of 2 consecutive frames, no more between the end of the previous and the start of the next one, which seems more correct to me --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070508 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * VINT timings are now a little more accurate: fixes Sesame's Street Counting Cafe * SN76496 MAX_OUTPUT back to normal * modified FB_WNOISE value in SN76496 core according to John Kortink's last informations * added support for Maxim's PSG core, same as used in SMSPLUS (it becomes the default PSG core) * updated FM core to the latest MAME version * corrected DAC output level (fixes voices and some special FX being too low) * added support for Gens YM2612 (FM) core (MAME's one still remains default FM core) [Gamecube] * corrected L & R buttons assignment: fixes Genesis X & Z buttons being inverted * added configurable preamplification for each sound cores (see Emulator Options) * added some other configurable sound options (boost overall volume, FM improvment for Gens YM2612) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070411 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * corrected MAX_OUTPUT value in SN76496 core: fix PSG sound (SFX) volume * removed unused sound buffer allocation --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070326 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Gamecube] * added DVD automount: automatically call libogc DVD_Mount function if ISO PVD reading failed (idea taken from softdev's last neocdredux release). This may be useful for loading roms from a DVD after booting from SDLOAD or after stopping DVD motor. * added "DVD motor off" feature, like in others emulators * corrected Memory Card mounting function: EXI_ProbeReset() function was never called if the first mounting attempt failed. Should fix some of the "Unable to mount memory card" errors. --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070322 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Gamecube] * added SDCARD subdirectory browsing and LFN (255 char. max) support --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070317 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * Color RAM update now always reset color 0 to border color (fix color glitches in Mortal Kombat,...) (thanks to Noop's for the idea) [Gamecube] * remove some rendering unused code (only used by DOS version of genesis plus) for little speedup * added an option to enable alternate line rendering timing (fix single line error in Road Rash series and Legend of Galahad's Intro) * added last Softdev's modifications (normalised memory access and ASM GU functions used intead of 'C' ones) for some speedup * updated gcaram.c to be compatible with last libogc version --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070309 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * little rendering code speedups * modified HV counter tables (fix graphic glitches in Skitchin's sky, Lotus 2 Recs, Panorama Cotton, Dashin Desperados & maybe more) * completely rewrote DMA timings emulation so that it works for all games (no more cpu freezing) * added all DMA tranfer rates handling for each three DMA modes and added dma busy flag emulation * modified interrupts handling on VDP register #0 and #1 writes (fix Lemmings status bar) * added VDP RAM write latency (fix Chaos Engine/Soldier of Fortune gfx glitches) * modified FM timers handling a bit (fix Vectorman2 music) * corrected Sprite Limit rendering (fix Sonic 1 & Micromachines 2 title screens) * corrected IO Registers writes (fix Decap' Attack controls, no more need for alternate input) * corrected 6 Buttons Pad emulation (fix 6buttons detection in Mortal Kombat 3, Comix Zone and other 6-buttons compatible games) * modified sound mixing a bit according to Generator sourcecode (FM and PSG ratios seems more correct) * added separate CPU Region (USA, Europe, Japan,...) & Speed (PAL or NTSC) choice in menu options * modified main frame synchro in PAL mode (fix sound glitch in this mode), thanks to Softdev for the solution * added savestates support (go to SRAM menu, memory card supports only) --------------------------------------------------------------------------------------------------------- Genesis Plus GX release 070207 (Eke-Eke) --------------------------------------------------------------------------------------------------------- [Core] * fm timers fixed (fix missing music in Castle of Illusion, Quackshot, Undead Line, Wonderboy in Monster Lair, Cal 50, Turbo Outrun, Thundeforce 4 and maybe more) * added complete EEPROM emulation (save support now works fine in Wonderboy5, Megaman Willy Wars, NBA Jam...) (credits to Notaz, adapted from Picodrive code) * added preliminar dma timing emulation (fix bottom screen in Legend of Galahad) (credits to Notaz, adapted from Picodrive code) * hack: clear Vint pending after Hint (INT level 4) acknowledge (fix Fatal Rewind) * hack: modify read_bus16 to return a random value (fake fetch) (fix Time Killers) * modified cpu execution timings, with more correct hblank and interrupts timing (fix ISS Deluxe, Double Dragon 2 and certainly more) (Based on Gens code) * modified busreq mechanism: better synchro between z80 & 68k (no need to dejitter anymore) (Based on Gens code) * added sprite collision detection (fix Strider 2) * modified dma fill operation for big endian platform (fix Contra Hardcorps gfx garbage) --------------------------------------------------------------------------------------------------------- Genesis Plus GX WIP 1.2 (Softdev) --------------------------------------------------------------------------------------------------------- [Gamecube] * Added partial zip support (unzip.c) --------------------------------------------------------------------------------------------------------- Genesis Plus GX WIP 1.1 (Softdev) --------------------------------------------------------------------------------------------------------- [Core] * sio.c added * Added six button pad support from x86 Gens * Additional changes based on Charles MacDonald's gen-hw.txt --------------------------------------------------------------------------------------------------------- Genesis Plus GX WIP 1 - 7 March 2006 (Softdev) --------------------------------------------------------------------------------------------------------- [Core] * Updated SN76496 driver [Gamecube] * Added GX Hardware Scaling --------------------------------------------------------------------------------------------------------- Genesis Plus GX WIP 0 (Softdev) --------------------------------------------------------------------------------------------------------- [Gamecube] * initial port based on Genesis Plus 1.2a from Charles McDonald (http://cgfm2.emuviews.com/) psp2/main.h000664 001750 001750 00000000252 12702465756 013700 0ustar00sergiosergio000000 000000 #ifndef _MAIN_H_ #define _MAIN_H_ #define MAX_INPUTS 8 extern int debug_on; extern int log_error; extern int sdl_input_update(void); #endif /* _MAIN_H_ */ gx/gui/legal.c000664 001750 001750 00000014642 12702465756 014361 0ustar00sergiosergio000000 000000 /**************************************************************************** * legal.c * * Genesis Plus GX Disclaimer * * Copyright Eke-Eke (2009-2012) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #include "font.h" #include "gui.h" extern const u8 Bg_intro_c1_png[]; extern const u8 Bg_intro_c2_png[]; extern const u8 Bg_intro_c3_png[]; extern const u8 Bg_intro_c4_png[]; /* * This is the legal stuff - which must be shown at program startup * Any derivative work MUST include the same textual output. * */ static void show_disclaimer(int ypos) { FONT_writeCenter ("DISCLAIMER",22,0,640,ypos,(GXColor)WHITE); ypos += 32; FONT_writeCenter ("This is a free software, and you are welcome",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("to redistribute it under the conditions of the",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("license that you should have received with this",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("program. You may not sell, lease, rent or generally",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("use this software in any commercial product or activity.",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("Authors can not be held responsible for any damage or",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("or dysfunction that could occur while using this port.",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("You may not distribute this software with any ROM image",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("unless you have the legal right to distribute them.",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("This software is not endorsed by or affiliated",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("with Sega Enterprises Ltd or Nintendo Co Ltd.",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("All trademarks and registered trademarks are",20,0,640,ypos,(GXColor)WHITE); ypos += 20; FONT_writeCenter ("the property of their respective owners.",20,0,640,ypos,(GXColor)WHITE); ypos += 38; } void legal () { int count = 2000; int vis = 0; #ifdef HW_RVL gx_texture *button = gxTextureOpenPNG(Key_A_wii_png,0); #else gx_texture *button = gxTextureOpenPNG(Key_A_gcn_png,0); #endif gx_texture *logo = gxTextureOpenPNG(Bg_intro_c4_png,0); gxClearScreen((GXColor)BLACK); show_disclaimer(56); gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255); gxSetScreen(); sleep(1); while (!m_input.keys && count) { gxClearScreen((GXColor)BLACK); show_disclaimer(56); if (count%25 == 0) vis^=1; if (vis) { FONT_writeCenter("Press button to continue.",24,0,640,366,(GXColor)SKY_BLUE); gxDrawTexture(button, 220, 366-24+(24-button->height)/2, button->width, button->height,255); } gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255); gxSetScreen(); count--; } gxTextureClose(&button); gxTextureClose(&logo); if (count > 0) { ASND_Pause(0); int voice = ASND_GetFirstUnusedVoice(); ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)button_select_pcm,button_select_pcm_size,200,200,NULL); GUI_FadeOut(); ASND_Pause(1); return; } gxClearScreen((GXColor)BLACK); gx_texture *texture = gxTextureOpenPNG(Bg_intro_c1_png,0); if (texture) { gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); if (texture->data) free(texture->data); free(texture); } gxSetScreen(); sleep (1); gxClearScreen((GXColor)WHITE); texture = gxTextureOpenPNG(Bg_intro_c2_png,0); if (texture) { gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); if (texture->data) free(texture->data); free(texture); } gxSetScreen(); sleep (1); gxClearScreen((GXColor)BLACK); texture = gxTextureOpenPNG(Bg_intro_c3_png,0); if (texture) { gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); if (texture->data) free(texture->data); free(texture); } gxSetScreen(); ASND_Pause(0); int voice = ASND_GetFirstUnusedVoice(); ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); sleep (2); ASND_Pause(1); } gx/sounds/button_select.pcm000664 001750 001750 00000027200 12702465756 017225 0ustar00sergiosergio000000 000000     gcw0/opk-data/SG1000.png000664 001750 001750 00000041210 12702465756 015576 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATxz89Z1@Mu&dyH:AG%uIuݭ/*uDȵZr^k]MӴm۶fjuc#|WŌ~7 /R G3'K ]].~n9[ᙃM<g4P]5*@Qbpܙv]d^E.ڶ8bKm$9ϢT&TiN*VI;ZZ3%juSj񵳤lF!rNv0{ia1y#d Yihxlt)J:vX%FZ1U_YH")qk~ HsUU66DW5$. %$Cxjܣ~{{x4n{gG]8IJc{YZ*==lEhm5#Mz"刟J{~uc<גbAvZuUO9`҃+MӼl6MF_D/}._ ilq[DsB'c@jӼIq夊o}%/%I _rǧxrޢr\59Qz3&<`'.Kn"&{VNb !Ƿ>mڹ/,%a09E^ooo鉛_ͮjVV̌D  #3~tU\bϒS ;-~]k F6/^SѻIm_8G? |8[? J̄4U Ej$[9Lt*Jڏ!VDrFj<(fJS[1ad<ΰva:!!ВEvl[`u`\-֡?4 SwڿDRyܥI\ŸN•ɾfl,ޛCG ] f3 K'<0TgYNupl~~+Q;1Ny%h75 #p' ڏC7MF,89xӢ )$_NRy: NĨ%"BΨՍk喖W\.'_7eRS2S^hM;!bjQ)Kݚ?Dφ/ZPͶm̍0t/Un+f3mRkьsja^^^XS\qN tK!D,O[usLUG5:Ц=ɍK_UyhQʯ*k]=)X`)#?AGّh_\:7$qynMIHRj-E0tDjfT5Ğu*)hd NoHо??37q&i^nTD3-3<ݔQTLȱG+䐒"?_o߮~80M灆IGY5$Y1gʊRSEXn7 ]qG4o]]l +Ȃ66~ yFL;w-D+U^y %=~[Z0#/3͑nrSs֐Jo(+Z]].61s [Kɘ1kՉ?O솢WGIӣn.Q!D)̒e<0tv2gjE>y(~q<hwڶ#QvM5#fjK4aH\gY}"ڷ`1Ig@\k,cHU^۸R Ğ%cJeP[ US }iSm3$Ivb1losvO3mۖ,Jo1S6Ҥ)fJ FIڕ'u)֞@۶ 37p%Z$mbA+B~qcʨ7i4+$%I \r/ %$6GCV*#LJ`MlnEyZIsNQŋM%m xgS$!@ǘ0eǯ%q8p_X~yEC}cZ8i$JZ9:c49HhPG.юd4ܸׄ/{Lo&`sȿN 5m{^qu]OFo]ashsLJ q8O)0͸ zƄ"ZҩT..A kfzoba/:Z~Dfr'I4)XB%mVE.vz-RMd,BruƧ4]H}jdVYo408O}Dj\e _˔ct5PYi61mm[&]u/lsuKF_^60r0AMP,rlS#= ixzg4M0p/|} Qߛ32 n} vnނjMd=TkB$%ѱM ol*g|dGUxJz;|bubvHeT&ZDJ+ Dk{C$cy l/y M5w~ueat_0`m0aV ~u,L4ޫyU#GAC:!q=gVj?хoP<ئi n)mlλ6|f^o1F.-n[A9"yj+v}7 ҔpBx"lv]w\mE2X'R}zzZZ?y~~6fh6àf"=j:N/Bu53mLFvkoHxpcQ 肱l6$qƭn,n 銵VlL(yC$~45y>mu ? nry{{,Ċ-o~qXhx#pE+ɴ9(`\nؘp)(\T[|07!խBw_8ó6FzD:/LsHJETzLu9N]C=:i rtn8fl_ aьn~_uaH*ﻺn~ˋ];Ae0񡺃%cu2Yi(ok]k H,OR{öa- oe~c/*~l~ 0X㙛PB@:%kY~jڢ_a"+YШ` H~F7<5ǀ6滚kǜ7خ}BfUd\ekgoF#ɠ!ma9kHi~= !\<o1im۞~>SP$ S)1i3gasm&5Nuj꫾4Qlօ\¢Pe~ɿuW4{5 ie6FbbR-أ6pL,73湝ڏ-?uq+&~q[~U4 YOyuҜXsiT׷f<9Q-&qs:4sc^G]±㊏$3\nV47 0XӶo1T~ { 7H{5tѼlqlu̍ X4Ni\Iޯg`IJ[3*=o9jBKJk{m;淙KKLm/$hB}Fü-065hh8N:G RŻc zfnZux*ZJH-7 CLEnN6(|X8/ľР!Nn[~~rp,lúmsX&qUF2Zqz Vfc7O8nyLCy1>㴂sXQ̍ scio[6ڠE NqJ559pQyAzvIj/j^1X@y|6K bok m0fwVdbRu6ÄgB -ACa/b~y;ҁ+fk-.'Pd^{ ,p~sW:kM &f~yCG0&cbƳ~⸑rC8!$T'o~CHT9j.!BVu_eF|,CI<]s H(`XCDH% SIѐ~2g;Iѡ#NxT*N]_;ā"q6چubY˓&&Zc{5A~y==j t}O Xg3Qqx,uߑ mʱ},Nߕf~ b˹b(B/G6N8-baR1nڈ&M+ϑ:~ٍ=7~Z8){aüa]y{Lc_DHp"1DuίIت]mے/z*YYqsCBqx--?"gh<{n34 $+|2~eE){:IXŋ~һ=T_.MљN7姸yHWkHoR3 IDATNH] z@c b3 1xmO+xZVF[  Տ/w<y YsY^1;s݂Fm|W R"aRܦj`({E{>0G:F<&Ab+W{Cu6F&jh1rS7"ilcmt/bK_g7K/vTcE<w;sy㍚_:N.;lr~K˷H6SŊx=Б=s#fsL5|& GKn6i5~S0luj@p]nUGNCְh+"Jz$w7(|&=^؁'եq?@RUW By`=-0> 7ۑj۵o,耐⑓/ _ ΪꁫNɸ!gE^t\R8q#s} H8s#gnp2A6jV-0qYz?=k# #S\n;\¡2j^fѐ,~CG馿]YC7aCQ 0`y|~A#YMvRcŮqL.7v;)IֲbKJE v]r[*RSP0n~mKtu7Q%1&hOtc+X!~o]uZ85/j#Pޯm|%?1J2&LǍ/P05[}+06Bl'4/:ʘLgnlJ<~D_n!D5g} O|aE|xtE+zpl( h0Booo~E~w1$ [ѿmaf%gXK3Zڦ"c{]hsIܕc ]}||Pe ]GƳ16w<5Bbn hxTWzKz8@9X8K~a>Hc1Г5;[ #-o"y6]I oY]SiEE^3qlѯX-h5(sw#kJ0SL!#Ft:4C-g <ώtH 4ztz.wTqxw}ޯ[Fbn+M֯>+<ѿ̕7!jln iYo4azoŬHsE;0?֋|֬n;_]k6qOĶ77ҩ&excGW :*k~cKzm2Ǽ([F]7ě10aFx6c|np6ɣ"CbڴRLn&,uiHhq3  [w?fo\:Կ.ntU7kO 8t:N 'oUzL0m)VX|܍4F9S5ycIy֣^0֨!;#wm& 37Ī6vsіt$n~N~h>OC,ZnӐ{By}9 K30t(UFU!]U-70+ӆѣ <.Ӣi6K_ȦvQEm[jR4EfndonvqcYh4n[2L}Fvlρ) h4N%WV^_L@h glbnEmѢR3743*:1zIV|YSIT6r]l\|Pη{칱{|, G*1R*IP,⏫<=P\Hwob~藛$.g B;OW!-o'F#zֶFv])3C5}O4!mѯM m׎gn )^D#r4Sfo+JϩJz9/t<QYCMj۵FCG m<@V^=Ĭ_$ tܳ}ɑbpλ|>=(ZS=UY*qIշbx $Nl pykڌ/;o ԲO NIo]a qR rB;mz̾D_E=<<(E]ь+07E7C#|pخ=,pKz[Eυ<~4SLG2_Uw?HJ_ K`Dx۷uK)A-:t4 ~x}3$bjE$M!5ГV6~;4~A "dt#,V۶k)|_BXn <(l±"1BOZvm% CuE0Ҝv Q-΅#4̍`7Do)>0*Fp6x.Sn%nVVVDZo14L&!wݢUGӛ-69C(3A2MYh Gq<*"7TV:$a[YqJ71> +|y1=c0tͯ2zkbd5/5k<.v/áHbj!Ra!P1M <άFSE4M0a/𙻬WTnr2k"1x/E3.SI +IHv-Pm lQ?$'jޯ=sC7 O1\W. 'ǓͧAFʐnnF!T{ 5i~YvlsWK۵77}{0 0Fz2989!'@ 6`Z YM*RXCmo"s!Veú{f'UvU^+ˣ1OU}+cBO|s+h' kyh{۹B{wJ{n4:nx jcUR_M$2#d9#yfxXH~c넢#Z֗vK/6MY][x6"8E~808pJbUW,/*VLǁ qHF ֗Ă%}~?IX{2t5lR㈑m 9kQہX1-ؽq`(T"Zj5W;6j~':37BJjBWͬUe-DT~Gs$Uαb/ Pcb 0 Q;mk3ހ47|Ӟ;4s^+=/TK,xrpp4]`R<EIX$HuvQ#-l(% 4MX 37O"E8 TlzI]w͗l"Z<ʓH;k(Mmj;7>sJzX[1gdEZ S/ >3.zu[GdNu{ԳO scu<6\v413S-_ EC_X1Թ | |sMP[o۶>JⳕlZ91qHs''#dk:j'KWhb{^___}1\tG۔Gxq'11y)hfbd)koEX`7ц7 w⡣y8§mnI70Ӌ|qFa _=yUǓ@xnnʪmo9„\F6Qv;XrgF7ۿaύnǿ%_1֢ysilJe$R$b#ٶF"$9N %is|ۺU<: VcI.bkN%zVUnƓ(-Nڰ\ t <\[6oI@mۏ^Ư f0h:$);;r^|t<+TIh[^?2:i^|~~~||"iź}/\,֒ڴ<3/d+V{|~}}n:gD oyVl`ǔ`1ҧӉC6jhc`1s3lCF 4 440 ooo)4 ?w9~2Ƴg@wCF:բ6N? "6g[ 73܆;R-H҈潒{bbxt"NEo~s=!@y7"LjFu@?0ءMVkp!o07Pܤ~uaJ,!F>f`S4ÚXHC;mo:<`kqʾBy VhV0xtZ$BSd lbulq^ ^3iJΨzy2[}xYO {`,o di0ZQmRLr 4 nZC3rP ",HS SDp/)NT< ^h "-m--Gs>kNfЊ"ӏk72&:{Ԣq_S+:O:J||`%58O@h_eLd@_kmS:Oiq*ѳxZDu@.kpQh8H6"%''G&j2`7 |HDaV>o+4'~9wG_v |ڤDP,`p6F+ԫVUUl秧H576З0:-|ٝ3q#Z'#SD= r:\p5r>OS߿58?ޤw'L#;a*>mtUD0-C}ݥgGMvGX3Q剳vpv߿yHkxkv\̣q-n{N0D\aWY3twaNȧ_>t$/|1CFУg}ifn;yTwinmۆ;|{{;ag`C7ބ: #M&4 mohD drJ=[|b > ƨI[l 70 6Cz7hFƳ cНKipdۦ s{)X$jJXf87 x|yy 3Nkx,[C&' "H-+6>aƂw8T_.vvzQ6kK( Ǫ o7(]jʫ{p ҳY|-E,ϲI?:YLha(K?GJB،-o-"1*J$U{;v$i$ ={p_xȺg~2l `bK38~?UUuGE+ְuFƍKU 3eQ"x^Rs,-_Q 6sى1q.-ۻw=`ӄOª(-;4jZ r2bJmoH?<%8ťemk<+rm4{ `AÛ+4!qݙxuwLl6dY``94J,9Acq5Cl{Jc E/ΘT"l4 # TC: em6FY:J]čdaǢzCMx*x7 0OoJD# D 3< -Dp{3 ep= |aXdEC-pZ<VvỊTvʺ#0Ż\^ބ!3´0aoqE]aL7A.62+CK8LH;D¢,ԯL2mډIv[x̻4$p$hF"O/.7]Eg|S-:ɜd< 8qwA,Y;INo]bylzS̅ŘJw.9'Z: ]mL2T; u$m ya^y TÜ鄇N8Y&x뢪ڰ6,ojqo{!"? c¿*+{0߿~N6K3CLodM 1&#pHL1BjFq:| C߁j>Qzd>_x963/1.9'x }t7Df jIjϴ;yxDmxsNZK*2ƨWu>'xIh~~![#pbmn38̺n`&*rAAui Ŭ`tE0Hwvwo+ H&€MYxN݋€FZ3ԩN)%r/0+ <ӛřdmz;!}u 8ȦE.SBKqS>99ׄf>-z}c-=b@|1 7L$w-0?H "IDATO)ECVPc7<+BZ[#F/ L9,Ɇ}1kn Yn&'Yi~K4caV'YaI0k6hz0; ƀI{qƶS=;s/MEa~&k2#W05m='lu?%v(R&^%$NoI@z#VD-A˅=d-`9`Ѭڣ^TJu/BŌtxZ,̢ :4+ZbZDD=j`[ZŝKWI'({b x%Y~E[:Db? phµ%j[,YL/(JPM[`;GDDwtT/s&YKjYvU[ M)ɂ3uQo6 IE{.^SY& ~/Y}4+8F'O_RޙZ}!NѬH,Gcdʂ9'IANl8 IENDB`psp2/main.c000664 001750 001750 00000001675 12702465756 013705 0ustar00sergiosergio000000 000000 #include #include #include #include #include #include "psplib/pl_snd.h" #include "psplib/video.h" #include "psplib/pl_psp.h" #include "psplib/ctrl.h" #include #include "menu.h" #include "emumain.h" PSP2_MODULE_INFO(0,1,PSP_APP_NAME) //PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER) static void ExitCallback(void* arg) { ExitPSP = 1; } int main(int argc,char *argv[]) { /* Initialize PSP */ pl_psp_init("cache0:/GENPlusVITA/"); pl_snd_init(SOUND_SAMPLES, 1); pspCtrlInit(); pspVideoInit(); /* Initialize callbacks */ pl_psp_register_callback(PSP_EXIT_CALLBACK, ExitCallback, NULL); pl_psp_start_callback_thread(); /* Start emulation */ InitMenu(); DisplayMenu(); TrashMenu(); /* Release PSP resources */ pl_snd_shutdown(); pspVideoShutdown(); pl_psp_shutdown(); return(0); } gx/images/CD_access_off.png000664 001750 001750 00000001555 12702465756 016760 0ustar00sergiosergio000000 000000 PNG  IHDR0PsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time11/18/12{xIDATxՖKPITܪRͨ8MEKu U ..cA;9w({} ~z< ~8<>>BJ;ЕR<==rJl6D"&72tsi0韁$2IENDB`psp2/unzip.h000664 001750 001750 00000024066 12702465756 014132 0ustar00sergiosergio000000 000000 /* unzip.h -- IO for uncompress .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Copyright (C) 1998 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE CAN CHANGE IN FUTURE VERSION !! I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer "zlib/zlib111.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ #ifdef __cplusplus } #endif #endif /* _unz_H */ gx/images/ctrl_nunchuk.png000664 001750 001750 00000002461 12702465756 017013 0ustar00sergiosergio000000 000000 PNG  IHDR szzsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATxoȟeMԘ&X F؋,AGX/B",H P`4*`Xb7@Ll/WN\iesS98oo/p\sߑ73%"teEi؆b \f(3?Xgp3.@+z 6-*OwHe@3za>Ga`u 8 :yyx'"~REjWTagٲ1EwnU}/t_»Mn:6a g[$NՙFՈ ~y{/.8wwDgHC|y{bsO2fSMɴ#[m "2RNu# V-v:G{kg7F?C?RcQm5Kop?#>X6ξ#L6%sL"hu]PUezvҨTMyk*]c᳣ 6#p;"RuC_'u ')lUѝTsh,߼_?qq[D,yZ읙ro25XEC&̀&`gWZfVp€cq"|:bhac>&po@3uÅ͙ϫ[&t$VGĵVu~02bOÉ#Lت&RSJn%^'AuFS))[~ϟ?ƹ &iIENDB`gx/osd.h000664 001750 001750 00000004671 12702465756 013304 0ustar00sergiosergio000000 000000 /*************************************************/ /* port specific stuff should be put there */ /*************************************************/ #ifndef _OSD_H_ #define _OSD_H_ #include #include #include #include #include #include #include #include #include #include #include #ifdef HW_RVL #include #include #include "vi_encoder.h" #endif #include "gx_input.h" #include "gx_audio.h" #include "gx_video.h" #include "file_load.h" #include "cheats.h" #include "config.h" #include "fileio.h" #define DEFAULT_PATH "/genplus" /*************************************************/ /* required by Genesis Plus GX core */ /*************************************************/ #define CD_BIOS_US config.sys_rom[0] #define CD_BIOS_EU config.sys_rom[1] #define CD_BIOS_JP config.sys_rom[2] #define MD_BIOS config.sys_rom[3] #define MS_BIOS_US config.sys_rom[4] #define MS_BIOS_EU config.sys_rom[5] #define MS_BIOS_JP config.sys_rom[6] #define GG_BIOS config.sys_rom[7] #define GG_ROM config.sys_rom[8] #define AR_ROM config.sys_rom[9] #define SK_ROM config.sys_rom[10] #define SK_UPMEM config.sys_rom[11] #define CD_BRAM_US "/genplus/saves/cd/scd_U.brm" #define CD_BRAM_EU "/genplus/saves/cd/scd_E.brm" #define CD_BRAM_JP "/genplus/saves/cd/scd_J.brm" #define CART_BRAM "/genplus/saves/cd/cart.brm" /*********************************************************/ /* implemented by Genesis Plus GX core (GC/Wii specific) */ /*********************************************************/ /* 32 bytes aligned sound buffers (8 samples alignment) */ #define ALIGN_SND 0xfffffff8 /* use Wii DVD LED to indicate when virtual CD tray is open */ #ifdef HW_RVL #define CD_TRAY_CALLBACK *(u32*)0xcd0000c0 = (*(u32*)0xcd0000c0 & ~0x20) | ((cdd.status == CD_OPEN) << 5); #endif /*************************************************/ #define VERSION "Genesis Plus GX 1.7.5" #define VIDEO_WAIT 0x01 #define AUDIO_WAIT 0x02 #define VIDEO_UPDATE 0x04 #define AUDIO_UPDATE 0x08 /* globals */ extern void legal(void); extern double get_framerate(void); extern void reloadrom(void); extern void shutdown(void); extern u32 Shutdown; extern u32 ConfigRequested; #endif /* _OSD_H_ */ gcw0/config.h000664 001750 001750 00000002671 12702465756 014204 0ustar00sergiosergio000000 000000 #ifndef _CONFIG_H_ #define _CONFIG_H_ #include /**************************************************************************** * Config Option * ****************************************************************************/ enum {A = 0, B, C, X, Y, Z, START, MODE}; typedef struct { uint8 padtype; } t_input_config; typedef struct { uint8 hq_fm; uint8 filter; uint8 psgBoostNoise; uint8 dac_bits; uint8 ym2413; int16 psg_preamp; int16 fm_preamp; uint32 lp_range; int16 low_freq; int16 high_freq; int16 lg; int16 mg; int16 hg; uint8 mono; uint8 system; uint8 region_detect; uint8 vdp_mode; uint8 master_clock; uint8 force_dtack; uint8 addr_error; uint8 bios; uint8 lock_on; uint8 hot_swap; uint8 invert_mouse; uint8 gun_cursor[2]; uint8 overscan; uint8 gg_extra; uint8 ntsc; uint8 lcd; uint8 render; t_input_config input[MAX_INPUTS]; uint8 gcw0_fullscreen; uint8 gcw0_frameskip; uint8 keepaspectratio; uint8 gg_scanlines; uint8 smsmaskleftbar; uint8 sl_autoresume; uint8 lightgun_speed; uint8 a_stick; uint8 cursor; SDLKey buttons[8]; //SDLKey button_a; //SDLKey button_b; //SDLKey button_c; //SDLKey button_x; //SDLKey button_y; //SDLKey button_z; //SDLKey button_start; //SDLKey button_mode; } t_config; /* Global variables */ extern t_config config; extern void config_save(void); extern void set_config_defaults(void); #endif /* _CONFIG_H_ */ core/m68k/m68kops.h000664 001750 001750 00002040417 12702465756 015125 0ustar00sergiosergio000000 000000 /* ======================================================================== */ /* ============== CYCLE-ACCURATE DIV/MUL EXECUTION ======================== */ /* ======================================================================== */ INLINE void UseDivuCycles(uint32 dst, uint32 src) { int i; /* minimum cycle time */ uint mcycles = 38 * MUL; /* 16-bit divisor */ src <<= 16; /* 16-bit dividend */ for (i=0; i<15; i++) { /* check if carry bit set */ if ((sint32) dst < 0) { /* shift dividend and apply divisor */ dst <<= 1; dst -= src; } else { /* shift dividend and add two cycles */ dst <<= 1; mcycles += (2 * MUL); if (dst >= src) { /* apply divisor and remove one cycle */ dst -= src; mcycles -= 1 * MUL; } } } USE_CYCLES(mcycles << 1); } INLINE void UseDivsCycles(sint32 dst, sint16 src) { /* minimum cycle time */ uint mcycles = 6 * MUL; /* negative dividend */ if (dst < 0) mcycles += 1 * MUL; if ((abs(dst) >> 16) < abs(src)) { int i; /* absolute quotient */ uint32 quotient = abs(dst) / abs(src); /* add default cycle time */ mcycles += (55 * MUL); /* positive divisor */ if (src >= 0) { /* check dividend sign */ if (dst >= 0) mcycles -= 1 * MUL; else mcycles += 1 * MUL; } /* check higher 15-bits of quotient */ for (i=0; i<15; i++) { quotient >>= 1; if (!(quotient & 1)) mcycles += 1 * MUL; } } else { /* absolute overflow */ mcycles += (2 * MUL); } USE_CYCLES(mcycles << 1); } INLINE void UseMuluCycles(uint16 src) { /* minimum cycle time */ uint mcycles = 38 * MUL; /* count number of bits set to 1 */ while (src) { if (src & 1) mcycles += (2 * MUL); src >>= 1; } /* 38 + 2*N */ USE_CYCLES(mcycles); } INLINE void UseMulsCycles(sint16 src) { /* minimum cycle time */ uint mcycles = 38 * MUL; /* detect 01 or 10 patterns */ sint32 tmp = src << 1; tmp = (tmp ^ src) & 0xFFFF; /* count number of bits set to 1 */ while (tmp) { if (tmp & 1) mcycles += (2 * MUL); tmp >>= 1; } /* 38 + 2*N */ USE_CYCLES(mcycles); } /* ======================================================================== */ /* ========================= INSTRUCTION HANDLERS ========================= */ /* ======================================================================== */ static void m68k_op_1010(void) { m68ki_exception_1010(); } static void m68k_op_1111(void) { m68ki_exception_1111(); } static void m68k_op_abcd_8_rr(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; } static void m68k_op_abcd_8_mm_ax7(void) { uint src = OPER_AY_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_abcd_8_mm_ay7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_abcd_8_mm_axy7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_abcd_8_mm(void) { uint src = OPER_AY_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_add_8_er_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_8(DY); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pi7(void) { uint* r_dst = &DX; uint src = OPER_A7_PI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pd7(void) { uint* r_dst = &DX; uint src = OPER_A7_PD_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_8_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_a(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(AY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_16_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_add_32_er_d(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_a(void) { uint* r_dst = &DX; uint src = AY; uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_32_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_add_8_re_ai(void) { uint ea = EA_AY_AI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_pi(void) { uint ea = EA_AY_PI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_pi7(void) { uint ea = EA_A7_PI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_pd(void) { uint ea = EA_AY_PD_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_pd7(void) { uint ea = EA_A7_PD_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_di(void) { uint ea = EA_AY_DI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_ix(void) { uint ea = EA_AY_IX_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_aw(void) { uint ea = EA_AW_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_8_re_al(void) { uint ea = EA_AL_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_add_16_re_ai(void) { uint ea = EA_AY_AI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_pi(void) { uint ea = EA_AY_PI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_pd(void) { uint ea = EA_AY_PD_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_di(void) { uint ea = EA_AY_DI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_ix(void) { uint ea = EA_AY_IX_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_aw(void) { uint ea = EA_AW_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_16_re_al(void) { uint ea = EA_AL_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_add_32_re_ai(void) { uint ea = EA_AY_AI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_pi(void) { uint ea = EA_AY_PI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_pd(void) { uint ea = EA_AY_PD_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_di(void) { uint ea = EA_AY_DI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_ix(void) { uint ea = EA_AY_IX_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_aw(void) { uint ea = EA_AW_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_add_32_re_al(void) { uint ea = EA_AL_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_adda_16_d(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY)); } static void m68k_op_adda_16_a(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY)); } static void m68k_op_adda_16_ai(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_AI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_pi(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_PI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_pd(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_PD_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_di(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_DI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_ix(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_IX_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_aw(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AW_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_al(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AL_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_pcdi(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_PCDI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_pcix(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_PCIX_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_16_i(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_I_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); } static void m68k_op_adda_32_d(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY); } static void m68k_op_adda_32_a(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY); } static void m68k_op_adda_32_ai(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AY_AI_32() + *r_dst); } static void m68k_op_adda_32_pi(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AY_PI_32() + *r_dst); } static void m68k_op_adda_32_pd(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AY_PD_32() + *r_dst); } static void m68k_op_adda_32_di(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AY_DI_32() + *r_dst); } static void m68k_op_adda_32_ix(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AY_IX_32() + *r_dst); } static void m68k_op_adda_32_aw(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AW_32() + *r_dst); } static void m68k_op_adda_32_al(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_AL_32() + *r_dst); } static void m68k_op_adda_32_pcdi(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_PCDI_32() + *r_dst); } static void m68k_op_adda_32_pcix(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_PCIX_32() + *r_dst); } static void m68k_op_adda_32_i(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(OPER_I_32() + *r_dst); } static void m68k_op_addi_8_d(void) { uint* r_dst = &DY; uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_addi_8_ai(void) { uint src = OPER_I_8(); uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_pi(void) { uint src = OPER_I_8(); uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_pi7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_pd(void) { uint src = OPER_I_8(); uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_pd7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_di(void) { uint src = OPER_I_8(); uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_ix(void) { uint src = OPER_I_8(); uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_aw(void) { uint src = OPER_I_8(); uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_8_al(void) { uint src = OPER_I_8(); uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addi_16_d(void) { uint* r_dst = &DY; uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_addi_16_ai(void) { uint src = OPER_I_16(); uint ea = EA_AY_AI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_pi(void) { uint src = OPER_I_16(); uint ea = EA_AY_PI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_pd(void) { uint src = OPER_I_16(); uint ea = EA_AY_PD_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_di(void) { uint src = OPER_I_16(); uint ea = EA_AY_DI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_ix(void) { uint src = OPER_I_16(); uint ea = EA_AY_IX_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_aw(void) { uint src = OPER_I_16(); uint ea = EA_AW_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_16_al(void) { uint src = OPER_I_16(); uint ea = EA_AL_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addi_32_d(void) { uint* r_dst = &DY; uint src = OPER_I_32(); uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_addi_32_ai(void) { uint src = OPER_I_32(); uint ea = EA_AY_AI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_pi(void) { uint src = OPER_I_32(); uint ea = EA_AY_PI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_pd(void) { uint src = OPER_I_32(); uint ea = EA_AY_PD_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_di(void) { uint src = OPER_I_32(); uint ea = EA_AY_DI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_ix(void) { uint src = OPER_I_32(); uint ea = EA_AY_IX_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_aw(void) { uint src = OPER_I_32(); uint ea = EA_AW_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addi_32_al(void) { uint src = OPER_I_32(); uint ea = EA_AL_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_8_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_addq_8_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_pi7(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_pd7(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_8_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); uint res = src + dst; FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_addq_16_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_addq_16_a(void) { uint* r_dst = &AY; *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); } static void m68k_op_addq_16_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_16_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_16(); uint dst = m68ki_read_16(ea); uint res = src + dst; FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_addq_32_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = *r_dst; uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_addq_32_a(void) { uint* r_dst = &AY; *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1); } static void m68k_op_addq_32_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addq_32_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_32(); uint dst = m68ki_read_32(ea); uint res = src + dst; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_addx_8_rr(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_8(DY); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; } static void m68k_op_addx_16_rr(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; } static void m68k_op_addx_32_rr(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; *r_dst = res; } static void m68k_op_addx_8_mm_ax7(void) { uint src = OPER_AY_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_addx_8_mm_ay7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_addx_8_mm_axy7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_addx_8_mm(void) { uint src = OPER_AY_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_V = VFLAG_ADD_8(src, dst, res); FLAG_X = FLAG_C = CFLAG_8(res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_addx_16_mm(void) { uint src = OPER_AY_PD_16(); uint ea = EA_AX_PD_16(); uint dst = m68ki_read_16(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_V = VFLAG_ADD_16(src, dst, res); FLAG_X = FLAG_C = CFLAG_16(res); res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_addx_32_mm(void) { uint src = OPER_AY_PD_32(); uint ea = EA_AX_PD_32(); uint dst = m68ki_read_32(ea); uint res = src + dst + XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_ADD_32(src, dst, res); FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res); res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_and_8_er_d(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_ai(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_AI_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pi(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PI_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pi7(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PI_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pd(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PD_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pd7(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PD_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_di(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_DI_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_ix(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_IX_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_aw(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AW_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_al(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AL_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pcdi(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCDI_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_pcix(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCIX_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_er_i(void) { FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_I_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_d(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_ai(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_AI_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_pi(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PI_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_pd(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PD_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_di(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_DI_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_ix(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_IX_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_aw(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AW_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_al(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AL_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_pcdi(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCDI_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_pcix(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCIX_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_16_er_i(void) { FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_I_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_d(void) { FLAG_Z = DX &= DY; FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_ai(void) { FLAG_Z = DX &= OPER_AY_AI_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_pi(void) { FLAG_Z = DX &= OPER_AY_PI_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_pd(void) { FLAG_Z = DX &= OPER_AY_PD_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_di(void) { FLAG_Z = DX &= OPER_AY_DI_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_ix(void) { FLAG_Z = DX &= OPER_AY_IX_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_aw(void) { FLAG_Z = DX &= OPER_AW_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_al(void) { FLAG_Z = DX &= OPER_AL_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_pcdi(void) { FLAG_Z = DX &= OPER_PCDI_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_pcix(void) { FLAG_Z = DX &= OPER_PCIX_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_32_er_i(void) { FLAG_Z = DX &= OPER_I_32(); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_and_8_re_ai(void) { uint ea = EA_AY_AI_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_pi(void) { uint ea = EA_AY_PI_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_pi7(void) { uint ea = EA_A7_PI_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_pd(void) { uint ea = EA_AY_PD_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_pd7(void) { uint ea = EA_A7_PD_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_di(void) { uint ea = EA_AY_DI_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_ix(void) { uint ea = EA_AY_IX_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_aw(void) { uint ea = EA_AW_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_8_re_al(void) { uint ea = EA_AL_8(); uint res = DX & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_and_16_re_ai(void) { uint ea = EA_AY_AI_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_pi(void) { uint ea = EA_AY_PI_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_pd(void) { uint ea = EA_AY_PD_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_di(void) { uint ea = EA_AY_DI_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_ix(void) { uint ea = EA_AY_IX_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_aw(void) { uint ea = EA_AW_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_16_re_al(void) { uint ea = EA_AL_16(); uint res = DX & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_and_32_re_ai(void) { uint ea = EA_AY_AI_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_pi(void) { uint ea = EA_AY_PI_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_pd(void) { uint ea = EA_AY_PD_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_di(void) { uint ea = EA_AY_DI_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_ix(void) { uint ea = EA_AY_IX_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_aw(void) { uint ea = EA_AW_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_and_32_re_al(void) { uint ea = EA_AL_32(); uint res = DX & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_8_d(void) { FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00)); FLAG_N = NFLAG_8(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_andi_8_ai(void) { uint src = OPER_I_8(); uint ea = EA_AY_AI_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_pi(void) { uint src = OPER_I_8(); uint ea = EA_AY_PI_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_pi7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PI_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_pd(void) { uint src = OPER_I_8(); uint ea = EA_AY_PD_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_pd7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PD_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_di(void) { uint src = OPER_I_8(); uint ea = EA_AY_DI_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_ix(void) { uint src = OPER_I_8(); uint ea = EA_AY_IX_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_aw(void) { uint src = OPER_I_8(); uint ea = EA_AW_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_8_al(void) { uint src = OPER_I_8(); uint ea = EA_AL_8(); uint res = src & m68ki_read_8(ea); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_andi_16_d(void) { FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000)); FLAG_N = NFLAG_16(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_andi_16_ai(void) { uint src = OPER_I_16(); uint ea = EA_AY_AI_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_pi(void) { uint src = OPER_I_16(); uint ea = EA_AY_PI_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_pd(void) { uint src = OPER_I_16(); uint ea = EA_AY_PD_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_di(void) { uint src = OPER_I_16(); uint ea = EA_AY_DI_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_ix(void) { uint src = OPER_I_16(); uint ea = EA_AY_IX_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_aw(void) { uint src = OPER_I_16(); uint ea = EA_AW_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_16_al(void) { uint src = OPER_I_16(); uint ea = EA_AL_16(); uint res = src & m68ki_read_16(ea); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_andi_32_d(void) { FLAG_Z = DY &= (OPER_I_32()); FLAG_N = NFLAG_32(FLAG_Z); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_andi_32_ai(void) { uint src = OPER_I_32(); uint ea = EA_AY_AI_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_pi(void) { uint src = OPER_I_32(); uint ea = EA_AY_PI_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_pd(void) { uint src = OPER_I_32(); uint ea = EA_AY_PD_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_di(void) { uint src = OPER_I_32(); uint ea = EA_AY_DI_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_ix(void) { uint src = OPER_I_32(); uint ea = EA_AY_IX_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_aw(void) { uint src = OPER_I_32(); uint ea = EA_AW_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_32_al(void) { uint src = OPER_I_32(); uint ea = EA_AL_32(); uint res = src & m68ki_read_32(ea); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_andi_16_toc(void) { m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16()); } static void m68k_op_andi_16_tos(void) { if(FLAG_S) { uint src = OPER_I_16(); m68ki_set_sr(m68ki_get_sr() & src); return; } m68ki_exception_privilege_violation(); } static void m68k_op_asr_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); if(GET_MSB_8(src)) res |= m68ki_shift_8_table[shift]; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_X = FLAG_C = src << (9-shift); } static void m68k_op_asr_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); if(GET_MSB_16(src)) res |= m68ki_shift_16_table[shift]; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_X = FLAG_C = src << (9-shift); } static void m68k_op_asr_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); if(GET_MSB_32(src)) res |= m68ki_shift_32_table[shift]; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_X = FLAG_C = src << (9-shift); } static void m68k_op_asr_8_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 8) { if(GET_MSB_8(src)) res |= m68ki_shift_8_table[shift]; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_X = FLAG_C = src << (9-shift); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } if(GET_MSB_8(src)) { *r_dst |= 0xff; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; FLAG_N = NFLAG_SET; FLAG_Z = ZFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffffff00; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asr_16_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 16) { if(GET_MSB_16(src)) res |= m68ki_shift_16_table[shift]; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_C = FLAG_X = (src >> (shift - 1))<<8; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } if(GET_MSB_16(src)) { *r_dst |= 0xffff; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; FLAG_N = NFLAG_SET; FLAG_Z = ZFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffff0000; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asr_32_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = *r_dst; uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 32) { if(GET_MSB_32(src)) res |= m68ki_shift_32_table[shift]; *r_dst = res; FLAG_C = FLAG_X = (src >> (shift - 1))<<8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } if(GET_MSB_32(src)) { *r_dst = 0xffffffff; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; FLAG_N = NFLAG_SET; FLAG_Z = ZFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; return; } *r_dst = 0; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asr_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asr_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; if(GET_MSB_16(src)) res |= 0x8000; m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = FLAG_X = src << 8; } static void m68k_op_asl_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = MASK_OUT_ABOVE_8(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_X = FLAG_C = src << shift; FLAG_N = NFLAG_8(res); FLAG_Z = res; src &= m68ki_shift_8_table[shift + 1]; FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7; } static void m68k_op_asl_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = MASK_OUT_ABOVE_16(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> (8-shift); src &= m68ki_shift_16_table[shift + 1]; FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; } static void m68k_op_asl_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> (24-shift); src &= m68ki_shift_32_table[shift + 1]; FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; } static void m68k_op_asl_8_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = MASK_OUT_ABOVE_8(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 8) { *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_X = FLAG_C = src << shift; FLAG_N = NFLAG_8(res); FLAG_Z = res; src &= m68ki_shift_8_table[shift + 1]; FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7; return; } *r_dst &= 0xffffff00; FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asl_16_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = MASK_OUT_ABOVE_16(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 16) { *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_X = FLAG_C = (src << shift) >> 8; FLAG_N = NFLAG_16(res); FLAG_Z = res; src &= m68ki_shift_16_table[shift + 1]; FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; return; } *r_dst &= 0xffff0000; FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asl_32_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 32) { *r_dst = res; FLAG_X = FLAG_C = (src >> (32 - shift)) << 8; FLAG_N = NFLAG_32(res); FLAG_Z = res; src &= m68ki_shift_32_table[shift + 1]; FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; return; } *r_dst = 0; FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = (!(src == 0))<<7; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_asl_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_asl_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; src &= 0xc000; FLAG_V = (!(src == 0 || src == 0xc000))<<7; } static void m68k_op_bhi_8(void) { if(COND_HI()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bls_8(void) { if(COND_LS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bcc_8(void) { if(COND_CC()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bcs_8(void) { if(COND_CS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bne_8(void) { if(COND_NE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_beq_8(void) { if(COND_EQ()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bvc_8(void) { if(COND_VC()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bvs_8(void) { if(COND_VS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bpl_8(void) { if(COND_PL()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bmi_8(void) { if(COND_MI()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bge_8(void) { if(COND_GE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_blt_8(void) { if(COND_LT()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bgt_8(void) { if(COND_GT()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_ble_8(void) { if(COND_LE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bhi_16(void) { if(COND_HI()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bls_16(void) { if(COND_LS()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bcc_16(void) { if(COND_CC()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bcs_16(void) { if(COND_CS()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bne_16(void) { if(COND_NE()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_beq_16(void) { if(COND_EQ()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bvc_16(void) { if(COND_VC()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bvs_16(void) { if(COND_VS()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bpl_16(void) { if(COND_PL()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bmi_16(void) { if(COND_MI()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bge_16(void) { if(COND_GE()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_blt_16(void) { if(COND_LT()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bgt_16(void) { if(COND_GT()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_ble_16(void) { if(COND_LE()) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); return; } REG_PC += 2; USE_CYCLES(CYC_BCC_NOTAKE_W); } static void m68k_op_bhi_32(void) { if(COND_HI()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bls_32(void) { if(COND_LS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bcc_32(void) { if(COND_CC()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bcs_32(void) { if(COND_CS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bne_32(void) { if(COND_NE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_beq_32(void) { if(COND_EQ()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bvc_32(void) { if(COND_VC()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bvs_32(void) { if(COND_VS()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bpl_32(void) { if(COND_PL()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bmi_32(void) { if(COND_MI()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bge_32(void) { if(COND_GE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_blt_32(void) { if(COND_LT()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bgt_32(void) { if(COND_GT()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_ble_32(void) { if(COND_LE()) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); return; } USE_CYCLES(CYC_BCC_NOTAKE_B); } static void m68k_op_bchg_32_r_d(void) { uint* r_dst = &DY; uint mask = 1 << (DX & 0x1f); FLAG_Z = *r_dst & mask; *r_dst ^= mask; } static void m68k_op_bchg_8_r_ai(void) { uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_pi(void) { uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_pi7(void) { uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_pd(void) { uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_pd7(void) { uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_di(void) { uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_ix(void) { uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_aw(void) { uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_r_al(void) { uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_32_s_d(void) { uint* r_dst = &DY; uint mask = 1 << (OPER_I_8() & 0x1f); FLAG_Z = *r_dst & mask; *r_dst ^= mask; } static void m68k_op_bchg_8_s_ai(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_pi(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_pi7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_pd(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_pd7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_di(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_ix(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_aw(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bchg_8_s_al(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src ^ mask); } static void m68k_op_bclr_32_r_d(void) { uint* r_dst = &DY; uint mask = 1 << (DX & 0x1f); FLAG_Z = *r_dst & mask; *r_dst &= ~mask; } static void m68k_op_bclr_8_r_ai(void) { uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_pi(void) { uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_pi7(void) { uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_pd(void) { uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_pd7(void) { uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_di(void) { uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_ix(void) { uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_aw(void) { uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_r_al(void) { uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_32_s_d(void) { uint* r_dst = &DY; uint mask = 1 << (OPER_I_8() & 0x1f); FLAG_Z = *r_dst & mask; *r_dst &= ~mask; } static void m68k_op_bclr_8_s_ai(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_pi(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_pi7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_pd(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_pd7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_di(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_ix(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_aw(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bclr_8_s_al(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src & ~mask); } static void m68k_op_bra_8(void) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); } static void m68k_op_bra_16(void) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); } static void m68k_op_bra_32(void) { m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); } static void m68k_op_bset_32_r_d(void) { uint* r_dst = &DY; uint mask = 1 << (DX & 0x1f); FLAG_Z = *r_dst & mask; *r_dst |= mask; } static void m68k_op_bset_8_r_ai(void) { uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_pi(void) { uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_pi7(void) { uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_pd(void) { uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_pd7(void) { uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_di(void) { uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_ix(void) { uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_aw(void) { uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_r_al(void) { uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); uint mask = 1 << (DX & 7); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_32_s_d(void) { uint* r_dst = &DY; uint mask = 1 << (OPER_I_8() & 0x1f); FLAG_Z = *r_dst & mask; *r_dst |= mask; } static void m68k_op_bset_8_s_ai(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_pi(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_pi7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_pd(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_pd7(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_di(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_ix(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_aw(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bset_8_s_al(void) { uint mask = 1 << (OPER_I_8() & 7); uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); FLAG_Z = src & mask; m68ki_write_8(ea, src | mask); } static void m68k_op_bsr_8(void) { m68ki_push_32(REG_PC); m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); } static void m68k_op_bsr_16(void) { uint offset = OPER_I_16(); m68ki_push_32(REG_PC); REG_PC -= 2; m68ki_branch_16(offset); } static void m68k_op_bsr_32(void) { m68ki_push_32(REG_PC); m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR)); } static void m68k_op_btst_32_r_d(void) { FLAG_Z = DY & (1 << (DX & 0x1f)); } static void m68k_op_btst_8_r_ai(void) { FLAG_Z = OPER_AY_AI_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pi(void) { FLAG_Z = OPER_AY_PI_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pi7(void) { FLAG_Z = OPER_A7_PI_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pd(void) { FLAG_Z = OPER_AY_PD_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pd7(void) { FLAG_Z = OPER_A7_PD_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_di(void) { FLAG_Z = OPER_AY_DI_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_ix(void) { FLAG_Z = OPER_AY_IX_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_aw(void) { FLAG_Z = OPER_AW_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_al(void) { FLAG_Z = OPER_AL_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pcdi(void) { FLAG_Z = OPER_PCDI_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_pcix(void) { FLAG_Z = OPER_PCIX_8() & (1 << (DX & 7)); } static void m68k_op_btst_8_r_i(void) { FLAG_Z = OPER_I_8() & (1 << (DX & 7)); } static void m68k_op_btst_32_s_d(void) { FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f)); } static void m68k_op_btst_8_s_ai(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AY_AI_8() & (1 << bit); } static void m68k_op_btst_8_s_pi(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AY_PI_8() & (1 << bit); } static void m68k_op_btst_8_s_pi7(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_A7_PI_8() & (1 << bit); } static void m68k_op_btst_8_s_pd(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AY_PD_8() & (1 << bit); } static void m68k_op_btst_8_s_pd7(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_A7_PD_8() & (1 << bit); } static void m68k_op_btst_8_s_di(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AY_DI_8() & (1 << bit); } static void m68k_op_btst_8_s_ix(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AY_IX_8() & (1 << bit); } static void m68k_op_btst_8_s_aw(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AW_8() & (1 << bit); } static void m68k_op_btst_8_s_al(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_AL_8() & (1 << bit); } static void m68k_op_btst_8_s_pcdi(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_PCDI_8() & (1 << bit); } static void m68k_op_btst_8_s_pcix(void) { uint bit = OPER_I_8() & 7; FLAG_Z = OPER_PCIX_8() & (1 << bit); } static void m68k_op_chk_16_d(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(DY); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_ai(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AY_AI_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_pi(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AY_PI_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_pd(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AY_PD_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_di(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AY_DI_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_ix(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AY_IX_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_aw(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AW_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_al(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_AL_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_pcdi(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_PCDI_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_pcix(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_PCIX_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_chk_16_i(void) { sint src = MAKE_INT_16(DX); sint bound = MAKE_INT_16(OPER_I_16()); FLAG_Z = ZFLAG_16(src); /* Undocumented */ FLAG_V = VFLAG_CLEAR; /* Undocumented */ FLAG_C = CFLAG_CLEAR; /* Undocumented */ if(src >= 0 && src <= bound) { return; } FLAG_N = (src < 0)<<7; m68ki_exception_trap(EXCEPTION_CHK); } static void m68k_op_clr_8_d(void) { DY &= 0xffffff00; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_di(void) { m68ki_write_8(EA_AY_DI_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_aw(void) { m68ki_write_8(EA_AW_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_8_al(void) { m68ki_write_8(EA_AL_8(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_d(void) { DY &= 0xffff0000; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_ai(void) { m68ki_write_16(EA_AY_AI_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_pi(void) { m68ki_write_16(EA_AY_PI_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_pd(void) { m68ki_write_16(EA_AY_PD_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_di(void) { m68ki_write_16(EA_AY_DI_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_ix(void) { m68ki_write_16(EA_AY_IX_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_aw(void) { m68ki_write_16(EA_AW_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_16_al(void) { m68ki_write_16(EA_AL_16(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_d(void) { DY = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_ai(void) { m68ki_write_32(EA_AY_AI_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_pi(void) { m68ki_write_32(EA_AY_PI_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_pd(void) { m68ki_write_32(EA_AY_PD_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_di(void) { m68ki_write_32(EA_AY_DI_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_ix(void) { m68ki_write_32(EA_AY_IX_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_aw(void) { m68ki_write_32(EA_AW_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_clr_32_al(void) { m68ki_write_32(EA_AL_32(), 0); FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_Z = ZFLAG_SET; } static void m68k_op_cmp_8_d(void) { uint src = MASK_OUT_ABOVE_8(DY); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_ai(void) { uint src = OPER_AY_AI_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pi(void) { uint src = OPER_AY_PI_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pi7(void) { uint src = OPER_A7_PI_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pd(void) { uint src = OPER_AY_PD_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pd7(void) { uint src = OPER_A7_PD_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_di(void) { uint src = OPER_AY_DI_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_ix(void) { uint src = OPER_AY_IX_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_aw(void) { uint src = OPER_AW_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_al(void) { uint src = OPER_AL_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pcdi(void) { uint src = OPER_PCDI_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_pcix(void) { uint src = OPER_PCIX_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_8_i(void) { uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(DX); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmp_16_d(void) { uint src = MASK_OUT_ABOVE_16(DY); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_a(void) { uint src = MASK_OUT_ABOVE_16(AY); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_ai(void) { uint src = OPER_AY_AI_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_pi(void) { uint src = OPER_AY_PI_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_pd(void) { uint src = OPER_AY_PD_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_di(void) { uint src = OPER_AY_DI_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_ix(void) { uint src = OPER_AY_IX_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_aw(void) { uint src = OPER_AW_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_al(void) { uint src = OPER_AL_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_pcdi(void) { uint src = OPER_PCDI_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_pcix(void) { uint src = OPER_PCIX_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_16_i(void) { uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(DX); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmp_32_d(void) { uint src = DY; uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_a(void) { uint src = AY; uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_ai(void) { uint src = OPER_AY_AI_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_pi(void) { uint src = OPER_AY_PI_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_pd(void) { uint src = OPER_AY_PD_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_di(void) { uint src = OPER_AY_DI_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_ix(void) { uint src = OPER_AY_IX_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_aw(void) { uint src = OPER_AW_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_al(void) { uint src = OPER_AL_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_pcdi(void) { uint src = OPER_PCDI_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_pcix(void) { uint src = OPER_PCIX_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmp_32_i(void) { uint src = OPER_I_32(); uint dst = DX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_d(void) { uint src = MAKE_INT_16(DY); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_a(void) { uint src = MAKE_INT_16(AY); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_ai(void) { uint src = MAKE_INT_16(OPER_AY_AI_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_pi(void) { uint src = MAKE_INT_16(OPER_AY_PI_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_pd(void) { uint src = MAKE_INT_16(OPER_AY_PD_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_di(void) { uint src = MAKE_INT_16(OPER_AY_DI_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_ix(void) { uint src = MAKE_INT_16(OPER_AY_IX_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_aw(void) { uint src = MAKE_INT_16(OPER_AW_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_al(void) { uint src = MAKE_INT_16(OPER_AL_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_pcdi(void) { uint src = MAKE_INT_16(OPER_PCDI_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_pcix(void) { uint src = MAKE_INT_16(OPER_PCIX_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_16_i(void) { uint src = MAKE_INT_16(OPER_I_16()); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_d(void) { uint src = DY; uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_a(void) { uint src = AY; uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_ai(void) { uint src = OPER_AY_AI_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_pi(void) { uint src = OPER_AY_PI_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_pd(void) { uint src = OPER_AY_PD_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_di(void) { uint src = OPER_AY_DI_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_ix(void) { uint src = OPER_AY_IX_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_aw(void) { uint src = OPER_AW_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_al(void) { uint src = OPER_AL_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_pcdi(void) { uint src = OPER_PCDI_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_pcix(void) { uint src = OPER_PCIX_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpa_32_i(void) { uint src = OPER_I_32(); uint dst = AX; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_8_d(void) { uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(DY); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_ai(void) { uint src = OPER_I_8(); uint dst = OPER_AY_AI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_pi(void) { uint src = OPER_I_8(); uint dst = OPER_AY_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_pi7(void) { uint src = OPER_I_8(); uint dst = OPER_A7_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_pd(void) { uint src = OPER_I_8(); uint dst = OPER_AY_PD_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_pd7(void) { uint src = OPER_I_8(); uint dst = OPER_A7_PD_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_di(void) { uint src = OPER_I_8(); uint dst = OPER_AY_DI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_ix(void) { uint src = OPER_I_8(); uint dst = OPER_AY_IX_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_aw(void) { uint src = OPER_I_8(); uint dst = OPER_AW_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_8_al(void) { uint src = OPER_I_8(); uint dst = OPER_AL_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpi_16_d(void) { uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(DY); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_ai(void) { uint src = OPER_I_16(); uint dst = OPER_AY_AI_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_pi(void) { uint src = OPER_I_16(); uint dst = OPER_AY_PI_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_pd(void) { uint src = OPER_I_16(); uint dst = OPER_AY_PD_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_di(void) { uint src = OPER_I_16(); uint dst = OPER_AY_DI_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_ix(void) { uint src = OPER_I_16(); uint dst = OPER_AY_IX_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_aw(void) { uint src = OPER_I_16(); uint dst = OPER_AW_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_16_al(void) { uint src = OPER_I_16(); uint dst = OPER_AL_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpi_32_d(void) { uint src = OPER_I_32(); uint dst = DY; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_ai(void) { uint src = OPER_I_32(); uint dst = OPER_AY_AI_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_pi(void) { uint src = OPER_I_32(); uint dst = OPER_AY_PI_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_pd(void) { uint src = OPER_I_32(); uint dst = OPER_AY_PD_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_di(void) { uint src = OPER_I_32(); uint dst = OPER_AY_DI_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_ix(void) { uint src = OPER_I_32(); uint dst = OPER_AY_IX_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_aw(void) { uint src = OPER_I_32(); uint dst = OPER_AW_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpi_32_al(void) { uint src = OPER_I_32(); uint dst = OPER_AL_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_cmpm_8_ax7(void) { uint src = OPER_AY_PI_8(); uint dst = OPER_A7_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpm_8_ay7(void) { uint src = OPER_A7_PI_8(); uint dst = OPER_AX_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpm_8_axy7(void) { uint src = OPER_A7_PI_8(); uint dst = OPER_A7_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpm_8(void) { uint src = OPER_AY_PI_8(); uint dst = OPER_AX_PI_8(); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_C = CFLAG_8(res); } static void m68k_op_cmpm_16(void) { uint src = OPER_AY_PI_16(); uint dst = OPER_AX_PI_16(); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_C = CFLAG_16(res); } static void m68k_op_cmpm_32(void) { uint src = OPER_AY_PI_32(); uint dst = OPER_AX_PI_32(); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_C = CFLAG_SUB_32(src, dst, res); } static void m68k_op_dbt_16(void) { REG_PC += 2; } static void m68k_op_dbf_16(void) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); } static void m68k_op_dbhi_16(void) { if(COND_NOT_HI()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbls_16(void) { if(COND_NOT_LS()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbcc_16(void) { if(COND_NOT_CC()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbcs_16(void) { if(COND_NOT_CS()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbne_16(void) { if(COND_NOT_NE()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbeq_16(void) { if(COND_NOT_EQ()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbvc_16(void) { if(COND_NOT_VC()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbvs_16(void) { if(COND_NOT_VS()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbpl_16(void) { if(COND_NOT_PL()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbmi_16(void) { if(COND_NOT_MI()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbge_16(void) { if(COND_NOT_GE()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dblt_16(void) { if(COND_NOT_LT()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dbgt_16(void) { if(COND_NOT_GT()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_dble_16(void) { if(COND_NOT_LE()) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(*r_dst - 1); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; if(res != 0xffff) { uint offset = OPER_I_16(); REG_PC -= 2; m68ki_branch_16(offset); USE_CYCLES(CYC_DBCC_F_NOEXP); /* reset idle loop detection */ m68ki_cpu.poll.detected = 0; return; } REG_PC += 2; USE_CYCLES(CYC_DBCC_F_EXP); return; } REG_PC += 2; } static void m68k_op_divs_16_d(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(DY); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_ai(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_AI_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_pi(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_PI_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_pd(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_PD_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_di(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_DI_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_ix(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_IX_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_aw(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AW_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_al(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AL_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_pcdi(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_PCDI_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_pcix(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_PCIX_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divs_16_i(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_I_16()); sint quotient; sint remainder; if(src != 0) { UseDivsCycles(*r_dst,src); if((uint32)*r_dst == 0x80000000 && src == -1) { FLAG_Z = 0; FLAG_N = NFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = 0; return; } quotient = MAKE_INT_32(*r_dst) / src; remainder = MAKE_INT_32(*r_dst) % src; if(quotient == MAKE_INT_16(quotient)) { FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 *10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_al(void) { uint* r_dst = &DX; uint src = OPER_AL_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_divu_16_i(void) { uint* r_dst = &DX; uint src = OPER_I_16(); if(src != 0) { uint quotient = *r_dst / src; uint remainder = *r_dst % src; if(quotient < 0x10000) { UseDivuCycles(*r_dst,src); FLAG_Z = quotient; FLAG_N = NFLAG_16(quotient); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); return; } USE_CYCLES(7 * 10); FLAG_V = VFLAG_SET; FLAG_N = NFLAG_SET; /* undocumented behavior (fixes Blood Shot on Genesis) */ FLAG_C = CFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE); } static void m68k_op_eor_8_d(void) { uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX)); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_ai(void) { uint ea = EA_AY_AI_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_pi(void) { uint ea = EA_AY_PI_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_pi7(void) { uint ea = EA_A7_PI_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_pd(void) { uint ea = EA_AY_PD_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_pd7(void) { uint ea = EA_A7_PD_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_di(void) { uint ea = EA_AY_DI_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_ix(void) { uint ea = EA_AY_IX_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_aw(void) { uint ea = EA_AW_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_8_al(void) { uint ea = EA_AL_8(); uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_d(void) { uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX)); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_ai(void) { uint ea = EA_AY_AI_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_pi(void) { uint ea = EA_AY_PI_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_pd(void) { uint ea = EA_AY_PD_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_di(void) { uint ea = EA_AY_DI_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_ix(void) { uint ea = EA_AY_IX_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_aw(void) { uint ea = EA_AW_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_16_al(void) { uint ea = EA_AL_16(); uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_d(void) { uint res = DY ^= DX; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_ai(void) { uint ea = EA_AY_AI_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_pi(void) { uint ea = EA_AY_PI_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_pd(void) { uint ea = EA_AY_PD_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_di(void) { uint ea = EA_AY_DI_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_ix(void) { uint ea = EA_AY_IX_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_aw(void) { uint ea = EA_AW_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eor_32_al(void) { uint ea = EA_AL_32(); uint res = DX ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_d(void) { uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8()); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_ai(void) { uint src = OPER_I_8(); uint ea = EA_AY_AI_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_pi(void) { uint src = OPER_I_8(); uint ea = EA_AY_PI_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_pi7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PI_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_pd(void) { uint src = OPER_I_8(); uint ea = EA_AY_PD_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_pd7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PD_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_di(void) { uint src = OPER_I_8(); uint ea = EA_AY_DI_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_ix(void) { uint src = OPER_I_8(); uint ea = EA_AY_IX_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_aw(void) { uint src = OPER_I_8(); uint ea = EA_AW_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_8_al(void) { uint src = OPER_I_8(); uint ea = EA_AL_8(); uint res = src ^ m68ki_read_8(ea); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_d(void) { uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16()); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_ai(void) { uint src = OPER_I_16(); uint ea = EA_AY_AI_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_pi(void) { uint src = OPER_I_16(); uint ea = EA_AY_PI_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_pd(void) { uint src = OPER_I_16(); uint ea = EA_AY_PD_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_di(void) { uint src = OPER_I_16(); uint ea = EA_AY_DI_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_ix(void) { uint src = OPER_I_16(); uint ea = EA_AY_IX_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_aw(void) { uint src = OPER_I_16(); uint ea = EA_AW_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_al(void) { uint src = OPER_I_16(); uint ea = EA_AL_16(); uint res = src ^ m68ki_read_16(ea); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_d(void) { uint res = DY ^= OPER_I_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_ai(void) { uint src = OPER_I_32(); uint ea = EA_AY_AI_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_pi(void) { uint src = OPER_I_32(); uint ea = EA_AY_PI_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_pd(void) { uint src = OPER_I_32(); uint ea = EA_AY_PD_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_di(void) { uint src = OPER_I_32(); uint ea = EA_AY_DI_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_ix(void) { uint src = OPER_I_32(); uint ea = EA_AY_IX_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_aw(void) { uint src = OPER_I_32(); uint ea = EA_AW_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_32_al(void) { uint src = OPER_I_32(); uint ea = EA_AL_32(); uint res = src ^ m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_eori_16_toc(void) { m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16()); } static void m68k_op_eori_16_tos(void) { if(FLAG_S) { uint src = OPER_I_16(); m68ki_set_sr(m68ki_get_sr() ^ src); return; } m68ki_exception_privilege_violation(); } static void m68k_op_exg_32_dd(void) { uint* reg_a = &DX; uint* reg_b = &DY; uint tmp = *reg_a; *reg_a = *reg_b; *reg_b = tmp; } static void m68k_op_exg_32_aa(void) { uint* reg_a = &AX; uint* reg_b = &AY; uint tmp = *reg_a; *reg_a = *reg_b; *reg_b = tmp; } static void m68k_op_exg_32_da(void) { uint* reg_a = &DX; uint* reg_b = &AY; uint tmp = *reg_a; *reg_a = *reg_b; *reg_b = tmp; } static void m68k_op_ext_16(void) { uint* r_dst = &DY; *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0); FLAG_N = NFLAG_16(*r_dst); FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_ext_32(void) { uint* r_dst = &DY; *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0); FLAG_N = NFLAG_32(*r_dst); FLAG_Z = *r_dst; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_illegal(void) { m68ki_exception_illegal(); } static void m68k_op_jmp_32_ai(void) { m68ki_jump(EA_AY_AI_32()); } static void m68k_op_jmp_32_di(void) { m68ki_jump(EA_AY_DI_32()); } static void m68k_op_jmp_32_ix(void) { m68ki_jump(EA_AY_IX_32()); } static void m68k_op_jmp_32_aw(void) { m68ki_jump(EA_AW_32()); } static void m68k_op_jmp_32_al(void) { m68ki_jump(EA_AL_32()); } static void m68k_op_jmp_32_pcdi(void) { m68ki_jump(EA_PCDI_32()); } static void m68k_op_jmp_32_pcix(void) { m68ki_jump(EA_PCIX_32()); } static void m68k_op_jsr_32_ai(void) { uint ea = EA_AY_AI_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_di(void) { uint ea = EA_AY_DI_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_ix(void) { uint ea = EA_AY_IX_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_aw(void) { uint ea = EA_AW_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_al(void) { uint ea = EA_AL_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_pcdi(void) { uint ea = EA_PCDI_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_jsr_32_pcix(void) { uint ea = EA_PCIX_32(); m68ki_push_32(REG_PC); m68ki_jump(ea); } static void m68k_op_lea_32_ai(void) { AX = EA_AY_AI_32(); } static void m68k_op_lea_32_di(void) { AX = EA_AY_DI_32(); } static void m68k_op_lea_32_ix(void) { AX = EA_AY_IX_32(); } static void m68k_op_lea_32_aw(void) { AX = EA_AW_32(); } static void m68k_op_lea_32_al(void) { AX = EA_AL_32(); } static void m68k_op_lea_32_pcdi(void) { AX = EA_PCDI_32(); } static void m68k_op_lea_32_pcix(void) { AX = EA_PCIX_32(); } static void m68k_op_link_16_a7(void) { REG_A[7] -= 4; m68ki_write_32(REG_A[7], REG_A[7]); REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); } static void m68k_op_link_16(void) { uint* r_dst = &AY; m68ki_push_32(*r_dst); *r_dst = REG_A[7]; REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16())); } static void m68k_op_lsr_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_X = FLAG_C = src << (9-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_X = FLAG_C = src << (9-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = src >> shift; if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_X = FLAG_C = src << (9-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_8_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift <= 8) { *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_X = FLAG_C = src << (9-shift); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffffff00; FLAG_X = XFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift <= 16) { *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_C = FLAG_X = (src >> (shift - 1))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffff0000; FLAG_X = XFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_32_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = *r_dst; uint res = src >> shift; if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 32) { *r_dst = res; FLAG_C = FLAG_X = (src >> (shift - 1))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst = 0; FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0); FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsr_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = src >> 1; m68ki_write_16(ea, res); FLAG_N = NFLAG_CLEAR; FLAG_Z = res; FLAG_C = FLAG_X = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = MASK_OUT_ABOVE_8(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_X = FLAG_C = src << shift; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = MASK_OUT_ABOVE_16(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> (8-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32(src << shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> (24-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_8_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = MASK_OUT_ABOVE_8(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift <= 8) { *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_X = FLAG_C = src << shift; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffffff00; FLAG_X = XFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = MASK_OUT_ABOVE_16(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift <= 16) { *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_X = FLAG_C = (src << shift) >> 8; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst &= 0xffff0000; FLAG_X = XFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_32_r(void) { uint* r_dst = &DY; uint shift = DX & 0x3f; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32(src << shift); if(shift != 0) { USE_CYCLES(shift * CYC_SHIFT); if(shift < 32) { *r_dst = res; FLAG_X = FLAG_C = (src >> (32 - shift)) << 8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } *r_dst = 0; FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8; FLAG_N = NFLAG_CLEAR; FLAG_Z = ZFLAG_SET; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_lsl_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(src << 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_X = FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_move_8_d_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_ai(void) { uint res = OPER_AY_AI_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pi(void) { uint res = OPER_AY_PI_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pi7(void) { uint res = OPER_A7_PI_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pd(void) { uint res = OPER_AY_PD_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pd7(void) { uint res = OPER_A7_PD_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_di(void) { uint res = OPER_AY_DI_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_ix(void) { uint res = OPER_AY_IX_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_aw(void) { uint res = OPER_AW_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_al(void) { uint res = OPER_AL_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pcdi(void) { uint res = OPER_PCDI_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_pcix(void) { uint res = OPER_PCIX_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_d_i(void) { uint res = OPER_I_8(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_8_ai_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_al(void) { uint res = OPER_AL_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ai_i(void) { uint res = OPER_I_8(); uint ea = EA_AX_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_aw(void) { uint res = OPER_AW_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_al(void) { uint res = OPER_AL_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi7_i(void) { uint res = OPER_I_8(); uint ea = EA_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_al(void) { uint res = OPER_AL_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pi_i(void) { uint res = OPER_I_8(); uint ea = EA_AX_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_aw(void) { uint res = OPER_AW_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_al(void) { uint res = OPER_AL_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd7_i(void) { uint res = OPER_I_8(); uint ea = EA_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_al(void) { uint res = OPER_AL_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_pd_i(void) { uint res = OPER_I_8(); uint ea = EA_AX_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_al(void) { uint res = OPER_AL_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_di_i(void) { uint res = OPER_I_8(); uint ea = EA_AX_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_al(void) { uint res = OPER_AL_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_ix_i(void) { uint res = OPER_I_8(); uint ea = EA_AX_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_al(void) { uint res = OPER_AL_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_aw_i(void) { uint res = OPER_I_8(); uint ea = EA_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_d(void) { uint res = MASK_OUT_ABOVE_8(DY); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_ai(void) { uint res = OPER_AY_AI_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pi(void) { uint res = OPER_AY_PI_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pi7(void) { uint res = OPER_A7_PI_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pd(void) { uint res = OPER_AY_PD_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pd7(void) { uint res = OPER_A7_PD_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_di(void) { uint res = OPER_AY_DI_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_ix(void) { uint res = OPER_AY_IX_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_aw(void) { uint res = OPER_AW_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_al(void) { uint res = OPER_AL_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pcdi(void) { uint res = OPER_PCDI_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_pcix(void) { uint res = OPER_PCIX_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_8_al_i(void) { uint res = OPER_I_8(); uint ea = EA_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_8(ea, res); } static void m68k_op_move_16_d_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_ai(void) { uint res = OPER_AY_AI_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_pi(void) { uint res = OPER_AY_PI_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_pd(void) { uint res = OPER_AY_PD_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_di(void) { uint res = OPER_AY_DI_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_ix(void) { uint res = OPER_AY_IX_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_aw(void) { uint res = OPER_AW_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_al(void) { uint res = OPER_AL_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_pcdi(void) { uint res = OPER_PCDI_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_pcix(void) { uint res = OPER_PCIX_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_d_i(void) { uint res = OPER_I_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_16_ai_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_al(void) { uint res = OPER_AL_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ai_i(void) { uint res = OPER_I_16(); uint ea = EA_AX_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_al(void) { uint res = OPER_AL_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pi_i(void) { uint res = OPER_I_16(); uint ea = EA_AX_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_al(void) { uint res = OPER_AL_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_pd_i(void) { uint res = OPER_I_16(); uint ea = EA_AX_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_al(void) { uint res = OPER_AL_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_di_i(void) { uint res = OPER_I_16(); uint ea = EA_AX_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_al(void) { uint res = OPER_AL_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_ix_i(void) { uint res = OPER_I_16(); uint ea = EA_AX_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_al(void) { uint res = OPER_AL_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_aw_i(void) { uint res = OPER_I_16(); uint ea = EA_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_d(void) { uint res = MASK_OUT_ABOVE_16(DY); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_a(void) { uint res = MASK_OUT_ABOVE_16(AY); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_ai(void) { uint res = OPER_AY_AI_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_pi(void) { uint res = OPER_AY_PI_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_pd(void) { uint res = OPER_AY_PD_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_di(void) { uint res = OPER_AY_DI_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_ix(void) { uint res = OPER_AY_IX_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_aw(void) { uint res = OPER_AW_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_al(void) { uint res = OPER_AL_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_pcdi(void) { uint res = OPER_PCDI_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_pcix(void) { uint res = OPER_PCIX_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_16_al_i(void) { uint res = OPER_I_16(); uint ea = EA_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea, res); } static void m68k_op_move_32_d_d(void) { uint res = DY; uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_a(void) { uint res = AY; uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_ai(void) { uint res = OPER_AY_AI_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_pi(void) { uint res = OPER_AY_PI_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_pd(void) { uint res = OPER_AY_PD_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_di(void) { uint res = OPER_AY_DI_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_ix(void) { uint res = OPER_AY_IX_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_aw(void) { uint res = OPER_AW_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_al(void) { uint res = OPER_AL_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_pcdi(void) { uint res = OPER_PCDI_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_pcix(void) { uint res = OPER_PCIX_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_d_i(void) { uint res = OPER_I_32(); uint* r_dst = &DX; *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_move_32_ai_d(void) { uint res = DY; uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_a(void) { uint res = AY; uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_al(void) { uint res = OPER_AL_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ai_i(void) { uint res = OPER_I_32(); uint ea = EA_AX_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_d(void) { uint res = DY; uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_a(void) { uint res = AY; uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_al(void) { uint res = OPER_AL_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pi_i(void) { uint res = OPER_I_32(); uint ea = EA_AX_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_pd_d(void) { uint res = DY; uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_a(void) { uint res = AY; uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_al(void) { uint res = OPER_AL_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_pd_i(void) { uint res = OPER_I_32(); uint ea = EA_AX_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_16(ea+2, res & 0xFFFF ); m68ki_write_16(ea, (res >> 16) & 0xFFFF ); } static void m68k_op_move_32_di_d(void) { uint res = DY; uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_a(void) { uint res = AY; uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_al(void) { uint res = OPER_AL_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_di_i(void) { uint res = OPER_I_32(); uint ea = EA_AX_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_d(void) { uint res = DY; uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_a(void) { uint res = AY; uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_al(void) { uint res = OPER_AL_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_ix_i(void) { uint res = OPER_I_32(); uint ea = EA_AX_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_d(void) { uint res = DY; uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_a(void) { uint res = AY; uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_al(void) { uint res = OPER_AL_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_aw_i(void) { uint res = OPER_I_32(); uint ea = EA_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_d(void) { uint res = DY; uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_a(void) { uint res = AY; uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_ai(void) { uint res = OPER_AY_AI_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_pi(void) { uint res = OPER_AY_PI_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_pd(void) { uint res = OPER_AY_PD_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_di(void) { uint res = OPER_AY_DI_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_ix(void) { uint res = OPER_AY_IX_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_aw(void) { uint res = OPER_AW_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_al(void) { uint res = OPER_AL_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_pcdi(void) { uint res = OPER_PCDI_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_pcix(void) { uint res = OPER_PCIX_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_move_32_al_i(void) { uint res = OPER_I_32(); uint ea = EA_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; m68ki_write_32(ea, res); } static void m68k_op_movea_16_d(void) { AX = MAKE_INT_16(DY); } static void m68k_op_movea_16_a(void) { AX = MAKE_INT_16(AY); } static void m68k_op_movea_16_ai(void) { AX = MAKE_INT_16(OPER_AY_AI_16()); } static void m68k_op_movea_16_pi(void) { AX = MAKE_INT_16(OPER_AY_PI_16()); } static void m68k_op_movea_16_pd(void) { AX = MAKE_INT_16(OPER_AY_PD_16()); } static void m68k_op_movea_16_di(void) { AX = MAKE_INT_16(OPER_AY_DI_16()); } static void m68k_op_movea_16_ix(void) { AX = MAKE_INT_16(OPER_AY_IX_16()); } static void m68k_op_movea_16_aw(void) { AX = MAKE_INT_16(OPER_AW_16()); } static void m68k_op_movea_16_al(void) { AX = MAKE_INT_16(OPER_AL_16()); } static void m68k_op_movea_16_pcdi(void) { AX = MAKE_INT_16(OPER_PCDI_16()); } static void m68k_op_movea_16_pcix(void) { AX = MAKE_INT_16(OPER_PCIX_16()); } static void m68k_op_movea_16_i(void) { AX = MAKE_INT_16(OPER_I_16()); } static void m68k_op_movea_32_d(void) { AX = DY; } static void m68k_op_movea_32_a(void) { AX = AY; } static void m68k_op_movea_32_ai(void) { AX = OPER_AY_AI_32(); } static void m68k_op_movea_32_pi(void) { AX = OPER_AY_PI_32(); } static void m68k_op_movea_32_pd(void) { AX = OPER_AY_PD_32(); } static void m68k_op_movea_32_di(void) { AX = OPER_AY_DI_32(); } static void m68k_op_movea_32_ix(void) { AX = OPER_AY_IX_32(); } static void m68k_op_movea_32_aw(void) { AX = OPER_AW_32(); } static void m68k_op_movea_32_al(void) { AX = OPER_AL_32(); } static void m68k_op_movea_32_pcdi(void) { AX = OPER_PCDI_32(); } static void m68k_op_movea_32_pcix(void) { AX = OPER_PCIX_32(); } static void m68k_op_movea_32_i(void) { AX = OPER_I_32(); } static void m68k_op_move_16_toc_d(void) { m68ki_set_ccr(DY); } static void m68k_op_move_16_toc_ai(void) { m68ki_set_ccr(OPER_AY_AI_16()); } static void m68k_op_move_16_toc_pi(void) { m68ki_set_ccr(OPER_AY_PI_16()); } static void m68k_op_move_16_toc_pd(void) { m68ki_set_ccr(OPER_AY_PD_16()); } static void m68k_op_move_16_toc_di(void) { m68ki_set_ccr(OPER_AY_DI_16()); } static void m68k_op_move_16_toc_ix(void) { m68ki_set_ccr(OPER_AY_IX_16()); } static void m68k_op_move_16_toc_aw(void) { m68ki_set_ccr(OPER_AW_16()); } static void m68k_op_move_16_toc_al(void) { m68ki_set_ccr(OPER_AL_16()); } static void m68k_op_move_16_toc_pcdi(void) { m68ki_set_ccr(OPER_PCDI_16()); } static void m68k_op_move_16_toc_pcix(void) { m68ki_set_ccr(OPER_PCIX_16()); } static void m68k_op_move_16_toc_i(void) { m68ki_set_ccr(OPER_I_16()); } static void m68k_op_move_16_frs_d(void) { DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr(); } static void m68k_op_move_16_frs_ai(void) { uint ea = EA_AY_AI_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_pi(void) { uint ea = EA_AY_PI_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_pd(void) { uint ea = EA_AY_PD_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_di(void) { uint ea = EA_AY_DI_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_ix(void) { uint ea = EA_AY_IX_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_aw(void) { uint ea = EA_AW_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_frs_al(void) { uint ea = EA_AL_16(); m68ki_write_16(ea, m68ki_get_sr()); } static void m68k_op_move_16_tos_d(void) { if(FLAG_S) { m68ki_set_sr(DY); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_ai(void) { if(FLAG_S) { uint new_sr = OPER_AY_AI_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_pi(void) { if(FLAG_S) { uint new_sr = OPER_AY_PI_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_pd(void) { if(FLAG_S) { uint new_sr = OPER_AY_PD_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_di(void) { if(FLAG_S) { uint new_sr = OPER_AY_DI_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_ix(void) { if(FLAG_S) { uint new_sr = OPER_AY_IX_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_aw(void) { if(FLAG_S) { uint new_sr = OPER_AW_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_al(void) { if(FLAG_S) { uint new_sr = OPER_AL_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_pcdi(void) { if(FLAG_S) { uint new_sr = OPER_PCDI_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_pcix(void) { if(FLAG_S) { uint new_sr = OPER_PCIX_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_16_tos_i(void) { if(FLAG_S) { uint new_sr = OPER_I_16(); m68ki_set_sr(new_sr); return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_32_fru(void) { if(FLAG_S) { AY = REG_USP; return; } m68ki_exception_privilege_violation(); } static void m68k_op_move_32_tou(void) { if(FLAG_S) { REG_USP = AY; return; } m68ki_exception_privilege_violation(); } static void m68k_op_movem_16_re_pd(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = AY; uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { ea -= 2; m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i])); count++; } AY = ea; USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_re_ai(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_AI_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i])); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_re_di(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_DI_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i])); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_re_ix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_IX_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i])); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_re_aw(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AW_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i])); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_re_al(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AL_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i])); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_32_re_pd(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = AY; uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { ea -= 4; m68ki_write_16(ea+2, REG_DA[15-i] & 0xFFFF ); m68ki_write_16(ea, (REG_DA[15-i] >> 16) & 0xFFFF ); count++; } AY = ea; USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_re_ai(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_AI_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_32(ea, REG_DA[i]); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_re_di(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_DI_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_32(ea, REG_DA[i]); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_re_ix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_IX_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_32(ea, REG_DA[i]); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_re_aw(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AW_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_32(ea, REG_DA[i]); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_re_al(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AL_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { m68ki_write_32(ea, REG_DA[i]); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_16_er_pi(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = AY; uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } AY = ea; USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_pcdi(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_PCDI_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_pcix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_PCIX_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_ai(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_AI_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_di(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_DI_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_ix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_IX_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_aw(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AW_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_16_er_al(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AL_16(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea))); ea += 2; count++; } USE_CYCLES(count * CYC_MOVEM_W); } static void m68k_op_movem_32_er_pi(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = AY; uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } AY = ea; USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_pcdi(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_PCDI_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_pcrel_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_pcix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_PCIX_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_pcrel_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_ai(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_AI_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_di(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_DI_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_ix(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AY_IX_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_aw(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AW_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movem_32_er_al(void) { uint i = 0; uint register_list = OPER_I_16(); uint ea = EA_AL_32(); uint count = 0; for(; i < 16; i++) if(register_list & (1 << i)) { REG_DA[i] = m68ki_read_32(ea); ea += 4; count++; } USE_CYCLES(count * CYC_MOVEM_L); } static void m68k_op_movep_16_re(void) { uint ea = EA_AY_DI_16(); uint src = DX; m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 8)); m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); } static void m68k_op_movep_32_re(void) { uint ea = EA_AY_DI_32(); uint src = DX; m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24)); m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16)); m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8)); m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src)); } static void m68k_op_movep_16_er(void) { uint ea = EA_AY_DI_16(); uint* r_dst = &DX; *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2)); } static void m68k_op_movep_32_er(void) { uint ea = EA_AY_DI_32(); DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16) + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6); } static void m68k_op_moveq_32(void) { uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR)); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_d(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(DY); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_ai(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_AI_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_pi(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_PI_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_pd(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_PD_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_di(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_DI_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_ix(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AY_IX_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_aw(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AW_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_al(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_AL_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_pcdi(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_PCDI_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_pcix(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_PCIX_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_muls_16_i(void) { uint* r_dst = &DX; sint src = MAKE_INT_16(OPER_I_16()); uint res = MASK_OUT_ABOVE_32( src * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); UseMulsCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_al(void) { uint* r_dst = &DX; uint src = OPER_AL_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_mulu_16_i(void) { uint* r_dst = &DX; uint src = OPER_I_16(); uint res = src * MASK_OUT_ABOVE_16(*r_dst); UseMuluCycles(src); *r_dst = res; FLAG_Z = res; FLAG_N = NFLAG_32(res); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_nbcd_8_d(void) { uint* r_dst = &DY; uint dst = *r_dst; uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_ai(void) { uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_pi(void) { uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_pi7(void) { uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_pd(void) { uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_pd7(void) { uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_di(void) { uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_ix(void) { uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_aw(void) { uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_nbcd_8_al(void) { uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); if(res != 0x9a) { FLAG_V = ~res; /* Undefined V behavior */ if((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; res = MASK_OUT_ABOVE_8(res); FLAG_V &= res; /* Undefined V behavior part II */ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); FLAG_Z |= res; FLAG_C = CFLAG_SET; FLAG_X = XFLAG_SET; } else { FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; FLAG_X = XFLAG_CLEAR; } FLAG_N = NFLAG_8(res); /* Undefined N behavior */ } static void m68k_op_neg_8_d(void) { uint* r_dst = &DY; uint res = 0 - MASK_OUT_ABOVE_8(*r_dst); FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = *r_dst & res; FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_neg_8_ai(void) { uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_pi(void) { uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_pi7(void) { uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_pd(void) { uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_pd7(void) { uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_di(void) { uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_ix(void) { uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_aw(void) { uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_8_al(void) { uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); uint res = 0 - src; FLAG_N = NFLAG_8(res); FLAG_C = FLAG_X = CFLAG_8(res); FLAG_V = src & res; FLAG_Z = MASK_OUT_ABOVE_8(res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_neg_16_d(void) { uint* r_dst = &DY; uint res = 0 - MASK_OUT_ABOVE_16(*r_dst); FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (*r_dst & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_neg_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = 0 - src; FLAG_N = NFLAG_16(res); FLAG_C = FLAG_X = CFLAG_16(res); FLAG_V = (src & res)>>8; FLAG_Z = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_neg_32_d(void) { uint* r_dst = &DY; uint res = 0 - *r_dst; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res); FLAG_V = (*r_dst & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_neg_32_ai(void) { uint ea = EA_AY_AI_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_pi(void) { uint ea = EA_AY_PI_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_pd(void) { uint ea = EA_AY_PD_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_di(void) { uint ea = EA_AY_DI_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_ix(void) { uint ea = EA_AY_IX_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_aw(void) { uint ea = EA_AW_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_neg_32_al(void) { uint ea = EA_AL_32(); uint src = m68ki_read_32(ea); uint res = 0 - src; FLAG_N = NFLAG_32(res); FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; FLAG_Z = MASK_OUT_ABOVE_32(res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_negx_8_d(void) { uint* r_dst = &DY; uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = *r_dst & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; } static void m68k_op_negx_8_ai(void) { uint ea = EA_AY_AI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_pi(void) { uint ea = EA_AY_PI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_pi7(void) { uint ea = EA_A7_PI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_pd(void) { uint ea = EA_AY_PD_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_pd7(void) { uint ea = EA_A7_PD_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_di(void) { uint ea = EA_AY_DI_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_ix(void) { uint ea = EA_AY_IX_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_aw(void) { uint ea = EA_AW_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_8_al(void) { uint ea = EA_AL_8(); uint src = m68ki_read_8(ea); uint res = 0 - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = src & res; res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_negx_16_d(void) { uint* r_dst = &DY; uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (*r_dst & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; } static void m68k_op_negx_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = (src & res)>>8; res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_negx_32_d(void) { uint* r_dst = &DY; uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res); FLAG_V = (*r_dst & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; *r_dst = res; } static void m68k_op_negx_32_ai(void) { uint ea = EA_AY_AI_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_pi(void) { uint ea = EA_AY_PI_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_pd(void) { uint ea = EA_AY_PD_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_di(void) { uint ea = EA_AY_DI_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_ix(void) { uint ea = EA_AY_IX_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_aw(void) { uint ea = EA_AW_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_negx_32_al(void) { uint ea = EA_AL_32(); uint src = m68ki_read_32(ea); uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res); FLAG_V = (src & res)>>24; res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_nop(void) { } static void m68k_op_not_8_d(void) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_8(~*r_dst); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_ai(void) { uint ea = EA_AY_AI_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_pi(void) { uint ea = EA_AY_PI_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_pi7(void) { uint ea = EA_A7_PI_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_pd(void) { uint ea = EA_AY_PD_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_pd7(void) { uint ea = EA_A7_PD_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_di(void) { uint ea = EA_AY_DI_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_ix(void) { uint ea = EA_AY_IX_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_aw(void) { uint ea = EA_AW_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_8_al(void) { uint ea = EA_AL_8(); uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_d(void) { uint* r_dst = &DY; uint res = MASK_OUT_ABOVE_16(~*r_dst); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_ai(void) { uint ea = EA_AY_AI_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_pi(void) { uint ea = EA_AY_PI_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_pd(void) { uint ea = EA_AY_PD_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_di(void) { uint ea = EA_AY_DI_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_ix(void) { uint ea = EA_AY_IX_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_aw(void) { uint ea = EA_AW_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_16_al(void) { uint ea = EA_AL_16(); uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_d(void) { uint* r_dst = &DY; uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_ai(void) { uint ea = EA_AY_AI_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_pi(void) { uint ea = EA_AY_PI_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_pd(void) { uint ea = EA_AY_PD_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_di(void) { uint ea = EA_AY_DI_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_ix(void) { uint ea = EA_AY_IX_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_aw(void) { uint ea = EA_AW_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_not_32_al(void) { uint ea = EA_AL_32(); uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea)); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_d(void) { uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY))); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_ai(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_AI_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pi(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PI_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pi7(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PI_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pd(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PD_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pd7(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PD_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_di(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_DI_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_ix(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_IX_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_aw(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AW_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_al(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_AL_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pcdi(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCDI_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_pcix(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCIX_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_er_i(void) { uint res = MASK_OUT_ABOVE_8((DX |= OPER_I_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_d(void) { uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY))); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_ai(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_AI_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_pi(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PI_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_pd(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PD_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_di(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_DI_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_ix(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_IX_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_aw(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AW_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_al(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_AL_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_pcdi(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCDI_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_pcix(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCIX_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_er_i(void) { uint res = MASK_OUT_ABOVE_16((DX |= OPER_I_16())); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_d(void) { uint res = DX |= DY; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_ai(void) { uint res = DX |= OPER_AY_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_pi(void) { uint res = DX |= OPER_AY_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_pd(void) { uint res = DX |= OPER_AY_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_di(void) { uint res = DX |= OPER_AY_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_ix(void) { uint res = DX |= OPER_AY_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_aw(void) { uint res = DX |= OPER_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_al(void) { uint res = DX |= OPER_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_pcdi(void) { uint res = DX |= OPER_PCDI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_pcix(void) { uint res = DX |= OPER_PCIX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_er_i(void) { uint res = DX |= OPER_I_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_ai(void) { uint ea = EA_AY_AI_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_pi(void) { uint ea = EA_AY_PI_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_pi7(void) { uint ea = EA_A7_PI_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_pd(void) { uint ea = EA_AY_PD_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_pd7(void) { uint ea = EA_A7_PD_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_di(void) { uint ea = EA_AY_DI_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_ix(void) { uint ea = EA_AY_IX_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_aw(void) { uint ea = EA_AW_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_8_re_al(void) { uint ea = EA_AL_8(); uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_ai(void) { uint ea = EA_AY_AI_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_pi(void) { uint ea = EA_AY_PI_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_pd(void) { uint ea = EA_AY_PD_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_di(void) { uint ea = EA_AY_DI_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_ix(void) { uint ea = EA_AY_IX_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_aw(void) { uint ea = EA_AW_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_16_re_al(void) { uint ea = EA_AL_16(); uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_ai(void) { uint ea = EA_AY_AI_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_pi(void) { uint ea = EA_AY_PI_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_pd(void) { uint ea = EA_AY_PD_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_di(void) { uint ea = EA_AY_DI_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_ix(void) { uint ea = EA_AY_IX_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_aw(void) { uint ea = EA_AW_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_or_32_re_al(void) { uint ea = EA_AL_32(); uint res = DX | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_d(void) { uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8())); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_ai(void) { uint src = OPER_I_8(); uint ea = EA_AY_AI_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_pi(void) { uint src = OPER_I_8(); uint ea = EA_AY_PI_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_pi7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PI_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_pd(void) { uint src = OPER_I_8(); uint ea = EA_AY_PD_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_pd7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PD_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_di(void) { uint src = OPER_I_8(); uint ea = EA_AY_DI_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_ix(void) { uint src = OPER_I_8(); uint ea = EA_AY_IX_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_aw(void) { uint src = OPER_I_8(); uint ea = EA_AW_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_8_al(void) { uint src = OPER_I_8(); uint ea = EA_AL_8(); uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea)); m68ki_write_8(ea, res); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_d(void) { uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16()); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_ai(void) { uint src = OPER_I_16(); uint ea = EA_AY_AI_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_pi(void) { uint src = OPER_I_16(); uint ea = EA_AY_PI_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_pd(void) { uint src = OPER_I_16(); uint ea = EA_AY_PD_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_di(void) { uint src = OPER_I_16(); uint ea = EA_AY_DI_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_ix(void) { uint src = OPER_I_16(); uint ea = EA_AY_IX_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_aw(void) { uint src = OPER_I_16(); uint ea = EA_AW_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_al(void) { uint src = OPER_I_16(); uint ea = EA_AL_16(); uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_d(void) { uint res = DY |= OPER_I_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_ai(void) { uint src = OPER_I_32(); uint ea = EA_AY_AI_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_pi(void) { uint src = OPER_I_32(); uint ea = EA_AY_PI_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_pd(void) { uint src = OPER_I_32(); uint ea = EA_AY_PD_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_di(void) { uint src = OPER_I_32(); uint ea = EA_AY_DI_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_ix(void) { uint src = OPER_I_32(); uint ea = EA_AY_IX_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_aw(void) { uint src = OPER_I_32(); uint ea = EA_AW_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_32_al(void) { uint src = OPER_I_32(); uint ea = EA_AL_32(); uint res = src | m68ki_read_32(ea); m68ki_write_32(ea, res); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ori_16_toc(void) { m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16()); } static void m68k_op_ori_16_tos(void) { if(FLAG_S) { uint src = OPER_I_16(); m68ki_set_sr(m68ki_get_sr() | src); return; } m68ki_exception_privilege_violation(); } static void m68k_op_pea_32_ai(void) { uint ea = EA_AY_AI_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_di(void) { uint ea = EA_AY_DI_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_ix(void) { uint ea = EA_AY_IX_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_aw(void) { uint ea = EA_AW_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_al(void) { uint ea = EA_AL_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_pcdi(void) { uint ea = EA_PCDI_32(); m68ki_push_32(ea); } static void m68k_op_pea_32_pcix(void) { uint ea = EA_PCIX_32(); m68ki_push_32(ea); } static void m68k_op_reset(void) { if(FLAG_S) { m68ki_output_reset() /* auto-disable (see m68kcpu.h) */ USE_CYCLES(CYC_RESET); return; } m68ki_exception_privilege_violation(); } static void m68k_op_ror_8_s(void) { uint* r_dst = &DY; uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; uint shift = orig_shift & 7; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROR_8(src, shift); if(orig_shift != 0) USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = src << (9-orig_shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROR_16(src, shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << (9-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint64 src = *r_dst; uint res = ROR_32(src, shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = src << (9-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_8_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 7; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROR_8(src, shift); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_C = src << (8-((shift-1)&7)); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 15; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROR_16(src, shift); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_C = (src >> ((shift - 1) & 15)) << 8; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_32_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 31; uint64 src = *r_dst; uint res = ROR_32(src, shift); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = res; FLAG_C = (src >> ((shift - 1) & 31)) << 8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_ror_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = ROR_16(src, 1); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src << 8; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_8_s(void) { uint* r_dst = &DY; uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1; uint shift = orig_shift & 7; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROL_8(src, shift); if(orig_shift != 0) USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_C = src << orig_shift; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROL_16(src, shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> (8-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_32_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint64 src = *r_dst; uint res = ROL_32(src, shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_C = src >> (24-shift); FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_8_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 7; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROL_8(src, shift); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); if(shift != 0) { *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_C = src << shift; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = (src & 1)<<8; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_8(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 15; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift)); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); if(shift != 0) { *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_C = (src << shift) >> 8; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = (src & 1)<<8; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_16(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_32_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift & 31; uint64 src = *r_dst; uint res = ROL_32(src, shift); if(orig_shift != 0) { USE_CYCLES(orig_shift * CYC_SHIFT); *r_dst = res; FLAG_C = (src >> ((32 - shift) & 0x1f)) << 8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = CFLAG_CLEAR; FLAG_N = NFLAG_32(src); FLAG_Z = src; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rol_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_C = src >> 7; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); FLAG_C = FLAG_X = res; res = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_32_s(void) { #if M68K_USE_64_BIT uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint64 src = *r_dst; uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); res = ROR_33_64(res, shift); FLAG_C = FLAG_X = res >> 24; res = MASK_OUT_ABOVE_32(res); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #else uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); uint new_x_flag = src & (1 << (shift - 1)); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_C = FLAG_X = (new_x_flag != 0)<<8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #endif } static void m68k_op_roxr_8_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 9; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res; res = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_8(*r_dst); FLAG_Z = MASK_OUT_ABOVE_8(*r_dst); FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 17; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_16(*r_dst); FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_32_r(void) { #if M68K_USE_64_BIT uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 33; uint64 src = *r_dst; uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); res = ROR_33_64(res, shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 24; res = MASK_OUT_ABOVE_32(res); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_32(*r_dst); FLAG_Z = *r_dst; FLAG_V = VFLAG_CLEAR; #else uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift % 33; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift))); uint new_x_flag = src & (1 << (shift - 1)); if(orig_shift != 0) USE_CYCLES(orig_shift * CYC_SHIFT); if(shift != 0) { *r_dst = res; FLAG_X = (new_x_flag != 0)<<8; } else res = src; FLAG_C = FLAG_X; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #endif } static void m68k_op_roxr_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxr_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_8_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); FLAG_C = FLAG_X = res; res = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_s(void) { uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_32_s(void) { #if M68K_USE_64_BIT uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint64 src = *r_dst; uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); res = ROL_33_64(res, shift); FLAG_C = FLAG_X = res >> 24; res = MASK_OUT_ABOVE_32(res); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #else uint* r_dst = &DY; uint shift = (((REG_IR >> 9) - 1) & 7) + 1; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); uint new_x_flag = src & (1 << (32 - shift)); if(shift != 0) USE_CYCLES(shift * CYC_SHIFT); *r_dst = res; FLAG_C = FLAG_X = (new_x_flag != 0)<<8; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #endif } static void m68k_op_roxl_8_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 9; uint src = MASK_OUT_ABOVE_8(*r_dst); uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res; res = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_8(*r_dst); FLAG_Z = MASK_OUT_ABOVE_8(*r_dst); FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_r(void) { uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 17; uint src = MASK_OUT_ABOVE_16(*r_dst); uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_16(*r_dst); FLAG_Z = MASK_OUT_ABOVE_16(*r_dst); FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_32_r(void) { #if M68K_USE_64_BIT uint* r_dst = &DY; uint orig_shift = DX & 0x3f; if(orig_shift != 0) { uint shift = orig_shift % 33; uint64 src = *r_dst; uint64 res = src | (((uint64)XFLAG_AS_1()) << 32); res = ROL_33_64(res, shift); USE_CYCLES(orig_shift * CYC_SHIFT); FLAG_C = FLAG_X = res >> 24; res = MASK_OUT_ABOVE_32(res); *r_dst = res; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; return; } FLAG_C = FLAG_X; FLAG_N = NFLAG_32(*r_dst); FLAG_Z = *r_dst; FLAG_V = VFLAG_CLEAR; #else uint* r_dst = &DY; uint orig_shift = DX & 0x3f; uint shift = orig_shift % 33; uint src = *r_dst; uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1))); uint new_x_flag = src & (1 << (32 - shift)); if(orig_shift != 0) USE_CYCLES(orig_shift * CYC_SHIFT); if(shift != 0) { *r_dst = res; FLAG_X = (new_x_flag != 0)<<8; } else res = src; FLAG_C = FLAG_X; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; #endif } static void m68k_op_roxl_16_ai(void) { uint ea = EA_AY_AI_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_pi(void) { uint ea = EA_AY_PI_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_pd(void) { uint ea = EA_AY_PD_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_di(void) { uint ea = EA_AY_DI_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_ix(void) { uint ea = EA_AY_IX_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_aw(void) { uint ea = EA_AW_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_roxl_16_al(void) { uint ea = EA_AL_16(); uint src = m68ki_read_16(ea); uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1); FLAG_C = FLAG_X = res >> 8; res = MASK_OUT_ABOVE_16(res); m68ki_write_16(ea, res); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; } static void m68k_op_rte_32(void) { if(FLAG_S) { uint new_sr; uint new_pc; new_sr = m68ki_pull_16(); new_pc = m68ki_pull_32(); m68ki_jump(new_pc); m68ki_set_sr(new_sr); #if M68K_EMULATE_ADDRESS_ERROR CPU_INSTR_MODE = INSTRUCTION_YES; CPU_RUN_MODE = RUN_MODE_NORMAL; #endif return; } m68ki_exception_privilege_violation(); } static void m68k_op_rtr_32(void) { m68ki_set_ccr(m68ki_pull_16()); m68ki_jump(m68ki_pull_32()); } static void m68k_op_rts_32(void) { m68ki_jump(m68ki_pull_32()); } static void m68k_op_sbcd_8_rr(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); /* FLAG_V = ~res; */ /* Undefined V behavior */ FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to assume cleared. */ if(res > 9) res -= 6; res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); if(res > 0x99) { res += 0xa0; FLAG_X = FLAG_C = CFLAG_SET; FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ } else FLAG_N = FLAG_X = FLAG_C = 0; res = MASK_OUT_ABOVE_8(res); /* FLAG_V &= res; */ /* Undefined V behavior part II */ /* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; } static void m68k_op_sbcd_8_mm_ax7(void) { uint src = OPER_AY_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); /* FLAG_V = ~res; */ /* Undefined V behavior */ FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ if(res > 9) res -= 6; res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); if(res > 0x99) { res += 0xa0; FLAG_X = FLAG_C = CFLAG_SET; FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ } else FLAG_N = FLAG_X = FLAG_C = 0; res = MASK_OUT_ABOVE_8(res); /* FLAG_V &= res; */ /* Undefined V behavior part II */ /* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_sbcd_8_mm_ay7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); /* FLAG_V = ~res; */ /* Undefined V behavior */ FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ if(res > 9) res -= 6; res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); if(res > 0x99) { res += 0xa0; FLAG_X = FLAG_C = CFLAG_SET; FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ } else FLAG_N = FLAG_X = FLAG_C = 0; res = MASK_OUT_ABOVE_8(res); /* FLAG_V &= res; */ /* Undefined V behavior part II */ /* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_sbcd_8_mm_axy7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); /* FLAG_V = ~res; */ /* Undefined V behavior */ FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ if(res > 9) res -= 6; res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); if(res > 0x99) { res += 0xa0; FLAG_X = FLAG_C = CFLAG_SET; FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ } else FLAG_N = FLAG_X = FLAG_C = 0; res = MASK_OUT_ABOVE_8(res); /* FLAG_V &= res; */ /* Undefined V behavior part II */ /* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_sbcd_8_mm(void) { uint src = OPER_AY_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); /* FLAG_V = ~res; */ /* Undefined V behavior */ FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ if(res > 9) res -= 6; res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); if(res > 0x99) { res += 0xa0; FLAG_X = FLAG_C = CFLAG_SET; FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ } else FLAG_N = FLAG_X = FLAG_C = 0; res = MASK_OUT_ABOVE_8(res); /* FLAG_V &= res; */ /* Undefined V behavior part II */ /* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_st_8_d(void) { DY |= 0xff; } static void m68k_op_st_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), 0xff); } static void m68k_op_st_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), 0xff); } static void m68k_op_st_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), 0xff); } static void m68k_op_st_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), 0xff); } static void m68k_op_st_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), 0xff); } static void m68k_op_st_8_di(void) { m68ki_write_8(EA_AY_DI_8(), 0xff); } static void m68k_op_st_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), 0xff); } static void m68k_op_st_8_aw(void) { m68ki_write_8(EA_AW_8(), 0xff); } static void m68k_op_st_8_al(void) { m68ki_write_8(EA_AL_8(), 0xff); } static void m68k_op_sf_8_d(void) { DY &= 0xffffff00; } static void m68k_op_sf_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), 0); } static void m68k_op_sf_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), 0); } static void m68k_op_sf_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), 0); } static void m68k_op_sf_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), 0); } static void m68k_op_sf_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), 0); } static void m68k_op_sf_8_di(void) { m68ki_write_8(EA_AY_DI_8(), 0); } static void m68k_op_sf_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), 0); } static void m68k_op_sf_8_aw(void) { m68ki_write_8(EA_AW_8(), 0); } static void m68k_op_sf_8_al(void) { m68ki_write_8(EA_AL_8(), 0); } static void m68k_op_shi_8_d(void) { if(COND_HI()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_sls_8_d(void) { if(COND_LS()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_scc_8_d(void) { if(COND_CC()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_scs_8_d(void) { if(COND_CS()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_sne_8_d(void) { if(COND_NE()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_seq_8_d(void) { if(COND_EQ()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_svc_8_d(void) { if(COND_VC()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_svs_8_d(void) { if(COND_VS()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_spl_8_d(void) { if(COND_PL()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_smi_8_d(void) { if(COND_MI()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_sge_8_d(void) { if(COND_GE()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_slt_8_d(void) { if(COND_LT()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_sgt_8_d(void) { if(COND_GT()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_sle_8_d(void) { if(COND_LE()) { DY |= 0xff; USE_CYCLES(CYC_SCC_R_TRUE); return; } DY &= 0xffffff00; } static void m68k_op_shi_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_HI() ? 0xff : 0); } static void m68k_op_shi_8_al(void) { m68ki_write_8(EA_AL_8(), COND_HI() ? 0xff : 0); } static void m68k_op_sls_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_LS() ? 0xff : 0); } static void m68k_op_sls_8_al(void) { m68ki_write_8(EA_AL_8(), COND_LS() ? 0xff : 0); } static void m68k_op_scc_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scc_8_al(void) { m68ki_write_8(EA_AL_8(), COND_CC() ? 0xff : 0); } static void m68k_op_scs_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_CS() ? 0xff : 0); } static void m68k_op_scs_8_al(void) { m68ki_write_8(EA_AL_8(), COND_CS() ? 0xff : 0); } static void m68k_op_sne_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_NE() ? 0xff : 0); } static void m68k_op_sne_8_al(void) { m68ki_write_8(EA_AL_8(), COND_NE() ? 0xff : 0); } static void m68k_op_seq_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_seq_8_al(void) { m68ki_write_8(EA_AL_8(), COND_EQ() ? 0xff : 0); } static void m68k_op_svc_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svc_8_al(void) { m68ki_write_8(EA_AL_8(), COND_VC() ? 0xff : 0); } static void m68k_op_svs_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_VS() ? 0xff : 0); } static void m68k_op_svs_8_al(void) { m68ki_write_8(EA_AL_8(), COND_VS() ? 0xff : 0); } static void m68k_op_spl_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_PL() ? 0xff : 0); } static void m68k_op_spl_8_al(void) { m68ki_write_8(EA_AL_8(), COND_PL() ? 0xff : 0); } static void m68k_op_smi_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_MI() ? 0xff : 0); } static void m68k_op_smi_8_al(void) { m68ki_write_8(EA_AL_8(), COND_MI() ? 0xff : 0); } static void m68k_op_sge_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_GE() ? 0xff : 0); } static void m68k_op_sge_8_al(void) { m68ki_write_8(EA_AL_8(), COND_GE() ? 0xff : 0); } static void m68k_op_slt_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_LT() ? 0xff : 0); } static void m68k_op_slt_8_al(void) { m68ki_write_8(EA_AL_8(), COND_LT() ? 0xff : 0); } static void m68k_op_sgt_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sgt_8_al(void) { m68ki_write_8(EA_AL_8(), COND_GT() ? 0xff : 0); } static void m68k_op_sle_8_ai(void) { m68ki_write_8(EA_AY_AI_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_pi(void) { m68ki_write_8(EA_AY_PI_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_pi7(void) { m68ki_write_8(EA_A7_PI_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_pd(void) { m68ki_write_8(EA_AY_PD_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_pd7(void) { m68ki_write_8(EA_A7_PD_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_di(void) { m68ki_write_8(EA_AY_DI_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_ix(void) { m68ki_write_8(EA_AY_IX_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_aw(void) { m68ki_write_8(EA_AW_8(), COND_LE() ? 0xff : 0); } static void m68k_op_sle_8_al(void) { m68ki_write_8(EA_AL_8(), COND_LE() ? 0xff : 0); } static void m68k_op_stop(void) { if(FLAG_S) { uint new_sr = OPER_I_16(); CPU_STOPPED |= STOP_LEVEL_STOP; m68ki_set_sr(new_sr); SET_CYCLES(m68ki_cpu.cycle_end - 4*MUL); return; } m68ki_exception_privilege_violation(); } static void m68k_op_sub_8_er_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_8(DY); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pi7(void) { uint* r_dst = &DX; uint src = OPER_A7_PI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pd7(void) { uint* r_dst = &DX; uint src = OPER_A7_PD_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_8_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_8(res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_d(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_a(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(AY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_16_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_16(res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_sub_32_er_d(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_a(void) { uint* r_dst = &DX; uint src = AY; uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_ai(void) { uint* r_dst = &DX; uint src = OPER_AY_AI_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_pi(void) { uint* r_dst = &DX; uint src = OPER_AY_PI_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_pd(void) { uint* r_dst = &DX; uint src = OPER_AY_PD_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_di(void) { uint* r_dst = &DX; uint src = OPER_AY_DI_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_ix(void) { uint* r_dst = &DX; uint src = OPER_AY_IX_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_aw(void) { uint* r_dst = &DX; uint src = OPER_AW_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_al(void) { uint* r_dst = &DX; uint src = OPER_AL_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_pcdi(void) { uint* r_dst = &DX; uint src = OPER_PCDI_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_pcix(void) { uint* r_dst = &DX; uint src = OPER_PCIX_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_32_er_i(void) { uint* r_dst = &DX; uint src = OPER_I_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); FLAG_Z = MASK_OUT_ABOVE_32(res); *r_dst = FLAG_Z; } static void m68k_op_sub_8_re_ai(void) { uint ea = EA_AY_AI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_pi(void) { uint ea = EA_AY_PI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_pi7(void) { uint ea = EA_A7_PI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_pd(void) { uint ea = EA_AY_PD_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_pd7(void) { uint ea = EA_A7_PD_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_di(void) { uint ea = EA_AY_DI_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_ix(void) { uint ea = EA_AY_IX_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_aw(void) { uint ea = EA_AW_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_8_re_al(void) { uint ea = EA_AL_8(); uint src = MASK_OUT_ABOVE_8(DX); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_sub_16_re_ai(void) { uint ea = EA_AY_AI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_pi(void) { uint ea = EA_AY_PI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_pd(void) { uint ea = EA_AY_PD_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_di(void) { uint ea = EA_AY_DI_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_ix(void) { uint ea = EA_AY_IX_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_aw(void) { uint ea = EA_AW_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_16_re_al(void) { uint ea = EA_AL_16(); uint src = MASK_OUT_ABOVE_16(DX); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_sub_32_re_ai(void) { uint ea = EA_AY_AI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_pi(void) { uint ea = EA_AY_PI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_pd(void) { uint ea = EA_AY_PD_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_di(void) { uint ea = EA_AY_DI_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_ix(void) { uint ea = EA_AY_IX_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_aw(void) { uint ea = EA_AW_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_sub_32_re_al(void) { uint ea = EA_AL_32(); uint src = DX; uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_suba_16_d(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY)); } static void m68k_op_suba_16_a(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY)); } static void m68k_op_suba_16_ai(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_AI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_pi(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_PI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_pd(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_PD_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_di(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_DI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_ix(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AY_IX_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_aw(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AW_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_al(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_AL_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_pcdi(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_PCDI_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_pcix(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_PCIX_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_16_i(void) { uint* r_dst = &AX; uint src = MAKE_INT_16(OPER_I_16()); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_d(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY); } static void m68k_op_suba_32_a(void) { uint* r_dst = &AX; *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY); } static void m68k_op_suba_32_ai(void) { uint* r_dst = &AX; uint src = OPER_AY_AI_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_pi(void) { uint* r_dst = &AX; uint src = OPER_AY_PI_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_pd(void) { uint* r_dst = &AX; uint src = OPER_AY_PD_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_di(void) { uint* r_dst = &AX; uint src = OPER_AY_DI_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_ix(void) { uint* r_dst = &AX; uint src = OPER_AY_IX_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_aw(void) { uint* r_dst = &AX; uint src = OPER_AW_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_al(void) { uint* r_dst = &AX; uint src = OPER_AL_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_pcdi(void) { uint* r_dst = &AX; uint src = OPER_PCDI_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_pcix(void) { uint* r_dst = &AX; uint src = OPER_PCIX_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_suba_32_i(void) { uint* r_dst = &AX; uint src = OPER_I_32(); *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); } static void m68k_op_subi_8_d(void) { uint* r_dst = &DY; uint src = OPER_I_8(); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_subi_8_ai(void) { uint src = OPER_I_8(); uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_pi(void) { uint src = OPER_I_8(); uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_pi7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_pd(void) { uint src = OPER_I_8(); uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_pd7(void) { uint src = OPER_I_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_di(void) { uint src = OPER_I_8(); uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_ix(void) { uint src = OPER_I_8(); uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_aw(void) { uint src = OPER_I_8(); uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_8_al(void) { uint src = OPER_I_8(); uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subi_16_d(void) { uint* r_dst = &DY; uint src = OPER_I_16(); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_subi_16_ai(void) { uint src = OPER_I_16(); uint ea = EA_AY_AI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_pi(void) { uint src = OPER_I_16(); uint ea = EA_AY_PI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_pd(void) { uint src = OPER_I_16(); uint ea = EA_AY_PD_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_di(void) { uint src = OPER_I_16(); uint ea = EA_AY_DI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_ix(void) { uint src = OPER_I_16(); uint ea = EA_AY_IX_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_aw(void) { uint src = OPER_I_16(); uint ea = EA_AW_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_16_al(void) { uint src = OPER_I_16(); uint ea = EA_AL_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subi_32_d(void) { uint* r_dst = &DY; uint src = OPER_I_32(); uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); *r_dst = FLAG_Z; } static void m68k_op_subi_32_ai(void) { uint src = OPER_I_32(); uint ea = EA_AY_AI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_pi(void) { uint src = OPER_I_32(); uint ea = EA_AY_PI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_pd(void) { uint src = OPER_I_32(); uint ea = EA_AY_PD_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_di(void) { uint src = OPER_I_32(); uint ea = EA_AY_DI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_ix(void) { uint src = OPER_I_32(); uint ea = EA_AY_IX_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_aw(void) { uint src = OPER_I_32(); uint ea = EA_AW_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subi_32_al(void) { uint src = OPER_I_32(); uint ea = EA_AL_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_8_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z; } static void m68k_op_subq_8_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_pi7(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_pd7(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_8_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); uint res = dst - src; FLAG_N = NFLAG_8(res); FLAG_Z = MASK_OUT_ABOVE_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); m68ki_write_8(ea, FLAG_Z); } static void m68k_op_subq_16_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z; } static void m68k_op_subq_16_a(void) { uint* r_dst = &AY; *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); } static void m68k_op_subq_16_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_16_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_16(); uint dst = m68ki_read_16(ea); uint res = dst - src; FLAG_N = NFLAG_16(res); FLAG_Z = MASK_OUT_ABOVE_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); m68ki_write_16(ea, FLAG_Z); } static void m68k_op_subq_32_d(void) { uint* r_dst = &DY; uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint dst = *r_dst; uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); *r_dst = FLAG_Z; } static void m68k_op_subq_32_a(void) { uint* r_dst = &AY; *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1)); } static void m68k_op_subq_32_ai(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_AI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_pi(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_pd(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_PD_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_di(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_DI_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_ix(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AY_IX_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_aw(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AW_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subq_32_al(void) { uint src = (((REG_IR >> 9) - 1) & 7) + 1; uint ea = EA_AL_32(); uint dst = m68ki_read_32(ea); uint res = dst - src; FLAG_N = NFLAG_32(res); FLAG_Z = MASK_OUT_ABOVE_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); m68ki_write_32(ea, FLAG_Z); } static void m68k_op_subx_8_rr(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_8(DY); uint dst = MASK_OUT_ABOVE_8(*r_dst); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; } static void m68k_op_subx_16_rr(void) { uint* r_dst = &DX; uint src = MASK_OUT_ABOVE_16(DY); uint dst = MASK_OUT_ABOVE_16(*r_dst); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; } static void m68k_op_subx_32_rr(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; *r_dst = res; } static void m68k_op_subx_8_mm_ax7(void) { uint src = OPER_AY_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_subx_8_mm_ay7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_subx_8_mm_axy7(void) { uint src = OPER_A7_PD_8(); uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_subx_8_mm(void) { uint src = OPER_AY_PD_8(); uint ea = EA_AX_PD_8(); uint dst = m68ki_read_8(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_8(res); FLAG_X = FLAG_C = CFLAG_8(res); FLAG_V = VFLAG_SUB_8(src, dst, res); res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; m68ki_write_8(ea, res); } static void m68k_op_subx_16_mm(void) { uint src = OPER_AY_PD_16(); uint ea = EA_AX_PD_16(); uint dst = m68ki_read_16(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_16(res); FLAG_X = FLAG_C = CFLAG_16(res); FLAG_V = VFLAG_SUB_16(src, dst, res); res = MASK_OUT_ABOVE_16(res); FLAG_Z |= res; m68ki_write_16(ea, res); } static void m68k_op_subx_32_mm(void) { uint src = OPER_AY_PD_32(); uint ea = EA_AX_PD_32(); uint dst = m68ki_read_32(ea); uint res = dst - src - XFLAG_AS_1(); FLAG_N = NFLAG_32(res); FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res); FLAG_V = VFLAG_SUB_32(src, dst, res); res = MASK_OUT_ABOVE_32(res); FLAG_Z |= res; m68ki_write_32(ea, res); } static void m68k_op_swap_32(void) { uint* r_dst = &DY; FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16); *r_dst = (*r_dst>>16) | FLAG_Z; FLAG_Z = *r_dst; FLAG_N = NFLAG_32(*r_dst); FLAG_C = CFLAG_CLEAR; FLAG_V = VFLAG_CLEAR; } static void m68k_op_tas_8_d(void) { uint* r_dst = &DY; FLAG_Z = MASK_OUT_ABOVE_8(*r_dst); FLAG_N = NFLAG_8(*r_dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; *r_dst |= 0x80; } static void m68k_op_tas_8_ai(void) { uint ea = EA_AY_AI_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_pi(void) { uint ea = EA_AY_PI_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_pi7(void) { uint ea = EA_A7_PI_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_pd(void) { uint ea = EA_AY_PD_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_pd7(void) { uint ea = EA_A7_PD_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_di(void) { uint ea = EA_AY_DI_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_ix(void) { uint ea = EA_AY_IX_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_aw(void) { uint ea = EA_AW_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_tas_8_al(void) { uint ea = EA_AL_8(); uint dst = m68ki_read_8(ea); FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback disabled in order to function properly. Some Amiga software may also rely on this, but only when accessing specific addresses so additional functionality will be needed. */ if (m68ki_tas_callback()) m68ki_write_8(ea, dst | 0x80); } static void m68k_op_trap(void) { /* Trap#n stacks exception frame type 0 */ m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */ } static void m68k_op_trapv(void) { if(COND_VC()) { return; } m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */ } static void m68k_op_tst_8_d(void) { uint res = MASK_OUT_ABOVE_8(DY); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_ai(void) { uint res = OPER_AY_AI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_pi(void) { uint res = OPER_AY_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_pi7(void) { uint res = OPER_A7_PI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_pd(void) { uint res = OPER_AY_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_pd7(void) { uint res = OPER_A7_PD_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_di(void) { uint res = OPER_AY_DI_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_ix(void) { uint res = OPER_AY_IX_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_aw(void) { uint res = OPER_AW_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_8_al(void) { uint res = OPER_AL_8(); FLAG_N = NFLAG_8(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_d(void) { uint res = MASK_OUT_ABOVE_16(DY); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_ai(void) { uint res = OPER_AY_AI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_pi(void) { uint res = OPER_AY_PI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_pd(void) { uint res = OPER_AY_PD_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_di(void) { uint res = OPER_AY_DI_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_ix(void) { uint res = OPER_AY_IX_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_aw(void) { uint res = OPER_AW_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_16_al(void) { uint res = OPER_AL_16(); FLAG_N = NFLAG_16(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_d(void) { uint res = DY; FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_ai(void) { uint res = OPER_AY_AI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_pi(void) { uint res = OPER_AY_PI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_pd(void) { uint res = OPER_AY_PD_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_di(void) { uint res = OPER_AY_DI_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_ix(void) { uint res = OPER_AY_IX_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_aw(void) { uint res = OPER_AW_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_tst_32_al(void) { uint res = OPER_AL_32(); FLAG_N = NFLAG_32(res); FLAG_Z = res; FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; } static void m68k_op_unlk_32_a7(void) { REG_A[7] = m68ki_read_32(REG_A[7]); } static void m68k_op_unlk_32(void) { uint* r_dst = &AY; REG_A[7] = *r_dst; *r_dst = m68ki_pull_32(); } /* ======================================================================== */ /* ========================= OPCODE TABLE BUILDER ========================= */ /* ======================================================================== */ #ifndef BUILD_TABLES #include "m68ki_instruction_jump_table.h" #else /* This is used to generate the opcode handler jump table */ typedef struct { void (*opcode_handler)(void); /* handler function */ unsigned int mask; /* mask on opcode */ unsigned int match; /* what to match after masking */ unsigned char cycles; /* cycles each cpu type takes */ } opcode_handler_struct; /* opcode handler jump table */ static void (*m68ki_instruction_jump_table[0x10000])(void); /* Opcode handler table */ static const opcode_handler_struct m68k_opcode_handler_table[] = { /* function mask match cyc */ {m68k_op_1010 , 0xf000, 0xa000, 4}, {m68k_op_1111 , 0xf000, 0xf000, 4}, {m68k_op_moveq_32 , 0xf100, 0x7000, 4}, {m68k_op_bra_8 , 0xff00, 0x6000, 10}, {m68k_op_bsr_8 , 0xff00, 0x6100, 18}, {m68k_op_bhi_8 , 0xff00, 0x6200, 10}, {m68k_op_bls_8 , 0xff00, 0x6300, 10}, {m68k_op_bcc_8 , 0xff00, 0x6400, 10}, {m68k_op_bcs_8 , 0xff00, 0x6500, 10}, {m68k_op_bne_8 , 0xff00, 0x6600, 10}, {m68k_op_beq_8 , 0xff00, 0x6700, 10}, {m68k_op_bvc_8 , 0xff00, 0x6800, 10}, {m68k_op_bvs_8 , 0xff00, 0x6900, 10}, {m68k_op_bpl_8 , 0xff00, 0x6a00, 10}, {m68k_op_bmi_8 , 0xff00, 0x6b00, 10}, {m68k_op_bge_8 , 0xff00, 0x6c00, 10}, {m68k_op_blt_8 , 0xff00, 0x6d00, 10}, {m68k_op_bgt_8 , 0xff00, 0x6e00, 10}, {m68k_op_ble_8 , 0xff00, 0x6f00, 10}, {m68k_op_btst_32_r_d , 0xf1f8, 0x0100, 6}, {m68k_op_movep_16_er , 0xf1f8, 0x0108, 16}, {m68k_op_btst_8_r_ai , 0xf1f8, 0x0110, 8}, {m68k_op_btst_8_r_pi , 0xf1f8, 0x0118, 8}, {m68k_op_btst_8_r_pd , 0xf1f8, 0x0120, 10}, {m68k_op_btst_8_r_di , 0xf1f8, 0x0128, 12}, {m68k_op_btst_8_r_ix , 0xf1f8, 0x0130, 14}, {m68k_op_bchg_32_r_d , 0xf1f8, 0x0140, 8}, {m68k_op_movep_32_er , 0xf1f8, 0x0148, 24}, {m68k_op_bchg_8_r_ai , 0xf1f8, 0x0150, 12}, {m68k_op_bchg_8_r_pi , 0xf1f8, 0x0158, 12}, {m68k_op_bchg_8_r_pd , 0xf1f8, 0x0160, 14}, {m68k_op_bchg_8_r_di , 0xf1f8, 0x0168, 16}, {m68k_op_bchg_8_r_ix , 0xf1f8, 0x0170, 18}, {m68k_op_bclr_32_r_d , 0xf1f8, 0x0180, 10}, {m68k_op_movep_16_re , 0xf1f8, 0x0188, 16}, {m68k_op_bclr_8_r_ai , 0xf1f8, 0x0190, 12}, {m68k_op_bclr_8_r_pi , 0xf1f8, 0x0198, 12}, {m68k_op_bclr_8_r_pd , 0xf1f8, 0x01a0, 14}, {m68k_op_bclr_8_r_di , 0xf1f8, 0x01a8, 16}, {m68k_op_bclr_8_r_ix , 0xf1f8, 0x01b0, 18}, {m68k_op_bset_32_r_d , 0xf1f8, 0x01c0, 8}, {m68k_op_movep_32_re , 0xf1f8, 0x01c8, 24}, {m68k_op_bset_8_r_ai , 0xf1f8, 0x01d0, 12}, {m68k_op_bset_8_r_pi , 0xf1f8, 0x01d8, 12}, {m68k_op_bset_8_r_pd , 0xf1f8, 0x01e0, 14}, {m68k_op_bset_8_r_di , 0xf1f8, 0x01e8, 16}, {m68k_op_bset_8_r_ix , 0xf1f8, 0x01f0, 18}, {m68k_op_move_8_d_d , 0xf1f8, 0x1000, 4}, {m68k_op_move_8_d_ai , 0xf1f8, 0x1010, 8}, {m68k_op_move_8_d_pi , 0xf1f8, 0x1018, 8}, {m68k_op_move_8_d_pd , 0xf1f8, 0x1020, 10}, {m68k_op_move_8_d_di , 0xf1f8, 0x1028, 12}, {m68k_op_move_8_d_ix , 0xf1f8, 0x1030, 14}, {m68k_op_move_8_ai_d , 0xf1f8, 0x1080, 8}, {m68k_op_move_8_ai_ai , 0xf1f8, 0x1090, 12}, {m68k_op_move_8_ai_pi , 0xf1f8, 0x1098, 12}, {m68k_op_move_8_ai_pd , 0xf1f8, 0x10a0, 14}, {m68k_op_move_8_ai_di , 0xf1f8, 0x10a8, 16}, {m68k_op_move_8_ai_ix , 0xf1f8, 0x10b0, 18}, {m68k_op_move_8_pi_d , 0xf1f8, 0x10c0, 8}, {m68k_op_move_8_pi_ai , 0xf1f8, 0x10d0, 12}, {m68k_op_move_8_pi_pi , 0xf1f8, 0x10d8, 12}, {m68k_op_move_8_pi_pd , 0xf1f8, 0x10e0, 14}, {m68k_op_move_8_pi_di , 0xf1f8, 0x10e8, 16}, {m68k_op_move_8_pi_ix , 0xf1f8, 0x10f0, 18}, {m68k_op_move_8_pd_d , 0xf1f8, 0x1100, 8}, {m68k_op_move_8_pd_ai , 0xf1f8, 0x1110, 12}, {m68k_op_move_8_pd_pi , 0xf1f8, 0x1118, 12}, {m68k_op_move_8_pd_pd , 0xf1f8, 0x1120, 14}, {m68k_op_move_8_pd_di , 0xf1f8, 0x1128, 16}, {m68k_op_move_8_pd_ix , 0xf1f8, 0x1130, 18}, {m68k_op_move_8_di_d , 0xf1f8, 0x1140, 12}, {m68k_op_move_8_di_ai , 0xf1f8, 0x1150, 16}, {m68k_op_move_8_di_pi , 0xf1f8, 0x1158, 16}, {m68k_op_move_8_di_pd , 0xf1f8, 0x1160, 18}, {m68k_op_move_8_di_di , 0xf1f8, 0x1168, 20}, {m68k_op_move_8_di_ix , 0xf1f8, 0x1170, 22}, {m68k_op_move_8_ix_d , 0xf1f8, 0x1180, 14}, {m68k_op_move_8_ix_ai , 0xf1f8, 0x1190, 18}, {m68k_op_move_8_ix_pi , 0xf1f8, 0x1198, 18}, {m68k_op_move_8_ix_pd , 0xf1f8, 0x11a0, 20}, {m68k_op_move_8_ix_di , 0xf1f8, 0x11a8, 22}, {m68k_op_move_8_ix_ix , 0xf1f8, 0x11b0, 24}, {m68k_op_move_32_d_d , 0xf1f8, 0x2000, 4}, {m68k_op_move_32_d_a , 0xf1f8, 0x2008, 4}, {m68k_op_move_32_d_ai , 0xf1f8, 0x2010, 12}, {m68k_op_move_32_d_pi , 0xf1f8, 0x2018, 12}, {m68k_op_move_32_d_pd , 0xf1f8, 0x2020, 14}, {m68k_op_move_32_d_di , 0xf1f8, 0x2028, 16}, {m68k_op_move_32_d_ix , 0xf1f8, 0x2030, 18}, {m68k_op_movea_32_d , 0xf1f8, 0x2040, 4}, {m68k_op_movea_32_a , 0xf1f8, 0x2048, 4}, {m68k_op_movea_32_ai , 0xf1f8, 0x2050, 12}, {m68k_op_movea_32_pi , 0xf1f8, 0x2058, 12}, {m68k_op_movea_32_pd , 0xf1f8, 0x2060, 14}, {m68k_op_movea_32_di , 0xf1f8, 0x2068, 16}, {m68k_op_movea_32_ix , 0xf1f8, 0x2070, 18}, {m68k_op_move_32_ai_d , 0xf1f8, 0x2080, 12}, {m68k_op_move_32_ai_a , 0xf1f8, 0x2088, 12}, {m68k_op_move_32_ai_ai , 0xf1f8, 0x2090, 20}, {m68k_op_move_32_ai_pi , 0xf1f8, 0x2098, 20}, {m68k_op_move_32_ai_pd , 0xf1f8, 0x20a0, 22}, {m68k_op_move_32_ai_di , 0xf1f8, 0x20a8, 24}, {m68k_op_move_32_ai_ix , 0xf1f8, 0x20b0, 26}, {m68k_op_move_32_pi_d , 0xf1f8, 0x20c0, 12}, {m68k_op_move_32_pi_a , 0xf1f8, 0x20c8, 12}, {m68k_op_move_32_pi_ai , 0xf1f8, 0x20d0, 20}, {m68k_op_move_32_pi_pi , 0xf1f8, 0x20d8, 20}, {m68k_op_move_32_pi_pd , 0xf1f8, 0x20e0, 22}, {m68k_op_move_32_pi_di , 0xf1f8, 0x20e8, 24}, {m68k_op_move_32_pi_ix , 0xf1f8, 0x20f0, 26}, {m68k_op_move_32_pd_d , 0xf1f8, 0x2100, 12}, {m68k_op_move_32_pd_a , 0xf1f8, 0x2108, 12}, {m68k_op_move_32_pd_ai , 0xf1f8, 0x2110, 20}, {m68k_op_move_32_pd_pi , 0xf1f8, 0x2118, 20}, {m68k_op_move_32_pd_pd , 0xf1f8, 0x2120, 22}, {m68k_op_move_32_pd_di , 0xf1f8, 0x2128, 24}, {m68k_op_move_32_pd_ix , 0xf1f8, 0x2130, 26}, {m68k_op_move_32_di_d , 0xf1f8, 0x2140, 16}, {m68k_op_move_32_di_a , 0xf1f8, 0x2148, 16}, {m68k_op_move_32_di_ai , 0xf1f8, 0x2150, 24}, {m68k_op_move_32_di_pi , 0xf1f8, 0x2158, 24}, {m68k_op_move_32_di_pd , 0xf1f8, 0x2160, 26}, {m68k_op_move_32_di_di , 0xf1f8, 0x2168, 28}, {m68k_op_move_32_di_ix , 0xf1f8, 0x2170, 30}, {m68k_op_move_32_ix_d , 0xf1f8, 0x2180, 18}, {m68k_op_move_32_ix_a , 0xf1f8, 0x2188, 18}, {m68k_op_move_32_ix_ai , 0xf1f8, 0x2190, 26}, {m68k_op_move_32_ix_pi , 0xf1f8, 0x2198, 26}, {m68k_op_move_32_ix_pd , 0xf1f8, 0x21a0, 28}, {m68k_op_move_32_ix_di , 0xf1f8, 0x21a8, 30}, {m68k_op_move_32_ix_ix , 0xf1f8, 0x21b0, 32}, {m68k_op_move_16_d_d , 0xf1f8, 0x3000, 4}, {m68k_op_move_16_d_a , 0xf1f8, 0x3008, 4}, {m68k_op_move_16_d_ai , 0xf1f8, 0x3010, 8}, {m68k_op_move_16_d_pi , 0xf1f8, 0x3018, 8}, {m68k_op_move_16_d_pd , 0xf1f8, 0x3020, 10}, {m68k_op_move_16_d_di , 0xf1f8, 0x3028, 12}, {m68k_op_move_16_d_ix , 0xf1f8, 0x3030, 14}, {m68k_op_movea_16_d , 0xf1f8, 0x3040, 4}, {m68k_op_movea_16_a , 0xf1f8, 0x3048, 4}, {m68k_op_movea_16_ai , 0xf1f8, 0x3050, 8}, {m68k_op_movea_16_pi , 0xf1f8, 0x3058, 8}, {m68k_op_movea_16_pd , 0xf1f8, 0x3060, 10}, {m68k_op_movea_16_di , 0xf1f8, 0x3068, 12}, {m68k_op_movea_16_ix , 0xf1f8, 0x3070, 14}, {m68k_op_move_16_ai_d , 0xf1f8, 0x3080, 8}, {m68k_op_move_16_ai_a , 0xf1f8, 0x3088, 8}, {m68k_op_move_16_ai_ai , 0xf1f8, 0x3090, 12}, {m68k_op_move_16_ai_pi , 0xf1f8, 0x3098, 12}, {m68k_op_move_16_ai_pd , 0xf1f8, 0x30a0, 14}, {m68k_op_move_16_ai_di , 0xf1f8, 0x30a8, 16}, {m68k_op_move_16_ai_ix , 0xf1f8, 0x30b0, 18}, {m68k_op_move_16_pi_d , 0xf1f8, 0x30c0, 8}, {m68k_op_move_16_pi_a , 0xf1f8, 0x30c8, 8}, {m68k_op_move_16_pi_ai , 0xf1f8, 0x30d0, 12}, {m68k_op_move_16_pi_pi , 0xf1f8, 0x30d8, 12}, {m68k_op_move_16_pi_pd , 0xf1f8, 0x30e0, 14}, {m68k_op_move_16_pi_di , 0xf1f8, 0x30e8, 16}, {m68k_op_move_16_pi_ix , 0xf1f8, 0x30f0, 18}, {m68k_op_move_16_pd_d , 0xf1f8, 0x3100, 8}, {m68k_op_move_16_pd_a , 0xf1f8, 0x3108, 8}, {m68k_op_move_16_pd_ai , 0xf1f8, 0x3110, 12}, {m68k_op_move_16_pd_pi , 0xf1f8, 0x3118, 12}, {m68k_op_move_16_pd_pd , 0xf1f8, 0x3120, 14}, {m68k_op_move_16_pd_di , 0xf1f8, 0x3128, 16}, {m68k_op_move_16_pd_ix , 0xf1f8, 0x3130, 18}, {m68k_op_move_16_di_d , 0xf1f8, 0x3140, 12}, {m68k_op_move_16_di_a , 0xf1f8, 0x3148, 12}, {m68k_op_move_16_di_ai , 0xf1f8, 0x3150, 16}, {m68k_op_move_16_di_pi , 0xf1f8, 0x3158, 16}, {m68k_op_move_16_di_pd , 0xf1f8, 0x3160, 18}, {m68k_op_move_16_di_di , 0xf1f8, 0x3168, 20}, {m68k_op_move_16_di_ix , 0xf1f8, 0x3170, 22}, {m68k_op_move_16_ix_d , 0xf1f8, 0x3180, 14}, {m68k_op_move_16_ix_a , 0xf1f8, 0x3188, 14}, {m68k_op_move_16_ix_ai , 0xf1f8, 0x3190, 18}, {m68k_op_move_16_ix_pi , 0xf1f8, 0x3198, 18}, {m68k_op_move_16_ix_pd , 0xf1f8, 0x31a0, 20}, {m68k_op_move_16_ix_di , 0xf1f8, 0x31a8, 22}, {m68k_op_move_16_ix_ix , 0xf1f8, 0x31b0, 24}, {m68k_op_chk_16_d , 0xf1f8, 0x4180, 10}, {m68k_op_chk_16_ai , 0xf1f8, 0x4190, 14}, {m68k_op_chk_16_pi , 0xf1f8, 0x4198, 14}, {m68k_op_chk_16_pd , 0xf1f8, 0x41a0, 16}, {m68k_op_chk_16_di , 0xf1f8, 0x41a8, 18}, {m68k_op_chk_16_ix , 0xf1f8, 0x41b0, 20}, {m68k_op_lea_32_ai , 0xf1f8, 0x41d0, 4}, {m68k_op_lea_32_di , 0xf1f8, 0x41e8, 8}, {m68k_op_lea_32_ix , 0xf1f8, 0x41f0, 12}, {m68k_op_addq_8_d , 0xf1f8, 0x5000, 4}, {m68k_op_addq_8_ai , 0xf1f8, 0x5010, 12}, {m68k_op_addq_8_pi , 0xf1f8, 0x5018, 12}, {m68k_op_addq_8_pd , 0xf1f8, 0x5020, 14}, {m68k_op_addq_8_di , 0xf1f8, 0x5028, 16}, {m68k_op_addq_8_ix , 0xf1f8, 0x5030, 18}, {m68k_op_addq_16_d , 0xf1f8, 0x5040, 4}, {m68k_op_addq_16_a , 0xf1f8, 0x5048, 4}, {m68k_op_addq_16_ai , 0xf1f8, 0x5050, 12}, {m68k_op_addq_16_pi , 0xf1f8, 0x5058, 12}, {m68k_op_addq_16_pd , 0xf1f8, 0x5060, 14}, {m68k_op_addq_16_di , 0xf1f8, 0x5068, 16}, {m68k_op_addq_16_ix , 0xf1f8, 0x5070, 18}, {m68k_op_addq_32_d , 0xf1f8, 0x5080, 8}, {m68k_op_addq_32_a , 0xf1f8, 0x5088, 8}, {m68k_op_addq_32_ai , 0xf1f8, 0x5090, 20}, {m68k_op_addq_32_pi , 0xf1f8, 0x5098, 20}, {m68k_op_addq_32_pd , 0xf1f8, 0x50a0, 22}, {m68k_op_addq_32_di , 0xf1f8, 0x50a8, 24}, {m68k_op_addq_32_ix , 0xf1f8, 0x50b0, 26}, {m68k_op_subq_8_d , 0xf1f8, 0x5100, 4}, {m68k_op_subq_8_ai , 0xf1f8, 0x5110, 12}, {m68k_op_subq_8_pi , 0xf1f8, 0x5118, 12}, {m68k_op_subq_8_pd , 0xf1f8, 0x5120, 14}, {m68k_op_subq_8_di , 0xf1f8, 0x5128, 16}, {m68k_op_subq_8_ix , 0xf1f8, 0x5130, 18}, {m68k_op_subq_16_d , 0xf1f8, 0x5140, 4}, {m68k_op_subq_16_a , 0xf1f8, 0x5148, 8}, {m68k_op_subq_16_ai , 0xf1f8, 0x5150, 12}, {m68k_op_subq_16_pi , 0xf1f8, 0x5158, 12}, {m68k_op_subq_16_pd , 0xf1f8, 0x5160, 14}, {m68k_op_subq_16_di , 0xf1f8, 0x5168, 16}, {m68k_op_subq_16_ix , 0xf1f8, 0x5170, 18}, {m68k_op_subq_32_d , 0xf1f8, 0x5180, 8}, {m68k_op_subq_32_a , 0xf1f8, 0x5188, 8}, {m68k_op_subq_32_ai , 0xf1f8, 0x5190, 20}, {m68k_op_subq_32_pi , 0xf1f8, 0x5198, 20}, {m68k_op_subq_32_pd , 0xf1f8, 0x51a0, 22}, {m68k_op_subq_32_di , 0xf1f8, 0x51a8, 24}, {m68k_op_subq_32_ix , 0xf1f8, 0x51b0, 26}, {m68k_op_or_8_er_d , 0xf1f8, 0x8000, 4}, {m68k_op_or_8_er_ai , 0xf1f8, 0x8010, 8}, {m68k_op_or_8_er_pi , 0xf1f8, 0x8018, 8}, {m68k_op_or_8_er_pd , 0xf1f8, 0x8020, 10}, {m68k_op_or_8_er_di , 0xf1f8, 0x8028, 12}, {m68k_op_or_8_er_ix , 0xf1f8, 0x8030, 14}, {m68k_op_or_16_er_d , 0xf1f8, 0x8040, 4}, {m68k_op_or_16_er_ai , 0xf1f8, 0x8050, 8}, {m68k_op_or_16_er_pi , 0xf1f8, 0x8058, 8}, {m68k_op_or_16_er_pd , 0xf1f8, 0x8060, 10}, {m68k_op_or_16_er_di , 0xf1f8, 0x8068, 12}, {m68k_op_or_16_er_ix , 0xf1f8, 0x8070, 14}, {m68k_op_or_32_er_d , 0xf1f8, 0x8080, 8}, {m68k_op_or_32_er_ai , 0xf1f8, 0x8090, 14}, {m68k_op_or_32_er_pi , 0xf1f8, 0x8098, 14}, {m68k_op_or_32_er_pd , 0xf1f8, 0x80a0, 16}, {m68k_op_or_32_er_di , 0xf1f8, 0x80a8, 18}, {m68k_op_or_32_er_ix , 0xf1f8, 0x80b0, 20}, {m68k_op_divu_16_d , 0xf1f8, 0x80c0, 0}, {m68k_op_divu_16_ai , 0xf1f8, 0x80d0, 4}, {m68k_op_divu_16_pi , 0xf1f8, 0x80d8, 4}, {m68k_op_divu_16_pd , 0xf1f8, 0x80e0, 6}, {m68k_op_divu_16_di , 0xf1f8, 0x80e8, 8}, {m68k_op_divu_16_ix , 0xf1f8, 0x80f0, 10}, {m68k_op_sbcd_8_rr , 0xf1f8, 0x8100, 6}, {m68k_op_sbcd_8_mm , 0xf1f8, 0x8108, 18}, {m68k_op_or_8_re_ai , 0xf1f8, 0x8110, 12}, {m68k_op_or_8_re_pi , 0xf1f8, 0x8118, 12}, {m68k_op_or_8_re_pd , 0xf1f8, 0x8120, 14}, {m68k_op_or_8_re_di , 0xf1f8, 0x8128, 16}, {m68k_op_or_8_re_ix , 0xf1f8, 0x8130, 18}, {m68k_op_or_16_re_ai , 0xf1f8, 0x8150, 12}, {m68k_op_or_16_re_pi , 0xf1f8, 0x8158, 12}, {m68k_op_or_16_re_pd , 0xf1f8, 0x8160, 14}, {m68k_op_or_16_re_di , 0xf1f8, 0x8168, 16}, {m68k_op_or_16_re_ix , 0xf1f8, 0x8170, 18}, {m68k_op_or_32_re_ai , 0xf1f8, 0x8190, 20}, {m68k_op_or_32_re_pi , 0xf1f8, 0x8198, 20}, {m68k_op_or_32_re_pd , 0xf1f8, 0x81a0, 22}, {m68k_op_or_32_re_di , 0xf1f8, 0x81a8, 24}, {m68k_op_or_32_re_ix , 0xf1f8, 0x81b0, 26}, {m68k_op_divs_16_d , 0xf1f8, 0x81c0, 0}, {m68k_op_divs_16_ai , 0xf1f8, 0x81d0, 4}, {m68k_op_divs_16_pi , 0xf1f8, 0x81d8, 4}, {m68k_op_divs_16_pd , 0xf1f8, 0x81e0, 6}, {m68k_op_divs_16_di , 0xf1f8, 0x81e8, 8}, {m68k_op_divs_16_ix , 0xf1f8, 0x81f0, 10}, {m68k_op_sub_8_er_d , 0xf1f8, 0x9000, 4}, {m68k_op_sub_8_er_ai , 0xf1f8, 0x9010, 8}, {m68k_op_sub_8_er_pi , 0xf1f8, 0x9018, 8}, {m68k_op_sub_8_er_pd , 0xf1f8, 0x9020, 10}, {m68k_op_sub_8_er_di , 0xf1f8, 0x9028, 12}, {m68k_op_sub_8_er_ix , 0xf1f8, 0x9030, 14}, {m68k_op_sub_16_er_d , 0xf1f8, 0x9040, 4}, {m68k_op_sub_16_er_a , 0xf1f8, 0x9048, 4}, {m68k_op_sub_16_er_ai , 0xf1f8, 0x9050, 8}, {m68k_op_sub_16_er_pi , 0xf1f8, 0x9058, 8}, {m68k_op_sub_16_er_pd , 0xf1f8, 0x9060, 10}, {m68k_op_sub_16_er_di , 0xf1f8, 0x9068, 12}, {m68k_op_sub_16_er_ix , 0xf1f8, 0x9070, 14}, {m68k_op_sub_32_er_d , 0xf1f8, 0x9080, 8}, {m68k_op_sub_32_er_a , 0xf1f8, 0x9088, 8}, {m68k_op_sub_32_er_ai , 0xf1f8, 0x9090, 14}, {m68k_op_sub_32_er_pi , 0xf1f8, 0x9098, 14}, {m68k_op_sub_32_er_pd , 0xf1f8, 0x90a0, 16}, {m68k_op_sub_32_er_di , 0xf1f8, 0x90a8, 18}, {m68k_op_sub_32_er_ix , 0xf1f8, 0x90b0, 20}, {m68k_op_suba_16_d , 0xf1f8, 0x90c0, 8}, {m68k_op_suba_16_a , 0xf1f8, 0x90c8, 8}, {m68k_op_suba_16_ai , 0xf1f8, 0x90d0, 12}, {m68k_op_suba_16_pi , 0xf1f8, 0x90d8, 12}, {m68k_op_suba_16_pd , 0xf1f8, 0x90e0, 14}, {m68k_op_suba_16_di , 0xf1f8, 0x90e8, 16}, {m68k_op_suba_16_ix , 0xf1f8, 0x90f0, 18}, {m68k_op_subx_8_rr , 0xf1f8, 0x9100, 4}, {m68k_op_subx_8_mm , 0xf1f8, 0x9108, 18}, {m68k_op_sub_8_re_ai , 0xf1f8, 0x9110, 12}, {m68k_op_sub_8_re_pi , 0xf1f8, 0x9118, 12}, {m68k_op_sub_8_re_pd , 0xf1f8, 0x9120, 14}, {m68k_op_sub_8_re_di , 0xf1f8, 0x9128, 16}, {m68k_op_sub_8_re_ix , 0xf1f8, 0x9130, 18}, {m68k_op_subx_16_rr , 0xf1f8, 0x9140, 4}, {m68k_op_subx_16_mm , 0xf1f8, 0x9148, 18}, {m68k_op_sub_16_re_ai , 0xf1f8, 0x9150, 12}, {m68k_op_sub_16_re_pi , 0xf1f8, 0x9158, 12}, {m68k_op_sub_16_re_pd , 0xf1f8, 0x9160, 14}, {m68k_op_sub_16_re_di , 0xf1f8, 0x9168, 16}, {m68k_op_sub_16_re_ix , 0xf1f8, 0x9170, 18}, {m68k_op_subx_32_rr , 0xf1f8, 0x9180, 8}, {m68k_op_subx_32_mm , 0xf1f8, 0x9188, 30}, {m68k_op_sub_32_re_ai , 0xf1f8, 0x9190, 20}, {m68k_op_sub_32_re_pi , 0xf1f8, 0x9198, 20}, {m68k_op_sub_32_re_pd , 0xf1f8, 0x91a0, 22}, {m68k_op_sub_32_re_di , 0xf1f8, 0x91a8, 24}, {m68k_op_sub_32_re_ix , 0xf1f8, 0x91b0, 26}, {m68k_op_suba_32_d , 0xf1f8, 0x91c0, 8}, {m68k_op_suba_32_a , 0xf1f8, 0x91c8, 8}, {m68k_op_suba_32_ai , 0xf1f8, 0x91d0, 14}, {m68k_op_suba_32_pi , 0xf1f8, 0x91d8, 14}, {m68k_op_suba_32_pd , 0xf1f8, 0x91e0, 16}, {m68k_op_suba_32_di , 0xf1f8, 0x91e8, 18}, {m68k_op_suba_32_ix , 0xf1f8, 0x91f0, 20}, {m68k_op_cmp_8_d , 0xf1f8, 0xb000, 4}, {m68k_op_cmp_8_ai , 0xf1f8, 0xb010, 8}, {m68k_op_cmp_8_pi , 0xf1f8, 0xb018, 8}, {m68k_op_cmp_8_pd , 0xf1f8, 0xb020, 10}, {m68k_op_cmp_8_di , 0xf1f8, 0xb028, 12}, {m68k_op_cmp_8_ix , 0xf1f8, 0xb030, 14}, {m68k_op_cmp_16_d , 0xf1f8, 0xb040, 4}, {m68k_op_cmp_16_a , 0xf1f8, 0xb048, 4}, {m68k_op_cmp_16_ai , 0xf1f8, 0xb050, 8}, {m68k_op_cmp_16_pi , 0xf1f8, 0xb058, 8}, {m68k_op_cmp_16_pd , 0xf1f8, 0xb060, 10}, {m68k_op_cmp_16_di , 0xf1f8, 0xb068, 12}, {m68k_op_cmp_16_ix , 0xf1f8, 0xb070, 14}, {m68k_op_cmp_32_d , 0xf1f8, 0xb080, 6}, {m68k_op_cmp_32_a , 0xf1f8, 0xb088, 6}, {m68k_op_cmp_32_ai , 0xf1f8, 0xb090, 14}, {m68k_op_cmp_32_pi , 0xf1f8, 0xb098, 14}, {m68k_op_cmp_32_pd , 0xf1f8, 0xb0a0, 16}, {m68k_op_cmp_32_di , 0xf1f8, 0xb0a8, 18}, {m68k_op_cmp_32_ix , 0xf1f8, 0xb0b0, 20}, {m68k_op_cmpa_16_d , 0xf1f8, 0xb0c0, 6}, {m68k_op_cmpa_16_a , 0xf1f8, 0xb0c8, 6}, {m68k_op_cmpa_16_ai , 0xf1f8, 0xb0d0, 10}, {m68k_op_cmpa_16_pi , 0xf1f8, 0xb0d8, 10}, {m68k_op_cmpa_16_pd , 0xf1f8, 0xb0e0, 12}, {m68k_op_cmpa_16_di , 0xf1f8, 0xb0e8, 14}, {m68k_op_cmpa_16_ix , 0xf1f8, 0xb0f0, 16}, {m68k_op_eor_8_d , 0xf1f8, 0xb100, 4}, {m68k_op_cmpm_8 , 0xf1f8, 0xb108, 12}, {m68k_op_eor_8_ai , 0xf1f8, 0xb110, 12}, {m68k_op_eor_8_pi , 0xf1f8, 0xb118, 12}, {m68k_op_eor_8_pd , 0xf1f8, 0xb120, 14}, {m68k_op_eor_8_di , 0xf1f8, 0xb128, 16}, {m68k_op_eor_8_ix , 0xf1f8, 0xb130, 18}, {m68k_op_eor_16_d , 0xf1f8, 0xb140, 4}, {m68k_op_cmpm_16 , 0xf1f8, 0xb148, 12}, {m68k_op_eor_16_ai , 0xf1f8, 0xb150, 12}, {m68k_op_eor_16_pi , 0xf1f8, 0xb158, 12}, {m68k_op_eor_16_pd , 0xf1f8, 0xb160, 14}, {m68k_op_eor_16_di , 0xf1f8, 0xb168, 16}, {m68k_op_eor_16_ix , 0xf1f8, 0xb170, 18}, {m68k_op_eor_32_d , 0xf1f8, 0xb180, 8}, {m68k_op_cmpm_32 , 0xf1f8, 0xb188, 20}, {m68k_op_eor_32_ai , 0xf1f8, 0xb190, 20}, {m68k_op_eor_32_pi , 0xf1f8, 0xb198, 20}, {m68k_op_eor_32_pd , 0xf1f8, 0xb1a0, 22}, {m68k_op_eor_32_di , 0xf1f8, 0xb1a8, 24}, {m68k_op_eor_32_ix , 0xf1f8, 0xb1b0, 26}, {m68k_op_cmpa_32_d , 0xf1f8, 0xb1c0, 6}, {m68k_op_cmpa_32_a , 0xf1f8, 0xb1c8, 6}, {m68k_op_cmpa_32_ai , 0xf1f8, 0xb1d0, 14}, {m68k_op_cmpa_32_pi , 0xf1f8, 0xb1d8, 14}, {m68k_op_cmpa_32_pd , 0xf1f8, 0xb1e0, 16}, {m68k_op_cmpa_32_di , 0xf1f8, 0xb1e8, 18}, {m68k_op_cmpa_32_ix , 0xf1f8, 0xb1f0, 20}, {m68k_op_and_8_er_d , 0xf1f8, 0xc000, 4}, {m68k_op_and_8_er_ai , 0xf1f8, 0xc010, 8}, {m68k_op_and_8_er_pi , 0xf1f8, 0xc018, 8}, {m68k_op_and_8_er_pd , 0xf1f8, 0xc020, 10}, {m68k_op_and_8_er_di , 0xf1f8, 0xc028, 12}, {m68k_op_and_8_er_ix , 0xf1f8, 0xc030, 14}, {m68k_op_and_16_er_d , 0xf1f8, 0xc040, 4}, {m68k_op_and_16_er_ai , 0xf1f8, 0xc050, 8}, {m68k_op_and_16_er_pi , 0xf1f8, 0xc058, 8}, {m68k_op_and_16_er_pd , 0xf1f8, 0xc060, 10}, {m68k_op_and_16_er_di , 0xf1f8, 0xc068, 12}, {m68k_op_and_16_er_ix , 0xf1f8, 0xc070, 14}, {m68k_op_and_32_er_d , 0xf1f8, 0xc080, 8}, {m68k_op_and_32_er_ai , 0xf1f8, 0xc090, 14}, {m68k_op_and_32_er_pi , 0xf1f8, 0xc098, 14}, {m68k_op_and_32_er_pd , 0xf1f8, 0xc0a0, 16}, {m68k_op_and_32_er_di , 0xf1f8, 0xc0a8, 18}, {m68k_op_and_32_er_ix , 0xf1f8, 0xc0b0, 20}, {m68k_op_mulu_16_d , 0xf1f8, 0xc0c0, 0}, {m68k_op_mulu_16_ai , 0xf1f8, 0xc0d0, 4}, {m68k_op_mulu_16_pi , 0xf1f8, 0xc0d8, 4}, {m68k_op_mulu_16_pd , 0xf1f8, 0xc0e0, 6}, {m68k_op_mulu_16_di , 0xf1f8, 0xc0e8, 8}, {m68k_op_mulu_16_ix , 0xf1f8, 0xc0f0, 10}, {m68k_op_abcd_8_rr , 0xf1f8, 0xc100, 6}, {m68k_op_abcd_8_mm , 0xf1f8, 0xc108, 18}, {m68k_op_and_8_re_ai , 0xf1f8, 0xc110, 12}, {m68k_op_and_8_re_pi , 0xf1f8, 0xc118, 12}, {m68k_op_and_8_re_pd , 0xf1f8, 0xc120, 14}, {m68k_op_and_8_re_di , 0xf1f8, 0xc128, 16}, {m68k_op_and_8_re_ix , 0xf1f8, 0xc130, 18}, {m68k_op_exg_32_dd , 0xf1f8, 0xc140, 6}, {m68k_op_exg_32_aa , 0xf1f8, 0xc148, 6}, {m68k_op_and_16_re_ai , 0xf1f8, 0xc150, 12}, {m68k_op_and_16_re_pi , 0xf1f8, 0xc158, 12}, {m68k_op_and_16_re_pd , 0xf1f8, 0xc160, 14}, {m68k_op_and_16_re_di , 0xf1f8, 0xc168, 16}, {m68k_op_and_16_re_ix , 0xf1f8, 0xc170, 18}, {m68k_op_exg_32_da , 0xf1f8, 0xc188, 6}, {m68k_op_and_32_re_ai , 0xf1f8, 0xc190, 20}, {m68k_op_and_32_re_pi , 0xf1f8, 0xc198, 20}, {m68k_op_and_32_re_pd , 0xf1f8, 0xc1a0, 22}, {m68k_op_and_32_re_di , 0xf1f8, 0xc1a8, 24}, {m68k_op_and_32_re_ix , 0xf1f8, 0xc1b0, 26}, {m68k_op_muls_16_d , 0xf1f8, 0xc1c0, 0}, {m68k_op_muls_16_ai , 0xf1f8, 0xc1d0, 4}, {m68k_op_muls_16_pi , 0xf1f8, 0xc1d8, 4}, {m68k_op_muls_16_pd , 0xf1f8, 0xc1e0, 6}, {m68k_op_muls_16_di , 0xf1f8, 0xc1e8, 8}, {m68k_op_muls_16_ix , 0xf1f8, 0xc1f0, 10}, {m68k_op_add_8_er_d , 0xf1f8, 0xd000, 4}, {m68k_op_add_8_er_ai , 0xf1f8, 0xd010, 8}, {m68k_op_add_8_er_pi , 0xf1f8, 0xd018, 8}, {m68k_op_add_8_er_pd , 0xf1f8, 0xd020, 10}, {m68k_op_add_8_er_di , 0xf1f8, 0xd028, 12}, {m68k_op_add_8_er_ix , 0xf1f8, 0xd030, 14}, {m68k_op_add_16_er_d , 0xf1f8, 0xd040, 4}, {m68k_op_add_16_er_a , 0xf1f8, 0xd048, 4}, {m68k_op_add_16_er_ai , 0xf1f8, 0xd050, 8}, {m68k_op_add_16_er_pi , 0xf1f8, 0xd058, 8}, {m68k_op_add_16_er_pd , 0xf1f8, 0xd060, 10}, {m68k_op_add_16_er_di , 0xf1f8, 0xd068, 12}, {m68k_op_add_16_er_ix , 0xf1f8, 0xd070, 14}, {m68k_op_add_32_er_d , 0xf1f8, 0xd080, 8}, {m68k_op_add_32_er_a , 0xf1f8, 0xd088, 8}, {m68k_op_add_32_er_ai , 0xf1f8, 0xd090, 14}, {m68k_op_add_32_er_pi , 0xf1f8, 0xd098, 14}, {m68k_op_add_32_er_pd , 0xf1f8, 0xd0a0, 16}, {m68k_op_add_32_er_di , 0xf1f8, 0xd0a8, 18}, {m68k_op_add_32_er_ix , 0xf1f8, 0xd0b0, 20}, {m68k_op_adda_16_d , 0xf1f8, 0xd0c0, 8}, {m68k_op_adda_16_a , 0xf1f8, 0xd0c8, 8}, {m68k_op_adda_16_ai , 0xf1f8, 0xd0d0, 12}, {m68k_op_adda_16_pi , 0xf1f8, 0xd0d8, 12}, {m68k_op_adda_16_pd , 0xf1f8, 0xd0e0, 14}, {m68k_op_adda_16_di , 0xf1f8, 0xd0e8, 16}, {m68k_op_adda_16_ix , 0xf1f8, 0xd0f0, 18}, {m68k_op_addx_8_rr , 0xf1f8, 0xd100, 4}, {m68k_op_addx_8_mm , 0xf1f8, 0xd108, 18}, {m68k_op_add_8_re_ai , 0xf1f8, 0xd110, 12}, {m68k_op_add_8_re_pi , 0xf1f8, 0xd118, 12}, {m68k_op_add_8_re_pd , 0xf1f8, 0xd120, 14}, {m68k_op_add_8_re_di , 0xf1f8, 0xd128, 16}, {m68k_op_add_8_re_ix , 0xf1f8, 0xd130, 18}, {m68k_op_addx_16_rr , 0xf1f8, 0xd140, 4}, {m68k_op_addx_16_mm , 0xf1f8, 0xd148, 18}, {m68k_op_add_16_re_ai , 0xf1f8, 0xd150, 12}, {m68k_op_add_16_re_pi , 0xf1f8, 0xd158, 12}, {m68k_op_add_16_re_pd , 0xf1f8, 0xd160, 14}, {m68k_op_add_16_re_di , 0xf1f8, 0xd168, 16}, {m68k_op_add_16_re_ix , 0xf1f8, 0xd170, 18}, {m68k_op_addx_32_rr , 0xf1f8, 0xd180, 8}, {m68k_op_addx_32_mm , 0xf1f8, 0xd188, 30}, {m68k_op_add_32_re_ai , 0xf1f8, 0xd190, 20}, {m68k_op_add_32_re_pi , 0xf1f8, 0xd198, 20}, {m68k_op_add_32_re_pd , 0xf1f8, 0xd1a0, 22}, {m68k_op_add_32_re_di , 0xf1f8, 0xd1a8, 24}, {m68k_op_add_32_re_ix , 0xf1f8, 0xd1b0, 26}, {m68k_op_adda_32_d , 0xf1f8, 0xd1c0, 8}, {m68k_op_adda_32_a , 0xf1f8, 0xd1c8, 8}, {m68k_op_adda_32_ai , 0xf1f8, 0xd1d0, 14}, {m68k_op_adda_32_pi , 0xf1f8, 0xd1d8, 14}, {m68k_op_adda_32_pd , 0xf1f8, 0xd1e0, 16}, {m68k_op_adda_32_di , 0xf1f8, 0xd1e8, 18}, {m68k_op_adda_32_ix , 0xf1f8, 0xd1f0, 20}, {m68k_op_asr_8_s , 0xf1f8, 0xe000, 6}, {m68k_op_lsr_8_s , 0xf1f8, 0xe008, 6}, {m68k_op_roxr_8_s , 0xf1f8, 0xe010, 6}, {m68k_op_ror_8_s , 0xf1f8, 0xe018, 6}, {m68k_op_asr_8_r , 0xf1f8, 0xe020, 6}, {m68k_op_lsr_8_r , 0xf1f8, 0xe028, 6}, {m68k_op_roxr_8_r , 0xf1f8, 0xe030, 6}, {m68k_op_ror_8_r , 0xf1f8, 0xe038, 6}, {m68k_op_asr_16_s , 0xf1f8, 0xe040, 6}, {m68k_op_lsr_16_s , 0xf1f8, 0xe048, 6}, {m68k_op_roxr_16_s , 0xf1f8, 0xe050, 6}, {m68k_op_ror_16_s , 0xf1f8, 0xe058, 6}, {m68k_op_asr_16_r , 0xf1f8, 0xe060, 6}, {m68k_op_lsr_16_r , 0xf1f8, 0xe068, 6}, {m68k_op_roxr_16_r , 0xf1f8, 0xe070, 6}, {m68k_op_ror_16_r , 0xf1f8, 0xe078, 6}, {m68k_op_asr_32_s , 0xf1f8, 0xe080, 8}, {m68k_op_lsr_32_s , 0xf1f8, 0xe088, 8}, {m68k_op_roxr_32_s , 0xf1f8, 0xe090, 8}, {m68k_op_ror_32_s , 0xf1f8, 0xe098, 8}, {m68k_op_asr_32_r , 0xf1f8, 0xe0a0, 8}, {m68k_op_lsr_32_r , 0xf1f8, 0xe0a8, 8}, {m68k_op_roxr_32_r , 0xf1f8, 0xe0b0, 8}, {m68k_op_ror_32_r , 0xf1f8, 0xe0b8, 8}, {m68k_op_asl_8_s , 0xf1f8, 0xe100, 6}, {m68k_op_lsl_8_s , 0xf1f8, 0xe108, 6}, {m68k_op_roxl_8_s , 0xf1f8, 0xe110, 6}, {m68k_op_rol_8_s , 0xf1f8, 0xe118, 6}, {m68k_op_asl_8_r , 0xf1f8, 0xe120, 6}, {m68k_op_lsl_8_r , 0xf1f8, 0xe128, 6}, {m68k_op_roxl_8_r , 0xf1f8, 0xe130, 6}, {m68k_op_rol_8_r , 0xf1f8, 0xe138, 6}, {m68k_op_asl_16_s , 0xf1f8, 0xe140, 6}, {m68k_op_lsl_16_s , 0xf1f8, 0xe148, 6}, {m68k_op_roxl_16_s , 0xf1f8, 0xe150, 6}, {m68k_op_rol_16_s , 0xf1f8, 0xe158, 6}, {m68k_op_asl_16_r , 0xf1f8, 0xe160, 6}, {m68k_op_lsl_16_r , 0xf1f8, 0xe168, 6}, {m68k_op_roxl_16_r , 0xf1f8, 0xe170, 6}, {m68k_op_rol_16_r , 0xf1f8, 0xe178, 6}, {m68k_op_asl_32_s , 0xf1f8, 0xe180, 8}, {m68k_op_lsl_32_s , 0xf1f8, 0xe188, 8}, {m68k_op_roxl_32_s , 0xf1f8, 0xe190, 8}, {m68k_op_rol_32_s , 0xf1f8, 0xe198, 8}, {m68k_op_asl_32_r , 0xf1f8, 0xe1a0, 8}, {m68k_op_lsl_32_r , 0xf1f8, 0xe1a8, 8}, {m68k_op_roxl_32_r , 0xf1f8, 0xe1b0, 8}, {m68k_op_rol_32_r , 0xf1f8, 0xe1b8, 8}, {m68k_op_trap , 0xfff0, 0x4e40, 4}, {m68k_op_btst_8_r_pi7 , 0xf1ff, 0x011f, 8}, {m68k_op_btst_8_r_pd7 , 0xf1ff, 0x0127, 10}, {m68k_op_btst_8_r_aw , 0xf1ff, 0x0138, 12}, {m68k_op_btst_8_r_al , 0xf1ff, 0x0139, 16}, {m68k_op_btst_8_r_pcdi , 0xf1ff, 0x013a, 12}, {m68k_op_btst_8_r_pcix , 0xf1ff, 0x013b, 14}, {m68k_op_btst_8_r_i , 0xf1ff, 0x013c, 8}, {m68k_op_bchg_8_r_pi7 , 0xf1ff, 0x015f, 12}, {m68k_op_bchg_8_r_pd7 , 0xf1ff, 0x0167, 14}, {m68k_op_bchg_8_r_aw , 0xf1ff, 0x0178, 16}, {m68k_op_bchg_8_r_al , 0xf1ff, 0x0179, 20}, {m68k_op_bclr_8_r_pi7 , 0xf1ff, 0x019f, 12}, {m68k_op_bclr_8_r_pd7 , 0xf1ff, 0x01a7, 14}, {m68k_op_bclr_8_r_aw , 0xf1ff, 0x01b8, 16}, {m68k_op_bclr_8_r_al , 0xf1ff, 0x01b9, 20}, {m68k_op_bset_8_r_pi7 , 0xf1ff, 0x01df, 12}, {m68k_op_bset_8_r_pd7 , 0xf1ff, 0x01e7, 14}, {m68k_op_bset_8_r_aw , 0xf1ff, 0x01f8, 16}, {m68k_op_bset_8_r_al , 0xf1ff, 0x01f9, 20}, {m68k_op_move_8_d_pi7 , 0xf1ff, 0x101f, 8}, {m68k_op_move_8_d_pd7 , 0xf1ff, 0x1027, 10}, {m68k_op_move_8_d_aw , 0xf1ff, 0x1038, 12}, {m68k_op_move_8_d_al , 0xf1ff, 0x1039, 16}, {m68k_op_move_8_d_pcdi , 0xf1ff, 0x103a, 12}, {m68k_op_move_8_d_pcix , 0xf1ff, 0x103b, 14}, {m68k_op_move_8_d_i , 0xf1ff, 0x103c, 8}, {m68k_op_move_8_ai_pi7 , 0xf1ff, 0x109f, 12}, {m68k_op_move_8_ai_pd7 , 0xf1ff, 0x10a7, 14}, {m68k_op_move_8_ai_aw , 0xf1ff, 0x10b8, 16}, {m68k_op_move_8_ai_al , 0xf1ff, 0x10b9, 20}, {m68k_op_move_8_ai_pcdi , 0xf1ff, 0x10ba, 16}, {m68k_op_move_8_ai_pcix , 0xf1ff, 0x10bb, 18}, {m68k_op_move_8_ai_i , 0xf1ff, 0x10bc, 12}, {m68k_op_move_8_pi_pi7 , 0xf1ff, 0x10df, 12}, {m68k_op_move_8_pi_pd7 , 0xf1ff, 0x10e7, 14}, {m68k_op_move_8_pi_aw , 0xf1ff, 0x10f8, 16}, {m68k_op_move_8_pi_al , 0xf1ff, 0x10f9, 20}, {m68k_op_move_8_pi_pcdi , 0xf1ff, 0x10fa, 16}, {m68k_op_move_8_pi_pcix , 0xf1ff, 0x10fb, 18}, {m68k_op_move_8_pi_i , 0xf1ff, 0x10fc, 12}, {m68k_op_move_8_pd_pi7 , 0xf1ff, 0x111f, 12}, {m68k_op_move_8_pd_pd7 , 0xf1ff, 0x1127, 14}, {m68k_op_move_8_pd_aw , 0xf1ff, 0x1138, 16}, {m68k_op_move_8_pd_al , 0xf1ff, 0x1139, 20}, {m68k_op_move_8_pd_pcdi , 0xf1ff, 0x113a, 16}, {m68k_op_move_8_pd_pcix , 0xf1ff, 0x113b, 18}, {m68k_op_move_8_pd_i , 0xf1ff, 0x113c, 12}, {m68k_op_move_8_di_pi7 , 0xf1ff, 0x115f, 16}, {m68k_op_move_8_di_pd7 , 0xf1ff, 0x1167, 18}, {m68k_op_move_8_di_aw , 0xf1ff, 0x1178, 20}, {m68k_op_move_8_di_al , 0xf1ff, 0x1179, 24}, {m68k_op_move_8_di_pcdi , 0xf1ff, 0x117a, 20}, {m68k_op_move_8_di_pcix , 0xf1ff, 0x117b, 22}, {m68k_op_move_8_di_i , 0xf1ff, 0x117c, 16}, {m68k_op_move_8_ix_pi7 , 0xf1ff, 0x119f, 18}, {m68k_op_move_8_ix_pd7 , 0xf1ff, 0x11a7, 20}, {m68k_op_move_8_ix_aw , 0xf1ff, 0x11b8, 22}, {m68k_op_move_8_ix_al , 0xf1ff, 0x11b9, 26}, {m68k_op_move_8_ix_pcdi , 0xf1ff, 0x11ba, 22}, {m68k_op_move_8_ix_pcix , 0xf1ff, 0x11bb, 24}, {m68k_op_move_8_ix_i , 0xf1ff, 0x11bc, 18}, {m68k_op_move_32_d_aw , 0xf1ff, 0x2038, 16}, {m68k_op_move_32_d_al , 0xf1ff, 0x2039, 20}, {m68k_op_move_32_d_pcdi , 0xf1ff, 0x203a, 16}, {m68k_op_move_32_d_pcix , 0xf1ff, 0x203b, 18}, {m68k_op_move_32_d_i , 0xf1ff, 0x203c, 12}, {m68k_op_movea_32_aw , 0xf1ff, 0x2078, 16}, {m68k_op_movea_32_al , 0xf1ff, 0x2079, 20}, {m68k_op_movea_32_pcdi , 0xf1ff, 0x207a, 16}, {m68k_op_movea_32_pcix , 0xf1ff, 0x207b, 18}, {m68k_op_movea_32_i , 0xf1ff, 0x207c, 12}, {m68k_op_move_32_ai_aw , 0xf1ff, 0x20b8, 24}, {m68k_op_move_32_ai_al , 0xf1ff, 0x20b9, 28}, {m68k_op_move_32_ai_pcdi , 0xf1ff, 0x20ba, 24}, {m68k_op_move_32_ai_pcix , 0xf1ff, 0x20bb, 26}, {m68k_op_move_32_ai_i , 0xf1ff, 0x20bc, 20}, {m68k_op_move_32_pi_aw , 0xf1ff, 0x20f8, 24}, {m68k_op_move_32_pi_al , 0xf1ff, 0x20f9, 28}, {m68k_op_move_32_pi_pcdi , 0xf1ff, 0x20fa, 24}, {m68k_op_move_32_pi_pcix , 0xf1ff, 0x20fb, 26}, {m68k_op_move_32_pi_i , 0xf1ff, 0x20fc, 20}, {m68k_op_move_32_pd_aw , 0xf1ff, 0x2138, 24}, {m68k_op_move_32_pd_al , 0xf1ff, 0x2139, 28}, {m68k_op_move_32_pd_pcdi , 0xf1ff, 0x213a, 24}, {m68k_op_move_32_pd_pcix , 0xf1ff, 0x213b, 26}, {m68k_op_move_32_pd_i , 0xf1ff, 0x213c, 20}, {m68k_op_move_32_di_aw , 0xf1ff, 0x2178, 28}, {m68k_op_move_32_di_al , 0xf1ff, 0x2179, 32}, {m68k_op_move_32_di_pcdi , 0xf1ff, 0x217a, 28}, {m68k_op_move_32_di_pcix , 0xf1ff, 0x217b, 30}, {m68k_op_move_32_di_i , 0xf1ff, 0x217c, 24}, {m68k_op_move_32_ix_aw , 0xf1ff, 0x21b8, 30}, {m68k_op_move_32_ix_al , 0xf1ff, 0x21b9, 34}, {m68k_op_move_32_ix_pcdi , 0xf1ff, 0x21ba, 30}, {m68k_op_move_32_ix_pcix , 0xf1ff, 0x21bb, 32}, {m68k_op_move_32_ix_i , 0xf1ff, 0x21bc, 26}, {m68k_op_move_16_d_aw , 0xf1ff, 0x3038, 12}, {m68k_op_move_16_d_al , 0xf1ff, 0x3039, 16}, {m68k_op_move_16_d_pcdi , 0xf1ff, 0x303a, 12}, {m68k_op_move_16_d_pcix , 0xf1ff, 0x303b, 14}, {m68k_op_move_16_d_i , 0xf1ff, 0x303c, 8}, {m68k_op_movea_16_aw , 0xf1ff, 0x3078, 12}, {m68k_op_movea_16_al , 0xf1ff, 0x3079, 16}, {m68k_op_movea_16_pcdi , 0xf1ff, 0x307a, 12}, {m68k_op_movea_16_pcix , 0xf1ff, 0x307b, 14}, {m68k_op_movea_16_i , 0xf1ff, 0x307c, 8}, {m68k_op_move_16_ai_aw , 0xf1ff, 0x30b8, 16}, {m68k_op_move_16_ai_al , 0xf1ff, 0x30b9, 20}, {m68k_op_move_16_ai_pcdi , 0xf1ff, 0x30ba, 16}, {m68k_op_move_16_ai_pcix , 0xf1ff, 0x30bb, 18}, {m68k_op_move_16_ai_i , 0xf1ff, 0x30bc, 12}, {m68k_op_move_16_pi_aw , 0xf1ff, 0x30f8, 16}, {m68k_op_move_16_pi_al , 0xf1ff, 0x30f9, 20}, {m68k_op_move_16_pi_pcdi , 0xf1ff, 0x30fa, 16}, {m68k_op_move_16_pi_pcix , 0xf1ff, 0x30fb, 18}, {m68k_op_move_16_pi_i , 0xf1ff, 0x30fc, 12}, {m68k_op_move_16_pd_aw , 0xf1ff, 0x3138, 16}, {m68k_op_move_16_pd_al , 0xf1ff, 0x3139, 20}, {m68k_op_move_16_pd_pcdi , 0xf1ff, 0x313a, 16}, {m68k_op_move_16_pd_pcix , 0xf1ff, 0x313b, 18}, {m68k_op_move_16_pd_i , 0xf1ff, 0x313c, 12}, {m68k_op_move_16_di_aw , 0xf1ff, 0x3178, 20}, {m68k_op_move_16_di_al , 0xf1ff, 0x3179, 24}, {m68k_op_move_16_di_pcdi , 0xf1ff, 0x317a, 20}, {m68k_op_move_16_di_pcix , 0xf1ff, 0x317b, 22}, {m68k_op_move_16_di_i , 0xf1ff, 0x317c, 16}, {m68k_op_move_16_ix_aw , 0xf1ff, 0x31b8, 22}, {m68k_op_move_16_ix_al , 0xf1ff, 0x31b9, 26}, {m68k_op_move_16_ix_pcdi , 0xf1ff, 0x31ba, 22}, {m68k_op_move_16_ix_pcix , 0xf1ff, 0x31bb, 24}, {m68k_op_move_16_ix_i , 0xf1ff, 0x31bc, 18}, {m68k_op_chk_16_aw , 0xf1ff, 0x41b8, 18}, {m68k_op_chk_16_al , 0xf1ff, 0x41b9, 22}, {m68k_op_chk_16_pcdi , 0xf1ff, 0x41ba, 18}, {m68k_op_chk_16_pcix , 0xf1ff, 0x41bb, 20}, {m68k_op_chk_16_i , 0xf1ff, 0x41bc, 14}, {m68k_op_lea_32_aw , 0xf1ff, 0x41f8, 8}, {m68k_op_lea_32_al , 0xf1ff, 0x41f9, 12}, {m68k_op_lea_32_pcdi , 0xf1ff, 0x41fa, 8}, {m68k_op_lea_32_pcix , 0xf1ff, 0x41fb, 12}, {m68k_op_addq_8_pi7 , 0xf1ff, 0x501f, 12}, {m68k_op_addq_8_pd7 , 0xf1ff, 0x5027, 14}, {m68k_op_addq_8_aw , 0xf1ff, 0x5038, 16}, {m68k_op_addq_8_al , 0xf1ff, 0x5039, 20}, {m68k_op_addq_16_aw , 0xf1ff, 0x5078, 16}, {m68k_op_addq_16_al , 0xf1ff, 0x5079, 20}, {m68k_op_addq_32_aw , 0xf1ff, 0x50b8, 24}, {m68k_op_addq_32_al , 0xf1ff, 0x50b9, 28}, {m68k_op_subq_8_pi7 , 0xf1ff, 0x511f, 12}, {m68k_op_subq_8_pd7 , 0xf1ff, 0x5127, 14}, {m68k_op_subq_8_aw , 0xf1ff, 0x5138, 16}, {m68k_op_subq_8_al , 0xf1ff, 0x5139, 20}, {m68k_op_subq_16_aw , 0xf1ff, 0x5178, 16}, {m68k_op_subq_16_al , 0xf1ff, 0x5179, 20}, {m68k_op_subq_32_aw , 0xf1ff, 0x51b8, 24}, {m68k_op_subq_32_al , 0xf1ff, 0x51b9, 28}, {m68k_op_or_8_er_pi7 , 0xf1ff, 0x801f, 8}, {m68k_op_or_8_er_pd7 , 0xf1ff, 0x8027, 10}, {m68k_op_or_8_er_aw , 0xf1ff, 0x8038, 12}, {m68k_op_or_8_er_al , 0xf1ff, 0x8039, 16}, {m68k_op_or_8_er_pcdi , 0xf1ff, 0x803a, 12}, {m68k_op_or_8_er_pcix , 0xf1ff, 0x803b, 14}, {m68k_op_or_8_er_i , 0xf1ff, 0x803c, 8}, {m68k_op_or_16_er_aw , 0xf1ff, 0x8078, 12}, {m68k_op_or_16_er_al , 0xf1ff, 0x8079, 16}, {m68k_op_or_16_er_pcdi , 0xf1ff, 0x807a, 12}, {m68k_op_or_16_er_pcix , 0xf1ff, 0x807b, 14}, {m68k_op_or_16_er_i , 0xf1ff, 0x807c, 8}, {m68k_op_or_32_er_aw , 0xf1ff, 0x80b8, 18}, {m68k_op_or_32_er_al , 0xf1ff, 0x80b9, 22}, {m68k_op_or_32_er_pcdi , 0xf1ff, 0x80ba, 18}, {m68k_op_or_32_er_pcix , 0xf1ff, 0x80bb, 20}, {m68k_op_or_32_er_i , 0xf1ff, 0x80bc, 16}, {m68k_op_divu_16_aw , 0xf1ff, 0x80f8, 8}, {m68k_op_divu_16_al , 0xf1ff, 0x80f9, 12}, {m68k_op_divu_16_pcdi , 0xf1ff, 0x80fa, 8}, {m68k_op_divu_16_pcix , 0xf1ff, 0x80fb, 10}, {m68k_op_divu_16_i , 0xf1ff, 0x80fc, 4}, {m68k_op_sbcd_8_mm_ay7 , 0xf1ff, 0x810f, 18}, {m68k_op_or_8_re_pi7 , 0xf1ff, 0x811f, 12}, {m68k_op_or_8_re_pd7 , 0xf1ff, 0x8127, 14}, {m68k_op_or_8_re_aw , 0xf1ff, 0x8138, 16}, {m68k_op_or_8_re_al , 0xf1ff, 0x8139, 20}, {m68k_op_or_16_re_aw , 0xf1ff, 0x8178, 16}, {m68k_op_or_16_re_al , 0xf1ff, 0x8179, 20}, {m68k_op_or_32_re_aw , 0xf1ff, 0x81b8, 24}, {m68k_op_or_32_re_al , 0xf1ff, 0x81b9, 28}, {m68k_op_divs_16_aw , 0xf1ff, 0x81f8, 8}, {m68k_op_divs_16_al , 0xf1ff, 0x81f9, 12}, {m68k_op_divs_16_pcdi , 0xf1ff, 0x81fa, 8}, {m68k_op_divs_16_pcix , 0xf1ff, 0x81fb, 10}, {m68k_op_divs_16_i , 0xf1ff, 0x81fc, 4}, {m68k_op_sub_8_er_pi7 , 0xf1ff, 0x901f, 8}, {m68k_op_sub_8_er_pd7 , 0xf1ff, 0x9027, 10}, {m68k_op_sub_8_er_aw , 0xf1ff, 0x9038, 12}, {m68k_op_sub_8_er_al , 0xf1ff, 0x9039, 16}, {m68k_op_sub_8_er_pcdi , 0xf1ff, 0x903a, 12}, {m68k_op_sub_8_er_pcix , 0xf1ff, 0x903b, 14}, {m68k_op_sub_8_er_i , 0xf1ff, 0x903c, 8}, {m68k_op_sub_16_er_aw , 0xf1ff, 0x9078, 12}, {m68k_op_sub_16_er_al , 0xf1ff, 0x9079, 16}, {m68k_op_sub_16_er_pcdi , 0xf1ff, 0x907a, 12}, {m68k_op_sub_16_er_pcix , 0xf1ff, 0x907b, 14}, {m68k_op_sub_16_er_i , 0xf1ff, 0x907c, 8}, {m68k_op_sub_32_er_aw , 0xf1ff, 0x90b8, 18}, {m68k_op_sub_32_er_al , 0xf1ff, 0x90b9, 22}, {m68k_op_sub_32_er_pcdi , 0xf1ff, 0x90ba, 18}, {m68k_op_sub_32_er_pcix , 0xf1ff, 0x90bb, 20}, {m68k_op_sub_32_er_i , 0xf1ff, 0x90bc, 16}, {m68k_op_suba_16_aw , 0xf1ff, 0x90f8, 16}, {m68k_op_suba_16_al , 0xf1ff, 0x90f9, 20}, {m68k_op_suba_16_pcdi , 0xf1ff, 0x90fa, 16}, {m68k_op_suba_16_pcix , 0xf1ff, 0x90fb, 18}, {m68k_op_suba_16_i , 0xf1ff, 0x90fc, 12}, {m68k_op_subx_8_mm_ay7 , 0xf1ff, 0x910f, 18}, {m68k_op_sub_8_re_pi7 , 0xf1ff, 0x911f, 12}, {m68k_op_sub_8_re_pd7 , 0xf1ff, 0x9127, 14}, {m68k_op_sub_8_re_aw , 0xf1ff, 0x9138, 16}, {m68k_op_sub_8_re_al , 0xf1ff, 0x9139, 20}, {m68k_op_sub_16_re_aw , 0xf1ff, 0x9178, 16}, {m68k_op_sub_16_re_al , 0xf1ff, 0x9179, 20}, {m68k_op_sub_32_re_aw , 0xf1ff, 0x91b8, 24}, {m68k_op_sub_32_re_al , 0xf1ff, 0x91b9, 28}, {m68k_op_suba_32_aw , 0xf1ff, 0x91f8, 18}, {m68k_op_suba_32_al , 0xf1ff, 0x91f9, 22}, {m68k_op_suba_32_pcdi , 0xf1ff, 0x91fa, 18}, {m68k_op_suba_32_pcix , 0xf1ff, 0x91fb, 20}, {m68k_op_suba_32_i , 0xf1ff, 0x91fc, 16}, {m68k_op_cmp_8_pi7 , 0xf1ff, 0xb01f, 8}, {m68k_op_cmp_8_pd7 , 0xf1ff, 0xb027, 10}, {m68k_op_cmp_8_aw , 0xf1ff, 0xb038, 12}, {m68k_op_cmp_8_al , 0xf1ff, 0xb039, 16}, {m68k_op_cmp_8_pcdi , 0xf1ff, 0xb03a, 12}, {m68k_op_cmp_8_pcix , 0xf1ff, 0xb03b, 14}, {m68k_op_cmp_8_i , 0xf1ff, 0xb03c, 8}, {m68k_op_cmp_16_aw , 0xf1ff, 0xb078, 12}, {m68k_op_cmp_16_al , 0xf1ff, 0xb079, 16}, {m68k_op_cmp_16_pcdi , 0xf1ff, 0xb07a, 12}, {m68k_op_cmp_16_pcix , 0xf1ff, 0xb07b, 14}, {m68k_op_cmp_16_i , 0xf1ff, 0xb07c, 8}, {m68k_op_cmp_32_aw , 0xf1ff, 0xb0b8, 18}, {m68k_op_cmp_32_al , 0xf1ff, 0xb0b9, 22}, {m68k_op_cmp_32_pcdi , 0xf1ff, 0xb0ba, 18}, {m68k_op_cmp_32_pcix , 0xf1ff, 0xb0bb, 20}, {m68k_op_cmp_32_i , 0xf1ff, 0xb0bc, 14}, {m68k_op_cmpa_16_aw , 0xf1ff, 0xb0f8, 14}, {m68k_op_cmpa_16_al , 0xf1ff, 0xb0f9, 18}, {m68k_op_cmpa_16_pcdi , 0xf1ff, 0xb0fa, 14}, {m68k_op_cmpa_16_pcix , 0xf1ff, 0xb0fb, 16}, {m68k_op_cmpa_16_i , 0xf1ff, 0xb0fc, 10}, {m68k_op_cmpm_8_ay7 , 0xf1ff, 0xb10f, 12}, {m68k_op_eor_8_pi7 , 0xf1ff, 0xb11f, 12}, {m68k_op_eor_8_pd7 , 0xf1ff, 0xb127, 14}, {m68k_op_eor_8_aw , 0xf1ff, 0xb138, 16}, {m68k_op_eor_8_al , 0xf1ff, 0xb139, 20}, {m68k_op_eor_16_aw , 0xf1ff, 0xb178, 16}, {m68k_op_eor_16_al , 0xf1ff, 0xb179, 20}, {m68k_op_eor_32_aw , 0xf1ff, 0xb1b8, 24}, {m68k_op_eor_32_al , 0xf1ff, 0xb1b9, 28}, {m68k_op_cmpa_32_aw , 0xf1ff, 0xb1f8, 18}, {m68k_op_cmpa_32_al , 0xf1ff, 0xb1f9, 22}, {m68k_op_cmpa_32_pcdi , 0xf1ff, 0xb1fa, 18}, {m68k_op_cmpa_32_pcix , 0xf1ff, 0xb1fb, 20}, {m68k_op_cmpa_32_i , 0xf1ff, 0xb1fc, 14}, {m68k_op_and_8_er_pi7 , 0xf1ff, 0xc01f, 8}, {m68k_op_and_8_er_pd7 , 0xf1ff, 0xc027, 10}, {m68k_op_and_8_er_aw , 0xf1ff, 0xc038, 12}, {m68k_op_and_8_er_al , 0xf1ff, 0xc039, 16}, {m68k_op_and_8_er_pcdi , 0xf1ff, 0xc03a, 12}, {m68k_op_and_8_er_pcix , 0xf1ff, 0xc03b, 14}, {m68k_op_and_8_er_i , 0xf1ff, 0xc03c, 8}, {m68k_op_and_16_er_aw , 0xf1ff, 0xc078, 12}, {m68k_op_and_16_er_al , 0xf1ff, 0xc079, 16}, {m68k_op_and_16_er_pcdi , 0xf1ff, 0xc07a, 12}, {m68k_op_and_16_er_pcix , 0xf1ff, 0xc07b, 14}, {m68k_op_and_16_er_i , 0xf1ff, 0xc07c, 8}, {m68k_op_and_32_er_aw , 0xf1ff, 0xc0b8, 18}, {m68k_op_and_32_er_al , 0xf1ff, 0xc0b9, 22}, {m68k_op_and_32_er_pcdi , 0xf1ff, 0xc0ba, 18}, {m68k_op_and_32_er_pcix , 0xf1ff, 0xc0bb, 20}, {m68k_op_and_32_er_i , 0xf1ff, 0xc0bc, 16}, {m68k_op_mulu_16_aw , 0xf1ff, 0xc0f8, 8}, {m68k_op_mulu_16_al , 0xf1ff, 0xc0f9, 12}, {m68k_op_mulu_16_pcdi , 0xf1ff, 0xc0fa, 8}, {m68k_op_mulu_16_pcix , 0xf1ff, 0xc0fb, 10}, {m68k_op_mulu_16_i , 0xf1ff, 0xc0fc, 4}, {m68k_op_abcd_8_mm_ay7 , 0xf1ff, 0xc10f, 18}, {m68k_op_and_8_re_pi7 , 0xf1ff, 0xc11f, 12}, {m68k_op_and_8_re_pd7 , 0xf1ff, 0xc127, 14}, {m68k_op_and_8_re_aw , 0xf1ff, 0xc138, 16}, {m68k_op_and_8_re_al , 0xf1ff, 0xc139, 20}, {m68k_op_and_16_re_aw , 0xf1ff, 0xc178, 16}, {m68k_op_and_16_re_al , 0xf1ff, 0xc179, 20}, {m68k_op_and_32_re_aw , 0xf1ff, 0xc1b8, 24}, {m68k_op_and_32_re_al , 0xf1ff, 0xc1b9, 28}, {m68k_op_muls_16_aw , 0xf1ff, 0xc1f8, 8}, {m68k_op_muls_16_al , 0xf1ff, 0xc1f9, 12}, {m68k_op_muls_16_pcdi , 0xf1ff, 0xc1fa, 8}, {m68k_op_muls_16_pcix , 0xf1ff, 0xc1fb, 10}, {m68k_op_muls_16_i , 0xf1ff, 0xc1fc, 4}, {m68k_op_add_8_er_pi7 , 0xf1ff, 0xd01f, 8}, {m68k_op_add_8_er_pd7 , 0xf1ff, 0xd027, 10}, {m68k_op_add_8_er_aw , 0xf1ff, 0xd038, 12}, {m68k_op_add_8_er_al , 0xf1ff, 0xd039, 16}, {m68k_op_add_8_er_pcdi , 0xf1ff, 0xd03a, 12}, {m68k_op_add_8_er_pcix , 0xf1ff, 0xd03b, 14}, {m68k_op_add_8_er_i , 0xf1ff, 0xd03c, 8}, {m68k_op_add_16_er_aw , 0xf1ff, 0xd078, 12}, {m68k_op_add_16_er_al , 0xf1ff, 0xd079, 16}, {m68k_op_add_16_er_pcdi , 0xf1ff, 0xd07a, 12}, {m68k_op_add_16_er_pcix , 0xf1ff, 0xd07b, 14}, {m68k_op_add_16_er_i , 0xf1ff, 0xd07c, 8}, {m68k_op_add_32_er_aw , 0xf1ff, 0xd0b8, 18}, {m68k_op_add_32_er_al , 0xf1ff, 0xd0b9, 22}, {m68k_op_add_32_er_pcdi , 0xf1ff, 0xd0ba, 18}, {m68k_op_add_32_er_pcix , 0xf1ff, 0xd0bb, 20}, {m68k_op_add_32_er_i , 0xf1ff, 0xd0bc, 16}, {m68k_op_adda_16_aw , 0xf1ff, 0xd0f8, 16}, {m68k_op_adda_16_al , 0xf1ff, 0xd0f9, 20}, {m68k_op_adda_16_pcdi , 0xf1ff, 0xd0fa, 16}, {m68k_op_adda_16_pcix , 0xf1ff, 0xd0fb, 18}, {m68k_op_adda_16_i , 0xf1ff, 0xd0fc, 12}, {m68k_op_addx_8_mm_ay7 , 0xf1ff, 0xd10f, 18}, {m68k_op_add_8_re_pi7 , 0xf1ff, 0xd11f, 12}, {m68k_op_add_8_re_pd7 , 0xf1ff, 0xd127, 14}, {m68k_op_add_8_re_aw , 0xf1ff, 0xd138, 16}, {m68k_op_add_8_re_al , 0xf1ff, 0xd139, 20}, {m68k_op_add_16_re_aw , 0xf1ff, 0xd178, 16}, {m68k_op_add_16_re_al , 0xf1ff, 0xd179, 20}, {m68k_op_add_32_re_aw , 0xf1ff, 0xd1b8, 24}, {m68k_op_add_32_re_al , 0xf1ff, 0xd1b9, 28}, {m68k_op_adda_32_aw , 0xf1ff, 0xd1f8, 18}, {m68k_op_adda_32_al , 0xf1ff, 0xd1f9, 22}, {m68k_op_adda_32_pcdi , 0xf1ff, 0xd1fa, 18}, {m68k_op_adda_32_pcix , 0xf1ff, 0xd1fb, 20}, {m68k_op_adda_32_i , 0xf1ff, 0xd1fc, 16}, {m68k_op_ori_8_d , 0xfff8, 0x0000, 8}, {m68k_op_ori_8_ai , 0xfff8, 0x0010, 16}, {m68k_op_ori_8_pi , 0xfff8, 0x0018, 16}, {m68k_op_ori_8_pd , 0xfff8, 0x0020, 18}, {m68k_op_ori_8_di , 0xfff8, 0x0028, 20}, {m68k_op_ori_8_ix , 0xfff8, 0x0030, 22}, {m68k_op_ori_16_d , 0xfff8, 0x0040, 8}, {m68k_op_ori_16_ai , 0xfff8, 0x0050, 16}, {m68k_op_ori_16_pi , 0xfff8, 0x0058, 16}, {m68k_op_ori_16_pd , 0xfff8, 0x0060, 18}, {m68k_op_ori_16_di , 0xfff8, 0x0068, 20}, {m68k_op_ori_16_ix , 0xfff8, 0x0070, 22}, {m68k_op_ori_32_d , 0xfff8, 0x0080, 16}, {m68k_op_ori_32_ai , 0xfff8, 0x0090, 28}, {m68k_op_ori_32_pi , 0xfff8, 0x0098, 28}, {m68k_op_ori_32_pd , 0xfff8, 0x00a0, 30}, {m68k_op_ori_32_di , 0xfff8, 0x00a8, 32}, {m68k_op_ori_32_ix , 0xfff8, 0x00b0, 34}, {m68k_op_andi_8_d , 0xfff8, 0x0200, 8}, {m68k_op_andi_8_ai , 0xfff8, 0x0210, 16}, {m68k_op_andi_8_pi , 0xfff8, 0x0218, 16}, {m68k_op_andi_8_pd , 0xfff8, 0x0220, 18}, {m68k_op_andi_8_di , 0xfff8, 0x0228, 20}, {m68k_op_andi_8_ix , 0xfff8, 0x0230, 22}, {m68k_op_andi_16_d , 0xfff8, 0x0240, 8}, {m68k_op_andi_16_ai , 0xfff8, 0x0250, 16}, {m68k_op_andi_16_pi , 0xfff8, 0x0258, 16}, {m68k_op_andi_16_pd , 0xfff8, 0x0260, 18}, {m68k_op_andi_16_di , 0xfff8, 0x0268, 20}, {m68k_op_andi_16_ix , 0xfff8, 0x0270, 22}, {m68k_op_andi_32_d , 0xfff8, 0x0280, 14}, {m68k_op_andi_32_ai , 0xfff8, 0x0290, 28}, {m68k_op_andi_32_pi , 0xfff8, 0x0298, 28}, {m68k_op_andi_32_pd , 0xfff8, 0x02a0, 30}, {m68k_op_andi_32_di , 0xfff8, 0x02a8, 32}, {m68k_op_andi_32_ix , 0xfff8, 0x02b0, 34}, {m68k_op_subi_8_d , 0xfff8, 0x0400, 8}, {m68k_op_subi_8_ai , 0xfff8, 0x0410, 16}, {m68k_op_subi_8_pi , 0xfff8, 0x0418, 16}, {m68k_op_subi_8_pd , 0xfff8, 0x0420, 18}, {m68k_op_subi_8_di , 0xfff8, 0x0428, 20}, {m68k_op_subi_8_ix , 0xfff8, 0x0430, 22}, {m68k_op_subi_16_d , 0xfff8, 0x0440, 8}, {m68k_op_subi_16_ai , 0xfff8, 0x0450, 16}, {m68k_op_subi_16_pi , 0xfff8, 0x0458, 16}, {m68k_op_subi_16_pd , 0xfff8, 0x0460, 18}, {m68k_op_subi_16_di , 0xfff8, 0x0468, 20}, {m68k_op_subi_16_ix , 0xfff8, 0x0470, 22}, {m68k_op_subi_32_d , 0xfff8, 0x0480, 16}, {m68k_op_subi_32_ai , 0xfff8, 0x0490, 28}, {m68k_op_subi_32_pi , 0xfff8, 0x0498, 28}, {m68k_op_subi_32_pd , 0xfff8, 0x04a0, 30}, {m68k_op_subi_32_di , 0xfff8, 0x04a8, 32}, {m68k_op_subi_32_ix , 0xfff8, 0x04b0, 34}, {m68k_op_addi_8_d , 0xfff8, 0x0600, 8}, {m68k_op_addi_8_ai , 0xfff8, 0x0610, 16}, {m68k_op_addi_8_pi , 0xfff8, 0x0618, 16}, {m68k_op_addi_8_pd , 0xfff8, 0x0620, 18}, {m68k_op_addi_8_di , 0xfff8, 0x0628, 20}, {m68k_op_addi_8_ix , 0xfff8, 0x0630, 22}, {m68k_op_addi_16_d , 0xfff8, 0x0640, 8}, {m68k_op_addi_16_ai , 0xfff8, 0x0650, 16}, {m68k_op_addi_16_pi , 0xfff8, 0x0658, 16}, {m68k_op_addi_16_pd , 0xfff8, 0x0660, 18}, {m68k_op_addi_16_di , 0xfff8, 0x0668, 20}, {m68k_op_addi_16_ix , 0xfff8, 0x0670, 22}, {m68k_op_addi_32_d , 0xfff8, 0x0680, 16}, {m68k_op_addi_32_ai , 0xfff8, 0x0690, 28}, {m68k_op_addi_32_pi , 0xfff8, 0x0698, 28}, {m68k_op_addi_32_pd , 0xfff8, 0x06a0, 30}, {m68k_op_addi_32_di , 0xfff8, 0x06a8, 32}, {m68k_op_addi_32_ix , 0xfff8, 0x06b0, 34}, {m68k_op_btst_32_s_d , 0xfff8, 0x0800, 10}, {m68k_op_btst_8_s_ai , 0xfff8, 0x0810, 12}, {m68k_op_btst_8_s_pi , 0xfff8, 0x0818, 12}, {m68k_op_btst_8_s_pd , 0xfff8, 0x0820, 14}, {m68k_op_btst_8_s_di , 0xfff8, 0x0828, 16}, {m68k_op_btst_8_s_ix , 0xfff8, 0x0830, 18}, {m68k_op_bchg_32_s_d , 0xfff8, 0x0840, 12}, {m68k_op_bchg_8_s_ai , 0xfff8, 0x0850, 16}, {m68k_op_bchg_8_s_pi , 0xfff8, 0x0858, 16}, {m68k_op_bchg_8_s_pd , 0xfff8, 0x0860, 18}, {m68k_op_bchg_8_s_di , 0xfff8, 0x0868, 20}, {m68k_op_bchg_8_s_ix , 0xfff8, 0x0870, 22}, {m68k_op_bclr_32_s_d , 0xfff8, 0x0880, 14}, {m68k_op_bclr_8_s_ai , 0xfff8, 0x0890, 16}, {m68k_op_bclr_8_s_pi , 0xfff8, 0x0898, 16}, {m68k_op_bclr_8_s_pd , 0xfff8, 0x08a0, 18}, {m68k_op_bclr_8_s_di , 0xfff8, 0x08a8, 20}, {m68k_op_bclr_8_s_ix , 0xfff8, 0x08b0, 22}, {m68k_op_bset_32_s_d , 0xfff8, 0x08c0, 12}, {m68k_op_bset_8_s_ai , 0xfff8, 0x08d0, 16}, {m68k_op_bset_8_s_pi , 0xfff8, 0x08d8, 16}, {m68k_op_bset_8_s_pd , 0xfff8, 0x08e0, 18}, {m68k_op_bset_8_s_di , 0xfff8, 0x08e8, 20}, {m68k_op_bset_8_s_ix , 0xfff8, 0x08f0, 22}, {m68k_op_eori_8_d , 0xfff8, 0x0a00, 8}, {m68k_op_eori_8_ai , 0xfff8, 0x0a10, 16}, {m68k_op_eori_8_pi , 0xfff8, 0x0a18, 16}, {m68k_op_eori_8_pd , 0xfff8, 0x0a20, 18}, {m68k_op_eori_8_di , 0xfff8, 0x0a28, 20}, {m68k_op_eori_8_ix , 0xfff8, 0x0a30, 22}, {m68k_op_eori_16_d , 0xfff8, 0x0a40, 8}, {m68k_op_eori_16_ai , 0xfff8, 0x0a50, 16}, {m68k_op_eori_16_pi , 0xfff8, 0x0a58, 16}, {m68k_op_eori_16_pd , 0xfff8, 0x0a60, 18}, {m68k_op_eori_16_di , 0xfff8, 0x0a68, 20}, {m68k_op_eori_16_ix , 0xfff8, 0x0a70, 22}, {m68k_op_eori_32_d , 0xfff8, 0x0a80, 16}, {m68k_op_eori_32_ai , 0xfff8, 0x0a90, 28}, {m68k_op_eori_32_pi , 0xfff8, 0x0a98, 28}, {m68k_op_eori_32_pd , 0xfff8, 0x0aa0, 30}, {m68k_op_eori_32_di , 0xfff8, 0x0aa8, 32}, {m68k_op_eori_32_ix , 0xfff8, 0x0ab0, 34}, {m68k_op_cmpi_8_d , 0xfff8, 0x0c00, 8}, {m68k_op_cmpi_8_ai , 0xfff8, 0x0c10, 12}, {m68k_op_cmpi_8_pi , 0xfff8, 0x0c18, 12}, {m68k_op_cmpi_8_pd , 0xfff8, 0x0c20, 14}, {m68k_op_cmpi_8_di , 0xfff8, 0x0c28, 16}, {m68k_op_cmpi_8_ix , 0xfff8, 0x0c30, 18}, {m68k_op_cmpi_16_d , 0xfff8, 0x0c40, 8}, {m68k_op_cmpi_16_ai , 0xfff8, 0x0c50, 12}, {m68k_op_cmpi_16_pi , 0xfff8, 0x0c58, 12}, {m68k_op_cmpi_16_pd , 0xfff8, 0x0c60, 14}, {m68k_op_cmpi_16_di , 0xfff8, 0x0c68, 16}, {m68k_op_cmpi_16_ix , 0xfff8, 0x0c70, 18}, {m68k_op_cmpi_32_d , 0xfff8, 0x0c80, 14}, {m68k_op_cmpi_32_ai , 0xfff8, 0x0c90, 20}, {m68k_op_cmpi_32_pi , 0xfff8, 0x0c98, 20}, {m68k_op_cmpi_32_pd , 0xfff8, 0x0ca0, 22}, {m68k_op_cmpi_32_di , 0xfff8, 0x0ca8, 24}, {m68k_op_cmpi_32_ix , 0xfff8, 0x0cb0, 26}, {m68k_op_move_8_aw_d , 0xfff8, 0x11c0, 12}, {m68k_op_move_8_aw_ai , 0xfff8, 0x11d0, 16}, {m68k_op_move_8_aw_pi , 0xfff8, 0x11d8, 16}, {m68k_op_move_8_aw_pd , 0xfff8, 0x11e0, 18}, {m68k_op_move_8_aw_di , 0xfff8, 0x11e8, 20}, {m68k_op_move_8_aw_ix , 0xfff8, 0x11f0, 22}, {m68k_op_move_8_al_d , 0xfff8, 0x13c0, 16}, {m68k_op_move_8_al_ai , 0xfff8, 0x13d0, 20}, {m68k_op_move_8_al_pi , 0xfff8, 0x13d8, 20}, {m68k_op_move_8_al_pd , 0xfff8, 0x13e0, 22}, {m68k_op_move_8_al_di , 0xfff8, 0x13e8, 24}, {m68k_op_move_8_al_ix , 0xfff8, 0x13f0, 26}, {m68k_op_move_8_pi7_d , 0xfff8, 0x1ec0, 8}, {m68k_op_move_8_pi7_ai , 0xfff8, 0x1ed0, 12}, {m68k_op_move_8_pi7_pi , 0xfff8, 0x1ed8, 12}, {m68k_op_move_8_pi7_pd , 0xfff8, 0x1ee0, 14}, {m68k_op_move_8_pi7_di , 0xfff8, 0x1ee8, 16}, {m68k_op_move_8_pi7_ix , 0xfff8, 0x1ef0, 18}, {m68k_op_move_8_pd7_d , 0xfff8, 0x1f00, 8}, {m68k_op_move_8_pd7_ai , 0xfff8, 0x1f10, 12}, {m68k_op_move_8_pd7_pi , 0xfff8, 0x1f18, 12}, {m68k_op_move_8_pd7_pd , 0xfff8, 0x1f20, 14}, {m68k_op_move_8_pd7_di , 0xfff8, 0x1f28, 16}, {m68k_op_move_8_pd7_ix , 0xfff8, 0x1f30, 18}, {m68k_op_move_32_aw_d , 0xfff8, 0x21c0, 16}, {m68k_op_move_32_aw_a , 0xfff8, 0x21c8, 16}, {m68k_op_move_32_aw_ai , 0xfff8, 0x21d0, 24}, {m68k_op_move_32_aw_pi , 0xfff8, 0x21d8, 24}, {m68k_op_move_32_aw_pd , 0xfff8, 0x21e0, 26}, {m68k_op_move_32_aw_di , 0xfff8, 0x21e8, 28}, {m68k_op_move_32_aw_ix , 0xfff8, 0x21f0, 30}, {m68k_op_move_32_al_d , 0xfff8, 0x23c0, 20}, {m68k_op_move_32_al_a , 0xfff8, 0x23c8, 20}, {m68k_op_move_32_al_ai , 0xfff8, 0x23d0, 28}, {m68k_op_move_32_al_pi , 0xfff8, 0x23d8, 28}, {m68k_op_move_32_al_pd , 0xfff8, 0x23e0, 30}, {m68k_op_move_32_al_di , 0xfff8, 0x23e8, 32}, {m68k_op_move_32_al_ix , 0xfff8, 0x23f0, 34}, {m68k_op_move_16_aw_d , 0xfff8, 0x31c0, 12}, {m68k_op_move_16_aw_a , 0xfff8, 0x31c8, 12}, {m68k_op_move_16_aw_ai , 0xfff8, 0x31d0, 16}, {m68k_op_move_16_aw_pi , 0xfff8, 0x31d8, 16}, {m68k_op_move_16_aw_pd , 0xfff8, 0x31e0, 18}, {m68k_op_move_16_aw_di , 0xfff8, 0x31e8, 20}, {m68k_op_move_16_aw_ix , 0xfff8, 0x31f0, 22}, {m68k_op_move_16_al_d , 0xfff8, 0x33c0, 16}, {m68k_op_move_16_al_a , 0xfff8, 0x33c8, 16}, {m68k_op_move_16_al_ai , 0xfff8, 0x33d0, 20}, {m68k_op_move_16_al_pi , 0xfff8, 0x33d8, 20}, {m68k_op_move_16_al_pd , 0xfff8, 0x33e0, 22}, {m68k_op_move_16_al_di , 0xfff8, 0x33e8, 24}, {m68k_op_move_16_al_ix , 0xfff8, 0x33f0, 26}, {m68k_op_negx_8_d , 0xfff8, 0x4000, 4}, {m68k_op_negx_8_ai , 0xfff8, 0x4010, 12}, {m68k_op_negx_8_pi , 0xfff8, 0x4018, 12}, {m68k_op_negx_8_pd , 0xfff8, 0x4020, 14}, {m68k_op_negx_8_di , 0xfff8, 0x4028, 16}, {m68k_op_negx_8_ix , 0xfff8, 0x4030, 18}, {m68k_op_negx_16_d , 0xfff8, 0x4040, 4}, {m68k_op_negx_16_ai , 0xfff8, 0x4050, 12}, {m68k_op_negx_16_pi , 0xfff8, 0x4058, 12}, {m68k_op_negx_16_pd , 0xfff8, 0x4060, 14}, {m68k_op_negx_16_di , 0xfff8, 0x4068, 16}, {m68k_op_negx_16_ix , 0xfff8, 0x4070, 18}, {m68k_op_negx_32_d , 0xfff8, 0x4080, 6}, {m68k_op_negx_32_ai , 0xfff8, 0x4090, 20}, {m68k_op_negx_32_pi , 0xfff8, 0x4098, 20}, {m68k_op_negx_32_pd , 0xfff8, 0x40a0, 22}, {m68k_op_negx_32_di , 0xfff8, 0x40a8, 24}, {m68k_op_negx_32_ix , 0xfff8, 0x40b0, 26}, {m68k_op_move_16_frs_d , 0xfff8, 0x40c0, 6}, {m68k_op_move_16_frs_ai , 0xfff8, 0x40d0, 12}, {m68k_op_move_16_frs_pi , 0xfff8, 0x40d8, 12}, {m68k_op_move_16_frs_pd , 0xfff8, 0x40e0, 14}, {m68k_op_move_16_frs_di , 0xfff8, 0x40e8, 16}, {m68k_op_move_16_frs_ix , 0xfff8, 0x40f0, 18}, {m68k_op_clr_8_d , 0xfff8, 0x4200, 4}, {m68k_op_clr_8_ai , 0xfff8, 0x4210, 12}, {m68k_op_clr_8_pi , 0xfff8, 0x4218, 12}, {m68k_op_clr_8_pd , 0xfff8, 0x4220, 14}, {m68k_op_clr_8_di , 0xfff8, 0x4228, 16}, {m68k_op_clr_8_ix , 0xfff8, 0x4230, 18}, {m68k_op_clr_16_d , 0xfff8, 0x4240, 4}, {m68k_op_clr_16_ai , 0xfff8, 0x4250, 12}, {m68k_op_clr_16_pi , 0xfff8, 0x4258, 12}, {m68k_op_clr_16_pd , 0xfff8, 0x4260, 14}, {m68k_op_clr_16_di , 0xfff8, 0x4268, 16}, {m68k_op_clr_16_ix , 0xfff8, 0x4270, 18}, {m68k_op_clr_32_d , 0xfff8, 0x4280, 6}, {m68k_op_clr_32_ai , 0xfff8, 0x4290, 20}, {m68k_op_clr_32_pi , 0xfff8, 0x4298, 20}, {m68k_op_clr_32_pd , 0xfff8, 0x42a0, 22}, {m68k_op_clr_32_di , 0xfff8, 0x42a8, 24}, {m68k_op_clr_32_ix , 0xfff8, 0x42b0, 26}, {m68k_op_neg_8_d , 0xfff8, 0x4400, 4}, {m68k_op_neg_8_ai , 0xfff8, 0x4410, 12}, {m68k_op_neg_8_pi , 0xfff8, 0x4418, 12}, {m68k_op_neg_8_pd , 0xfff8, 0x4420, 14}, {m68k_op_neg_8_di , 0xfff8, 0x4428, 16}, {m68k_op_neg_8_ix , 0xfff8, 0x4430, 18}, {m68k_op_neg_16_d , 0xfff8, 0x4440, 4}, {m68k_op_neg_16_ai , 0xfff8, 0x4450, 12}, {m68k_op_neg_16_pi , 0xfff8, 0x4458, 12}, {m68k_op_neg_16_pd , 0xfff8, 0x4460, 14}, {m68k_op_neg_16_di , 0xfff8, 0x4468, 16}, {m68k_op_neg_16_ix , 0xfff8, 0x4470, 18}, {m68k_op_neg_32_d , 0xfff8, 0x4480, 6}, {m68k_op_neg_32_ai , 0xfff8, 0x4490, 20}, {m68k_op_neg_32_pi , 0xfff8, 0x4498, 20}, {m68k_op_neg_32_pd , 0xfff8, 0x44a0, 22}, {m68k_op_neg_32_di , 0xfff8, 0x44a8, 24}, {m68k_op_neg_32_ix , 0xfff8, 0x44b0, 26}, {m68k_op_move_16_toc_d , 0xfff8, 0x44c0, 12}, {m68k_op_move_16_toc_ai , 0xfff8, 0x44d0, 16}, {m68k_op_move_16_toc_pi , 0xfff8, 0x44d8, 16}, {m68k_op_move_16_toc_pd , 0xfff8, 0x44e0, 18}, {m68k_op_move_16_toc_di , 0xfff8, 0x44e8, 20}, {m68k_op_move_16_toc_ix , 0xfff8, 0x44f0, 22}, {m68k_op_not_8_d , 0xfff8, 0x4600, 4}, {m68k_op_not_8_ai , 0xfff8, 0x4610, 12}, {m68k_op_not_8_pi , 0xfff8, 0x4618, 12}, {m68k_op_not_8_pd , 0xfff8, 0x4620, 14}, {m68k_op_not_8_di , 0xfff8, 0x4628, 16}, {m68k_op_not_8_ix , 0xfff8, 0x4630, 18}, {m68k_op_not_16_d , 0xfff8, 0x4640, 4}, {m68k_op_not_16_ai , 0xfff8, 0x4650, 12}, {m68k_op_not_16_pi , 0xfff8, 0x4658, 12}, {m68k_op_not_16_pd , 0xfff8, 0x4660, 14}, {m68k_op_not_16_di , 0xfff8, 0x4668, 16}, {m68k_op_not_16_ix , 0xfff8, 0x4670, 18}, {m68k_op_not_32_d , 0xfff8, 0x4680, 6}, {m68k_op_not_32_ai , 0xfff8, 0x4690, 20}, {m68k_op_not_32_pi , 0xfff8, 0x4698, 20}, {m68k_op_not_32_pd , 0xfff8, 0x46a0, 22}, {m68k_op_not_32_di , 0xfff8, 0x46a8, 24}, {m68k_op_not_32_ix , 0xfff8, 0x46b0, 26}, {m68k_op_move_16_tos_d , 0xfff8, 0x46c0, 12}, {m68k_op_move_16_tos_ai , 0xfff8, 0x46d0, 16}, {m68k_op_move_16_tos_pi , 0xfff8, 0x46d8, 16}, {m68k_op_move_16_tos_pd , 0xfff8, 0x46e0, 18}, {m68k_op_move_16_tos_di , 0xfff8, 0x46e8, 20}, {m68k_op_move_16_tos_ix , 0xfff8, 0x46f0, 22}, {m68k_op_nbcd_8_d , 0xfff8, 0x4800, 6}, {m68k_op_nbcd_8_ai , 0xfff8, 0x4810, 12}, {m68k_op_nbcd_8_pi , 0xfff8, 0x4818, 12}, {m68k_op_nbcd_8_pd , 0xfff8, 0x4820, 14}, {m68k_op_nbcd_8_di , 0xfff8, 0x4828, 16}, {m68k_op_nbcd_8_ix , 0xfff8, 0x4830, 18}, {m68k_op_swap_32 , 0xfff8, 0x4840, 4}, {m68k_op_pea_32_ai , 0xfff8, 0x4850, 12}, {m68k_op_pea_32_di , 0xfff8, 0x4868, 16}, {m68k_op_pea_32_ix , 0xfff8, 0x4870, 20}, {m68k_op_ext_16 , 0xfff8, 0x4880, 4}, {m68k_op_movem_16_re_ai , 0xfff8, 0x4890, 8}, {m68k_op_movem_16_re_pd , 0xfff8, 0x48a0, 8}, {m68k_op_movem_16_re_di , 0xfff8, 0x48a8, 12}, {m68k_op_movem_16_re_ix , 0xfff8, 0x48b0, 14}, {m68k_op_ext_32 , 0xfff8, 0x48c0, 4}, {m68k_op_movem_32_re_ai , 0xfff8, 0x48d0, 8}, {m68k_op_movem_32_re_pd , 0xfff8, 0x48e0, 8}, {m68k_op_movem_32_re_di , 0xfff8, 0x48e8, 12}, {m68k_op_movem_32_re_ix , 0xfff8, 0x48f0, 14}, {m68k_op_tst_8_d , 0xfff8, 0x4a00, 4}, {m68k_op_tst_8_ai , 0xfff8, 0x4a10, 8}, {m68k_op_tst_8_pi , 0xfff8, 0x4a18, 8}, {m68k_op_tst_8_pd , 0xfff8, 0x4a20, 10}, {m68k_op_tst_8_di , 0xfff8, 0x4a28, 12}, {m68k_op_tst_8_ix , 0xfff8, 0x4a30, 14}, {m68k_op_tst_16_d , 0xfff8, 0x4a40, 4}, {m68k_op_tst_16_ai , 0xfff8, 0x4a50, 8}, {m68k_op_tst_16_pi , 0xfff8, 0x4a58, 8}, {m68k_op_tst_16_pd , 0xfff8, 0x4a60, 10}, {m68k_op_tst_16_di , 0xfff8, 0x4a68, 12}, {m68k_op_tst_16_ix , 0xfff8, 0x4a70, 14}, {m68k_op_tst_32_d , 0xfff8, 0x4a80, 4}, {m68k_op_tst_32_ai , 0xfff8, 0x4a90, 12}, {m68k_op_tst_32_pi , 0xfff8, 0x4a98, 12}, {m68k_op_tst_32_pd , 0xfff8, 0x4aa0, 14}, {m68k_op_tst_32_di , 0xfff8, 0x4aa8, 16}, {m68k_op_tst_32_ix , 0xfff8, 0x4ab0, 18}, {m68k_op_tas_8_d , 0xfff8, 0x4ac0, 4}, {m68k_op_tas_8_ai , 0xfff8, 0x4ad0, 18}, {m68k_op_tas_8_pi , 0xfff8, 0x4ad8, 18}, {m68k_op_tas_8_pd , 0xfff8, 0x4ae0, 20}, {m68k_op_tas_8_di , 0xfff8, 0x4ae8, 22}, {m68k_op_tas_8_ix , 0xfff8, 0x4af0, 24}, {m68k_op_movem_16_er_ai , 0xfff8, 0x4c90, 12}, {m68k_op_movem_16_er_pi , 0xfff8, 0x4c98, 12}, {m68k_op_movem_16_er_di , 0xfff8, 0x4ca8, 16}, {m68k_op_movem_16_er_ix , 0xfff8, 0x4cb0, 18}, {m68k_op_movem_32_er_ai , 0xfff8, 0x4cd0, 12}, {m68k_op_movem_32_er_pi , 0xfff8, 0x4cd8, 12}, {m68k_op_movem_32_er_di , 0xfff8, 0x4ce8, 16}, {m68k_op_movem_32_er_ix , 0xfff8, 0x4cf0, 18}, {m68k_op_link_16 , 0xfff8, 0x4e50, 16}, {m68k_op_unlk_32 , 0xfff8, 0x4e58, 12}, {m68k_op_move_32_tou , 0xfff8, 0x4e60, 4}, {m68k_op_move_32_fru , 0xfff8, 0x4e68, 4}, {m68k_op_jsr_32_ai , 0xfff8, 0x4e90, 16}, {m68k_op_jsr_32_di , 0xfff8, 0x4ea8, 18}, {m68k_op_jsr_32_ix , 0xfff8, 0x4eb0, 22}, {m68k_op_jmp_32_ai , 0xfff8, 0x4ed0, 8}, {m68k_op_jmp_32_di , 0xfff8, 0x4ee8, 10}, {m68k_op_jmp_32_ix , 0xfff8, 0x4ef0, 14}, {m68k_op_st_8_d , 0xfff8, 0x50c0, 6}, {m68k_op_dbt_16 , 0xfff8, 0x50c8, 12}, {m68k_op_st_8_ai , 0xfff8, 0x50d0, 12}, {m68k_op_st_8_pi , 0xfff8, 0x50d8, 12}, {m68k_op_st_8_pd , 0xfff8, 0x50e0, 14}, {m68k_op_st_8_di , 0xfff8, 0x50e8, 16}, {m68k_op_st_8_ix , 0xfff8, 0x50f0, 18}, {m68k_op_sf_8_d , 0xfff8, 0x51c0, 4}, {m68k_op_dbf_16 , 0xfff8, 0x51c8, 12}, {m68k_op_sf_8_ai , 0xfff8, 0x51d0, 12}, {m68k_op_sf_8_pi , 0xfff8, 0x51d8, 12}, {m68k_op_sf_8_pd , 0xfff8, 0x51e0, 14}, {m68k_op_sf_8_di , 0xfff8, 0x51e8, 16}, {m68k_op_sf_8_ix , 0xfff8, 0x51f0, 18}, {m68k_op_shi_8_d , 0xfff8, 0x52c0, 4}, {m68k_op_dbhi_16 , 0xfff8, 0x52c8, 12}, {m68k_op_shi_8_ai , 0xfff8, 0x52d0, 12}, {m68k_op_shi_8_pi , 0xfff8, 0x52d8, 12}, {m68k_op_shi_8_pd , 0xfff8, 0x52e0, 14}, {m68k_op_shi_8_di , 0xfff8, 0x52e8, 16}, {m68k_op_shi_8_ix , 0xfff8, 0x52f0, 18}, {m68k_op_sls_8_d , 0xfff8, 0x53c0, 4}, {m68k_op_dbls_16 , 0xfff8, 0x53c8, 12}, {m68k_op_sls_8_ai , 0xfff8, 0x53d0, 12}, {m68k_op_sls_8_pi , 0xfff8, 0x53d8, 12}, {m68k_op_sls_8_pd , 0xfff8, 0x53e0, 14}, {m68k_op_sls_8_di , 0xfff8, 0x53e8, 16}, {m68k_op_sls_8_ix , 0xfff8, 0x53f0, 18}, {m68k_op_scc_8_d , 0xfff8, 0x54c0, 4}, {m68k_op_dbcc_16 , 0xfff8, 0x54c8, 12}, {m68k_op_scc_8_ai , 0xfff8, 0x54d0, 12}, {m68k_op_scc_8_pi , 0xfff8, 0x54d8, 12}, {m68k_op_scc_8_pd , 0xfff8, 0x54e0, 14}, {m68k_op_scc_8_di , 0xfff8, 0x54e8, 16}, {m68k_op_scc_8_ix , 0xfff8, 0x54f0, 18}, {m68k_op_scs_8_d , 0xfff8, 0x55c0, 4}, {m68k_op_dbcs_16 , 0xfff8, 0x55c8, 12}, {m68k_op_scs_8_ai , 0xfff8, 0x55d0, 12}, {m68k_op_scs_8_pi , 0xfff8, 0x55d8, 12}, {m68k_op_scs_8_pd , 0xfff8, 0x55e0, 14}, {m68k_op_scs_8_di , 0xfff8, 0x55e8, 16}, {m68k_op_scs_8_ix , 0xfff8, 0x55f0, 18}, {m68k_op_sne_8_d , 0xfff8, 0x56c0, 4}, {m68k_op_dbne_16 , 0xfff8, 0x56c8, 12}, {m68k_op_sne_8_ai , 0xfff8, 0x56d0, 12}, {m68k_op_sne_8_pi , 0xfff8, 0x56d8, 12}, {m68k_op_sne_8_pd , 0xfff8, 0x56e0, 14}, {m68k_op_sne_8_di , 0xfff8, 0x56e8, 16}, {m68k_op_sne_8_ix , 0xfff8, 0x56f0, 18}, {m68k_op_seq_8_d , 0xfff8, 0x57c0, 4}, {m68k_op_dbeq_16 , 0xfff8, 0x57c8, 12}, {m68k_op_seq_8_ai , 0xfff8, 0x57d0, 12}, {m68k_op_seq_8_pi , 0xfff8, 0x57d8, 12}, {m68k_op_seq_8_pd , 0xfff8, 0x57e0, 14}, {m68k_op_seq_8_di , 0xfff8, 0x57e8, 16}, {m68k_op_seq_8_ix , 0xfff8, 0x57f0, 18}, {m68k_op_svc_8_d , 0xfff8, 0x58c0, 4}, {m68k_op_dbvc_16 , 0xfff8, 0x58c8, 12}, {m68k_op_svc_8_ai , 0xfff8, 0x58d0, 12}, {m68k_op_svc_8_pi , 0xfff8, 0x58d8, 12}, {m68k_op_svc_8_pd , 0xfff8, 0x58e0, 14}, {m68k_op_svc_8_di , 0xfff8, 0x58e8, 16}, {m68k_op_svc_8_ix , 0xfff8, 0x58f0, 18}, {m68k_op_svs_8_d , 0xfff8, 0x59c0, 4}, {m68k_op_dbvs_16 , 0xfff8, 0x59c8, 12}, {m68k_op_svs_8_ai , 0xfff8, 0x59d0, 12}, {m68k_op_svs_8_pi , 0xfff8, 0x59d8, 12}, {m68k_op_svs_8_pd , 0xfff8, 0x59e0, 14}, {m68k_op_svs_8_di , 0xfff8, 0x59e8, 16}, {m68k_op_svs_8_ix , 0xfff8, 0x59f0, 18}, {m68k_op_spl_8_d , 0xfff8, 0x5ac0, 4}, {m68k_op_dbpl_16 , 0xfff8, 0x5ac8, 12}, {m68k_op_spl_8_ai , 0xfff8, 0x5ad0, 12}, {m68k_op_spl_8_pi , 0xfff8, 0x5ad8, 12}, {m68k_op_spl_8_pd , 0xfff8, 0x5ae0, 14}, {m68k_op_spl_8_di , 0xfff8, 0x5ae8, 16}, {m68k_op_spl_8_ix , 0xfff8, 0x5af0, 18}, {m68k_op_smi_8_d , 0xfff8, 0x5bc0, 4}, {m68k_op_dbmi_16 , 0xfff8, 0x5bc8, 12}, {m68k_op_smi_8_ai , 0xfff8, 0x5bd0, 12}, {m68k_op_smi_8_pi , 0xfff8, 0x5bd8, 12}, {m68k_op_smi_8_pd , 0xfff8, 0x5be0, 14}, {m68k_op_smi_8_di , 0xfff8, 0x5be8, 16}, {m68k_op_smi_8_ix , 0xfff8, 0x5bf0, 18}, {m68k_op_sge_8_d , 0xfff8, 0x5cc0, 4}, {m68k_op_dbge_16 , 0xfff8, 0x5cc8, 12}, {m68k_op_sge_8_ai , 0xfff8, 0x5cd0, 12}, {m68k_op_sge_8_pi , 0xfff8, 0x5cd8, 12}, {m68k_op_sge_8_pd , 0xfff8, 0x5ce0, 14}, {m68k_op_sge_8_di , 0xfff8, 0x5ce8, 16}, {m68k_op_sge_8_ix , 0xfff8, 0x5cf0, 18}, {m68k_op_slt_8_d , 0xfff8, 0x5dc0, 4}, {m68k_op_dblt_16 , 0xfff8, 0x5dc8, 12}, {m68k_op_slt_8_ai , 0xfff8, 0x5dd0, 12}, {m68k_op_slt_8_pi , 0xfff8, 0x5dd8, 12}, {m68k_op_slt_8_pd , 0xfff8, 0x5de0, 14}, {m68k_op_slt_8_di , 0xfff8, 0x5de8, 16}, {m68k_op_slt_8_ix , 0xfff8, 0x5df0, 18}, {m68k_op_sgt_8_d , 0xfff8, 0x5ec0, 4}, {m68k_op_dbgt_16 , 0xfff8, 0x5ec8, 12}, {m68k_op_sgt_8_ai , 0xfff8, 0x5ed0, 12}, {m68k_op_sgt_8_pi , 0xfff8, 0x5ed8, 12}, {m68k_op_sgt_8_pd , 0xfff8, 0x5ee0, 14}, {m68k_op_sgt_8_di , 0xfff8, 0x5ee8, 16}, {m68k_op_sgt_8_ix , 0xfff8, 0x5ef0, 18}, {m68k_op_sle_8_d , 0xfff8, 0x5fc0, 4}, {m68k_op_dble_16 , 0xfff8, 0x5fc8, 12}, {m68k_op_sle_8_ai , 0xfff8, 0x5fd0, 12}, {m68k_op_sle_8_pi , 0xfff8, 0x5fd8, 12}, {m68k_op_sle_8_pd , 0xfff8, 0x5fe0, 14}, {m68k_op_sle_8_di , 0xfff8, 0x5fe8, 16}, {m68k_op_sle_8_ix , 0xfff8, 0x5ff0, 18}, {m68k_op_sbcd_8_mm_ax7 , 0xfff8, 0x8f08, 18}, {m68k_op_subx_8_mm_ax7 , 0xfff8, 0x9f08, 18}, {m68k_op_cmpm_8_ax7 , 0xfff8, 0xbf08, 12}, {m68k_op_abcd_8_mm_ax7 , 0xfff8, 0xcf08, 18}, {m68k_op_addx_8_mm_ax7 , 0xfff8, 0xdf08, 18}, {m68k_op_asr_16_ai , 0xfff8, 0xe0d0, 12}, {m68k_op_asr_16_pi , 0xfff8, 0xe0d8, 12}, {m68k_op_asr_16_pd , 0xfff8, 0xe0e0, 14}, {m68k_op_asr_16_di , 0xfff8, 0xe0e8, 16}, {m68k_op_asr_16_ix , 0xfff8, 0xe0f0, 18}, {m68k_op_asl_16_ai , 0xfff8, 0xe1d0, 12}, {m68k_op_asl_16_pi , 0xfff8, 0xe1d8, 12}, {m68k_op_asl_16_pd , 0xfff8, 0xe1e0, 14}, {m68k_op_asl_16_di , 0xfff8, 0xe1e8, 16}, {m68k_op_asl_16_ix , 0xfff8, 0xe1f0, 18}, {m68k_op_lsr_16_ai , 0xfff8, 0xe2d0, 12}, {m68k_op_lsr_16_pi , 0xfff8, 0xe2d8, 12}, {m68k_op_lsr_16_pd , 0xfff8, 0xe2e0, 14}, {m68k_op_lsr_16_di , 0xfff8, 0xe2e8, 16}, {m68k_op_lsr_16_ix , 0xfff8, 0xe2f0, 18}, {m68k_op_lsl_16_ai , 0xfff8, 0xe3d0, 12}, {m68k_op_lsl_16_pi , 0xfff8, 0xe3d8, 12}, {m68k_op_lsl_16_pd , 0xfff8, 0xe3e0, 14}, {m68k_op_lsl_16_di , 0xfff8, 0xe3e8, 16}, {m68k_op_lsl_16_ix , 0xfff8, 0xe3f0, 18}, {m68k_op_roxr_16_ai , 0xfff8, 0xe4d0, 12}, {m68k_op_roxr_16_pi , 0xfff8, 0xe4d8, 12}, {m68k_op_roxr_16_pd , 0xfff8, 0xe4e0, 14}, {m68k_op_roxr_16_di , 0xfff8, 0xe4e8, 16}, {m68k_op_roxr_16_ix , 0xfff8, 0xe4f0, 18}, {m68k_op_roxl_16_ai , 0xfff8, 0xe5d0, 12}, {m68k_op_roxl_16_pi , 0xfff8, 0xe5d8, 12}, {m68k_op_roxl_16_pd , 0xfff8, 0xe5e0, 14}, {m68k_op_roxl_16_di , 0xfff8, 0xe5e8, 16}, {m68k_op_roxl_16_ix , 0xfff8, 0xe5f0, 18}, {m68k_op_ror_16_ai , 0xfff8, 0xe6d0, 12}, {m68k_op_ror_16_pi , 0xfff8, 0xe6d8, 12}, {m68k_op_ror_16_pd , 0xfff8, 0xe6e0, 14}, {m68k_op_ror_16_di , 0xfff8, 0xe6e8, 16}, {m68k_op_ror_16_ix , 0xfff8, 0xe6f0, 18}, {m68k_op_rol_16_ai , 0xfff8, 0xe7d0, 12}, {m68k_op_rol_16_pi , 0xfff8, 0xe7d8, 12}, {m68k_op_rol_16_pd , 0xfff8, 0xe7e0, 14}, {m68k_op_rol_16_di , 0xfff8, 0xe7e8, 16}, {m68k_op_rol_16_ix , 0xfff8, 0xe7f0, 18}, {m68k_op_ori_8_pi7 , 0xffff, 0x001f, 16}, {m68k_op_ori_8_pd7 , 0xffff, 0x0027, 18}, {m68k_op_ori_8_aw , 0xffff, 0x0038, 20}, {m68k_op_ori_8_al , 0xffff, 0x0039, 24}, {m68k_op_ori_16_toc , 0xffff, 0x003c, 20}, {m68k_op_ori_16_aw , 0xffff, 0x0078, 20}, {m68k_op_ori_16_al , 0xffff, 0x0079, 24}, {m68k_op_ori_16_tos , 0xffff, 0x007c, 20}, {m68k_op_ori_32_aw , 0xffff, 0x00b8, 32}, {m68k_op_ori_32_al , 0xffff, 0x00b9, 36}, {m68k_op_andi_8_pi7 , 0xffff, 0x021f, 16}, {m68k_op_andi_8_pd7 , 0xffff, 0x0227, 18}, {m68k_op_andi_8_aw , 0xffff, 0x0238, 20}, {m68k_op_andi_8_al , 0xffff, 0x0239, 24}, {m68k_op_andi_16_toc , 0xffff, 0x023c, 20}, {m68k_op_andi_16_aw , 0xffff, 0x0278, 20}, {m68k_op_andi_16_al , 0xffff, 0x0279, 24}, {m68k_op_andi_16_tos , 0xffff, 0x027c, 20}, {m68k_op_andi_32_aw , 0xffff, 0x02b8, 32}, {m68k_op_andi_32_al , 0xffff, 0x02b9, 36}, {m68k_op_subi_8_pi7 , 0xffff, 0x041f, 16}, {m68k_op_subi_8_pd7 , 0xffff, 0x0427, 18}, {m68k_op_subi_8_aw , 0xffff, 0x0438, 20}, {m68k_op_subi_8_al , 0xffff, 0x0439, 24}, {m68k_op_subi_16_aw , 0xffff, 0x0478, 20}, {m68k_op_subi_16_al , 0xffff, 0x0479, 24}, {m68k_op_subi_32_aw , 0xffff, 0x04b8, 32}, {m68k_op_subi_32_al , 0xffff, 0x04b9, 36}, {m68k_op_addi_8_pi7 , 0xffff, 0x061f, 16}, {m68k_op_addi_8_pd7 , 0xffff, 0x0627, 18}, {m68k_op_addi_8_aw , 0xffff, 0x0638, 20}, {m68k_op_addi_8_al , 0xffff, 0x0639, 24}, {m68k_op_addi_16_aw , 0xffff, 0x0678, 20}, {m68k_op_addi_16_al , 0xffff, 0x0679, 24}, {m68k_op_addi_32_aw , 0xffff, 0x06b8, 32}, {m68k_op_addi_32_al , 0xffff, 0x06b9, 36}, {m68k_op_btst_8_s_pi7 , 0xffff, 0x081f, 12}, {m68k_op_btst_8_s_pd7 , 0xffff, 0x0827, 14}, {m68k_op_btst_8_s_aw , 0xffff, 0x0838, 16}, {m68k_op_btst_8_s_al , 0xffff, 0x0839, 20}, {m68k_op_btst_8_s_pcdi , 0xffff, 0x083a, 16}, {m68k_op_btst_8_s_pcix , 0xffff, 0x083b, 18}, {m68k_op_bchg_8_s_pi7 , 0xffff, 0x085f, 16}, {m68k_op_bchg_8_s_pd7 , 0xffff, 0x0867, 18}, {m68k_op_bchg_8_s_aw , 0xffff, 0x0878, 20}, {m68k_op_bchg_8_s_al , 0xffff, 0x0879, 24}, {m68k_op_bclr_8_s_pi7 , 0xffff, 0x089f, 16}, {m68k_op_bclr_8_s_pd7 , 0xffff, 0x08a7, 18}, {m68k_op_bclr_8_s_aw , 0xffff, 0x08b8, 20}, {m68k_op_bclr_8_s_al , 0xffff, 0x08b9, 24}, {m68k_op_bset_8_s_pi7 , 0xffff, 0x08df, 16}, {m68k_op_bset_8_s_pd7 , 0xffff, 0x08e7, 18}, {m68k_op_bset_8_s_aw , 0xffff, 0x08f8, 20}, {m68k_op_bset_8_s_al , 0xffff, 0x08f9, 24}, {m68k_op_eori_8_pi7 , 0xffff, 0x0a1f, 16}, {m68k_op_eori_8_pd7 , 0xffff, 0x0a27, 18}, {m68k_op_eori_8_aw , 0xffff, 0x0a38, 20}, {m68k_op_eori_8_al , 0xffff, 0x0a39, 24}, {m68k_op_eori_16_toc , 0xffff, 0x0a3c, 20}, {m68k_op_eori_16_aw , 0xffff, 0x0a78, 20}, {m68k_op_eori_16_al , 0xffff, 0x0a79, 24}, {m68k_op_eori_16_tos , 0xffff, 0x0a7c, 20}, {m68k_op_eori_32_aw , 0xffff, 0x0ab8, 32}, {m68k_op_eori_32_al , 0xffff, 0x0ab9, 36}, {m68k_op_cmpi_8_pi7 , 0xffff, 0x0c1f, 12}, {m68k_op_cmpi_8_pd7 , 0xffff, 0x0c27, 14}, {m68k_op_cmpi_8_aw , 0xffff, 0x0c38, 16}, {m68k_op_cmpi_8_al , 0xffff, 0x0c39, 20}, {m68k_op_cmpi_16_aw , 0xffff, 0x0c78, 16}, {m68k_op_cmpi_16_al , 0xffff, 0x0c79, 20}, {m68k_op_cmpi_32_aw , 0xffff, 0x0cb8, 24}, {m68k_op_cmpi_32_al , 0xffff, 0x0cb9, 28}, {m68k_op_move_8_aw_pi7 , 0xffff, 0x11df, 16}, {m68k_op_move_8_aw_pd7 , 0xffff, 0x11e7, 18}, {m68k_op_move_8_aw_aw , 0xffff, 0x11f8, 20}, {m68k_op_move_8_aw_al , 0xffff, 0x11f9, 24}, {m68k_op_move_8_aw_pcdi , 0xffff, 0x11fa, 20}, {m68k_op_move_8_aw_pcix , 0xffff, 0x11fb, 22}, {m68k_op_move_8_aw_i , 0xffff, 0x11fc, 16}, {m68k_op_move_8_al_pi7 , 0xffff, 0x13df, 20}, {m68k_op_move_8_al_pd7 , 0xffff, 0x13e7, 22}, {m68k_op_move_8_al_aw , 0xffff, 0x13f8, 24}, {m68k_op_move_8_al_al , 0xffff, 0x13f9, 28}, {m68k_op_move_8_al_pcdi , 0xffff, 0x13fa, 24}, {m68k_op_move_8_al_pcix , 0xffff, 0x13fb, 26}, {m68k_op_move_8_al_i , 0xffff, 0x13fc, 20}, {m68k_op_move_8_pi7_pi7 , 0xffff, 0x1edf, 12}, {m68k_op_move_8_pi7_pd7 , 0xffff, 0x1ee7, 14}, {m68k_op_move_8_pi7_aw , 0xffff, 0x1ef8, 16}, {m68k_op_move_8_pi7_al , 0xffff, 0x1ef9, 20}, {m68k_op_move_8_pi7_pcdi , 0xffff, 0x1efa, 16}, {m68k_op_move_8_pi7_pcix , 0xffff, 0x1efb, 18}, {m68k_op_move_8_pi7_i , 0xffff, 0x1efc, 12}, {m68k_op_move_8_pd7_pi7 , 0xffff, 0x1f1f, 12}, {m68k_op_move_8_pd7_pd7 , 0xffff, 0x1f27, 14}, {m68k_op_move_8_pd7_aw , 0xffff, 0x1f38, 16}, {m68k_op_move_8_pd7_al , 0xffff, 0x1f39, 20}, {m68k_op_move_8_pd7_pcdi , 0xffff, 0x1f3a, 16}, {m68k_op_move_8_pd7_pcix , 0xffff, 0x1f3b, 18}, {m68k_op_move_8_pd7_i , 0xffff, 0x1f3c, 12}, {m68k_op_move_32_aw_aw , 0xffff, 0x21f8, 28}, {m68k_op_move_32_aw_al , 0xffff, 0x21f9, 32}, {m68k_op_move_32_aw_pcdi , 0xffff, 0x21fa, 28}, {m68k_op_move_32_aw_pcix , 0xffff, 0x21fb, 30}, {m68k_op_move_32_aw_i , 0xffff, 0x21fc, 24}, {m68k_op_move_32_al_aw , 0xffff, 0x23f8, 32}, {m68k_op_move_32_al_al , 0xffff, 0x23f9, 36}, {m68k_op_move_32_al_pcdi , 0xffff, 0x23fa, 32}, {m68k_op_move_32_al_pcix , 0xffff, 0x23fb, 34}, {m68k_op_move_32_al_i , 0xffff, 0x23fc, 28}, {m68k_op_move_16_aw_aw , 0xffff, 0x31f8, 20}, {m68k_op_move_16_aw_al , 0xffff, 0x31f9, 24}, {m68k_op_move_16_aw_pcdi , 0xffff, 0x31fa, 20}, {m68k_op_move_16_aw_pcix , 0xffff, 0x31fb, 22}, {m68k_op_move_16_aw_i , 0xffff, 0x31fc, 16}, {m68k_op_move_16_al_aw , 0xffff, 0x33f8, 24}, {m68k_op_move_16_al_al , 0xffff, 0x33f9, 28}, {m68k_op_move_16_al_pcdi , 0xffff, 0x33fa, 24}, {m68k_op_move_16_al_pcix , 0xffff, 0x33fb, 26}, {m68k_op_move_16_al_i , 0xffff, 0x33fc, 20}, {m68k_op_negx_8_pi7 , 0xffff, 0x401f, 12}, {m68k_op_negx_8_pd7 , 0xffff, 0x4027, 14}, {m68k_op_negx_8_aw , 0xffff, 0x4038, 16}, {m68k_op_negx_8_al , 0xffff, 0x4039, 20}, {m68k_op_negx_16_aw , 0xffff, 0x4078, 16}, {m68k_op_negx_16_al , 0xffff, 0x4079, 20}, {m68k_op_negx_32_aw , 0xffff, 0x40b8, 24}, {m68k_op_negx_32_al , 0xffff, 0x40b9, 28}, {m68k_op_move_16_frs_aw , 0xffff, 0x40f8, 16}, {m68k_op_move_16_frs_al , 0xffff, 0x40f9, 20}, {m68k_op_clr_8_pi7 , 0xffff, 0x421f, 12}, {m68k_op_clr_8_pd7 , 0xffff, 0x4227, 14}, {m68k_op_clr_8_aw , 0xffff, 0x4238, 16}, {m68k_op_clr_8_al , 0xffff, 0x4239, 20}, {m68k_op_clr_16_aw , 0xffff, 0x4278, 16}, {m68k_op_clr_16_al , 0xffff, 0x4279, 20}, {m68k_op_clr_32_aw , 0xffff, 0x42b8, 24}, {m68k_op_clr_32_al , 0xffff, 0x42b9, 28}, {m68k_op_neg_8_pi7 , 0xffff, 0x441f, 12}, {m68k_op_neg_8_pd7 , 0xffff, 0x4427, 14}, {m68k_op_neg_8_aw , 0xffff, 0x4438, 16}, {m68k_op_neg_8_al , 0xffff, 0x4439, 20}, {m68k_op_neg_16_aw , 0xffff, 0x4478, 16}, {m68k_op_neg_16_al , 0xffff, 0x4479, 20}, {m68k_op_neg_32_aw , 0xffff, 0x44b8, 24}, {m68k_op_neg_32_al , 0xffff, 0x44b9, 28}, {m68k_op_move_16_toc_aw , 0xffff, 0x44f8, 20}, {m68k_op_move_16_toc_al , 0xffff, 0x44f9, 24}, {m68k_op_move_16_toc_pcdi , 0xffff, 0x44fa, 20}, {m68k_op_move_16_toc_pcix , 0xffff, 0x44fb, 22}, {m68k_op_move_16_toc_i , 0xffff, 0x44fc, 16}, {m68k_op_not_8_pi7 , 0xffff, 0x461f, 12}, {m68k_op_not_8_pd7 , 0xffff, 0x4627, 14}, {m68k_op_not_8_aw , 0xffff, 0x4638, 16}, {m68k_op_not_8_al , 0xffff, 0x4639, 20}, {m68k_op_not_16_aw , 0xffff, 0x4678, 16}, {m68k_op_not_16_al , 0xffff, 0x4679, 20}, {m68k_op_not_32_aw , 0xffff, 0x46b8, 24}, {m68k_op_not_32_al , 0xffff, 0x46b9, 28}, {m68k_op_move_16_tos_aw , 0xffff, 0x46f8, 20}, {m68k_op_move_16_tos_al , 0xffff, 0x46f9, 24}, {m68k_op_move_16_tos_pcdi , 0xffff, 0x46fa, 20}, {m68k_op_move_16_tos_pcix , 0xffff, 0x46fb, 22}, {m68k_op_move_16_tos_i , 0xffff, 0x46fc, 16}, {m68k_op_nbcd_8_pi7 , 0xffff, 0x481f, 12}, {m68k_op_nbcd_8_pd7 , 0xffff, 0x4827, 14}, {m68k_op_nbcd_8_aw , 0xffff, 0x4838, 16}, {m68k_op_nbcd_8_al , 0xffff, 0x4839, 20}, {m68k_op_pea_32_aw , 0xffff, 0x4878, 16}, {m68k_op_pea_32_al , 0xffff, 0x4879, 20}, {m68k_op_pea_32_pcdi , 0xffff, 0x487a, 16}, {m68k_op_pea_32_pcix , 0xffff, 0x487b, 20}, {m68k_op_movem_16_re_aw , 0xffff, 0x48b8, 12}, {m68k_op_movem_16_re_al , 0xffff, 0x48b9, 16}, {m68k_op_movem_32_re_aw , 0xffff, 0x48f8, 12}, {m68k_op_movem_32_re_al , 0xffff, 0x48f9, 16}, {m68k_op_tst_8_pi7 , 0xffff, 0x4a1f, 8}, {m68k_op_tst_8_pd7 , 0xffff, 0x4a27, 10}, {m68k_op_tst_8_aw , 0xffff, 0x4a38, 12}, {m68k_op_tst_8_al , 0xffff, 0x4a39, 16}, {m68k_op_tst_16_aw , 0xffff, 0x4a78, 12}, {m68k_op_tst_16_al , 0xffff, 0x4a79, 16}, {m68k_op_tst_32_aw , 0xffff, 0x4ab8, 16}, {m68k_op_tst_32_al , 0xffff, 0x4ab9, 20}, {m68k_op_tas_8_pi7 , 0xffff, 0x4adf, 18}, {m68k_op_tas_8_pd7 , 0xffff, 0x4ae7, 20}, {m68k_op_tas_8_aw , 0xffff, 0x4af8, 22}, {m68k_op_tas_8_al , 0xffff, 0x4af9, 26}, {m68k_op_illegal , 0xffff, 0x4afc, 4}, {m68k_op_movem_16_er_aw , 0xffff, 0x4cb8, 16}, {m68k_op_movem_16_er_al , 0xffff, 0x4cb9, 20}, {m68k_op_movem_16_er_pcdi , 0xffff, 0x4cba, 16}, {m68k_op_movem_16_er_pcix , 0xffff, 0x4cbb, 18}, {m68k_op_movem_32_er_aw , 0xffff, 0x4cf8, 16}, {m68k_op_movem_32_er_al , 0xffff, 0x4cf9, 20}, {m68k_op_movem_32_er_pcdi , 0xffff, 0x4cfa, 16}, {m68k_op_movem_32_er_pcix , 0xffff, 0x4cfb, 18}, {m68k_op_link_16_a7 , 0xffff, 0x4e57, 16}, {m68k_op_unlk_32_a7 , 0xffff, 0x4e5f, 12}, {m68k_op_reset , 0xffff, 0x4e70, 0}, {m68k_op_nop , 0xffff, 0x4e71, 4}, {m68k_op_stop , 0xffff, 0x4e72, 4}, {m68k_op_rte_32 , 0xffff, 0x4e73, 20}, {m68k_op_rts_32 , 0xffff, 0x4e75, 16}, {m68k_op_trapv , 0xffff, 0x4e76, 4}, {m68k_op_rtr_32 , 0xffff, 0x4e77, 20}, {m68k_op_jsr_32_aw , 0xffff, 0x4eb8, 18}, {m68k_op_jsr_32_al , 0xffff, 0x4eb9, 20}, {m68k_op_jsr_32_pcdi , 0xffff, 0x4eba, 18}, {m68k_op_jsr_32_pcix , 0xffff, 0x4ebb, 22}, {m68k_op_jmp_32_aw , 0xffff, 0x4ef8, 10}, {m68k_op_jmp_32_al , 0xffff, 0x4ef9, 12}, {m68k_op_jmp_32_pcdi , 0xffff, 0x4efa, 10}, {m68k_op_jmp_32_pcix , 0xffff, 0x4efb, 14}, {m68k_op_st_8_pi7 , 0xffff, 0x50df, 12}, {m68k_op_st_8_pd7 , 0xffff, 0x50e7, 14}, {m68k_op_st_8_aw , 0xffff, 0x50f8, 16}, {m68k_op_st_8_al , 0xffff, 0x50f9, 20}, {m68k_op_sf_8_pi7 , 0xffff, 0x51df, 12}, {m68k_op_sf_8_pd7 , 0xffff, 0x51e7, 14}, {m68k_op_sf_8_aw , 0xffff, 0x51f8, 16}, {m68k_op_sf_8_al , 0xffff, 0x51f9, 20}, {m68k_op_shi_8_pi7 , 0xffff, 0x52df, 12}, {m68k_op_shi_8_pd7 , 0xffff, 0x52e7, 14}, {m68k_op_shi_8_aw , 0xffff, 0x52f8, 16}, {m68k_op_shi_8_al , 0xffff, 0x52f9, 20}, {m68k_op_sls_8_pi7 , 0xffff, 0x53df, 12}, {m68k_op_sls_8_pd7 , 0xffff, 0x53e7, 14}, {m68k_op_sls_8_aw , 0xffff, 0x53f8, 16}, {m68k_op_sls_8_al , 0xffff, 0x53f9, 20}, {m68k_op_scc_8_pi7 , 0xffff, 0x54df, 12}, {m68k_op_scc_8_pd7 , 0xffff, 0x54e7, 14}, {m68k_op_scc_8_aw , 0xffff, 0x54f8, 16}, {m68k_op_scc_8_al , 0xffff, 0x54f9, 20}, {m68k_op_scs_8_pi7 , 0xffff, 0x55df, 12}, {m68k_op_scs_8_pd7 , 0xffff, 0x55e7, 14}, {m68k_op_scs_8_aw , 0xffff, 0x55f8, 16}, {m68k_op_scs_8_al , 0xffff, 0x55f9, 20}, {m68k_op_sne_8_pi7 , 0xffff, 0x56df, 12}, {m68k_op_sne_8_pd7 , 0xffff, 0x56e7, 14}, {m68k_op_sne_8_aw , 0xffff, 0x56f8, 16}, {m68k_op_sne_8_al , 0xffff, 0x56f9, 20}, {m68k_op_seq_8_pi7 , 0xffff, 0x57df, 12}, {m68k_op_seq_8_pd7 , 0xffff, 0x57e7, 14}, {m68k_op_seq_8_aw , 0xffff, 0x57f8, 16}, {m68k_op_seq_8_al , 0xffff, 0x57f9, 20}, {m68k_op_svc_8_pi7 , 0xffff, 0x58df, 12}, {m68k_op_svc_8_pd7 , 0xffff, 0x58e7, 14}, {m68k_op_svc_8_aw , 0xffff, 0x58f8, 16}, {m68k_op_svc_8_al , 0xffff, 0x58f9, 20}, {m68k_op_svs_8_pi7 , 0xffff, 0x59df, 12}, {m68k_op_svs_8_pd7 , 0xffff, 0x59e7, 14}, {m68k_op_svs_8_aw , 0xffff, 0x59f8, 16}, {m68k_op_svs_8_al , 0xffff, 0x59f9, 20}, {m68k_op_spl_8_pi7 , 0xffff, 0x5adf, 12}, {m68k_op_spl_8_pd7 , 0xffff, 0x5ae7, 14}, {m68k_op_spl_8_aw , 0xffff, 0x5af8, 16}, {m68k_op_spl_8_al , 0xffff, 0x5af9, 20}, {m68k_op_smi_8_pi7 , 0xffff, 0x5bdf, 12}, {m68k_op_smi_8_pd7 , 0xffff, 0x5be7, 14}, {m68k_op_smi_8_aw , 0xffff, 0x5bf8, 16}, {m68k_op_smi_8_al , 0xffff, 0x5bf9, 20}, {m68k_op_sge_8_pi7 , 0xffff, 0x5cdf, 12}, {m68k_op_sge_8_pd7 , 0xffff, 0x5ce7, 14}, {m68k_op_sge_8_aw , 0xffff, 0x5cf8, 16}, {m68k_op_sge_8_al , 0xffff, 0x5cf9, 20}, {m68k_op_slt_8_pi7 , 0xffff, 0x5ddf, 12}, {m68k_op_slt_8_pd7 , 0xffff, 0x5de7, 14}, {m68k_op_slt_8_aw , 0xffff, 0x5df8, 16}, {m68k_op_slt_8_al , 0xffff, 0x5df9, 20}, {m68k_op_sgt_8_pi7 , 0xffff, 0x5edf, 12}, {m68k_op_sgt_8_pd7 , 0xffff, 0x5ee7, 14}, {m68k_op_sgt_8_aw , 0xffff, 0x5ef8, 16}, {m68k_op_sgt_8_al , 0xffff, 0x5ef9, 20}, {m68k_op_sle_8_pi7 , 0xffff, 0x5fdf, 12}, {m68k_op_sle_8_pd7 , 0xffff, 0x5fe7, 14}, {m68k_op_sle_8_aw , 0xffff, 0x5ff8, 16}, {m68k_op_sle_8_al , 0xffff, 0x5ff9, 20}, {m68k_op_bra_16 , 0xffff, 0x6000, 10}, {m68k_op_bra_32 , 0xffff, 0x60ff, 10}, {m68k_op_bsr_16 , 0xffff, 0x6100, 18}, {m68k_op_bsr_32 , 0xffff, 0x61ff, 18}, {m68k_op_bhi_16 , 0xffff, 0x6200, 10}, {m68k_op_bhi_32 , 0xffff, 0x62ff, 10}, {m68k_op_bls_16 , 0xffff, 0x6300, 10}, {m68k_op_bls_32 , 0xffff, 0x63ff, 10}, {m68k_op_bcc_16 , 0xffff, 0x6400, 10}, {m68k_op_bcc_32 , 0xffff, 0x64ff, 10}, {m68k_op_bcs_16 , 0xffff, 0x6500, 10}, {m68k_op_bcs_32 , 0xffff, 0x65ff, 10}, {m68k_op_bne_16 , 0xffff, 0x6600, 10}, {m68k_op_bne_32 , 0xffff, 0x66ff, 10}, {m68k_op_beq_16 , 0xffff, 0x6700, 10}, {m68k_op_beq_32 , 0xffff, 0x67ff, 10}, {m68k_op_bvc_16 , 0xffff, 0x6800, 10}, {m68k_op_bvc_32 , 0xffff, 0x68ff, 10}, {m68k_op_bvs_16 , 0xffff, 0x6900, 10}, {m68k_op_bvs_32 , 0xffff, 0x69ff, 10}, {m68k_op_bpl_16 , 0xffff, 0x6a00, 10}, {m68k_op_bpl_32 , 0xffff, 0x6aff, 10}, {m68k_op_bmi_16 , 0xffff, 0x6b00, 10}, {m68k_op_bmi_32 , 0xffff, 0x6bff, 10}, {m68k_op_bge_16 , 0xffff, 0x6c00, 10}, {m68k_op_bge_32 , 0xffff, 0x6cff, 10}, {m68k_op_blt_16 , 0xffff, 0x6d00, 10}, {m68k_op_blt_32 , 0xffff, 0x6dff, 10}, {m68k_op_bgt_16 , 0xffff, 0x6e00, 10}, {m68k_op_bgt_32 , 0xffff, 0x6eff, 10}, {m68k_op_ble_16 , 0xffff, 0x6f00, 10}, {m68k_op_ble_32 , 0xffff, 0x6fff, 10}, {m68k_op_sbcd_8_mm_axy7 , 0xffff, 0x8f0f, 18}, {m68k_op_subx_8_mm_axy7 , 0xffff, 0x9f0f, 18}, {m68k_op_cmpm_8_axy7 , 0xffff, 0xbf0f, 12}, {m68k_op_abcd_8_mm_axy7 , 0xffff, 0xcf0f, 18}, {m68k_op_addx_8_mm_axy7 , 0xffff, 0xdf0f, 18}, {m68k_op_asr_16_aw , 0xffff, 0xe0f8, 16}, {m68k_op_asr_16_al , 0xffff, 0xe0f9, 20}, {m68k_op_asl_16_aw , 0xffff, 0xe1f8, 16}, {m68k_op_asl_16_al , 0xffff, 0xe1f9, 20}, {m68k_op_lsr_16_aw , 0xffff, 0xe2f8, 16}, {m68k_op_lsr_16_al , 0xffff, 0xe2f9, 20}, {m68k_op_lsl_16_aw , 0xffff, 0xe3f8, 16}, {m68k_op_lsl_16_al , 0xffff, 0xe3f9, 20}, {m68k_op_roxr_16_aw , 0xffff, 0xe4f8, 16}, {m68k_op_roxr_16_al , 0xffff, 0xe4f9, 20}, {m68k_op_roxl_16_aw , 0xffff, 0xe5f8, 16}, {m68k_op_roxl_16_al , 0xffff, 0xe5f9, 20}, {m68k_op_ror_16_aw , 0xffff, 0xe6f8, 16}, {m68k_op_ror_16_al , 0xffff, 0xe6f9, 20}, {m68k_op_rol_16_aw , 0xffff, 0xe7f8, 16}, {m68k_op_rol_16_al , 0xffff, 0xe7f9, 20}, {0, 0, 0, 0} }; /* Build the opcode handler jump table */ static void m68ki_build_opcode_table(void) { const opcode_handler_struct *ostruct; int instr; int i; int j; for(i = 0; i < 0x10000; i++) { /* default to illegal */ m68ki_instruction_jump_table[i] = m68k_op_illegal; m68ki_cycles[i] = 4; } ostruct = &m68k_opcode_handler_table[0]; while(ostruct->mask != 0xff00) { for(i = 0;i < 0x10000;i++) { if((i & ostruct->mask) == ostruct->match) { m68ki_instruction_jump_table[i] = ostruct->opcode_handler; m68ki_cycles[i] = ostruct->cycles * MUL; } } ostruct++; } while(ostruct->mask == 0xff00) { for(i = 0;i <= 0xff;i++) { m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; m68ki_cycles[ostruct->match | i] = ostruct->cycles * MUL; } ostruct++; } while(ostruct->mask == 0xf1f8) { for(i = 0;i < 8;i++) { for(j = 0;j < 8;j++) { instr = ostruct->match | (i << 9) | j; m68ki_instruction_jump_table[instr] = ostruct->opcode_handler; m68ki_cycles[instr] = ostruct->cycles * MUL; } } ostruct++; } while(ostruct->mask == 0xfff0) { for(i = 0;i <= 0x0f;i++) { m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; m68ki_cycles[ostruct->match | i] = ostruct->cycles * MUL; } ostruct++; } while(ostruct->mask == 0xf1ff) { for(i = 0;i <= 0x07;i++) { m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler; m68ki_cycles[ostruct->match | (i << 9)] = ostruct->cycles * MUL; } ostruct++; } while(ostruct->mask == 0xfff8) { for(i = 0;i <= 0x07;i++) { m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler; m68ki_cycles[ostruct->match | i] = ostruct->cycles * MUL; } ostruct++; } while(ostruct->mask == 0xffff) { m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler; m68ki_cycles[ostruct->match] = ostruct->cycles * MUL; ostruct++; } } #endif /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ gcw0/osd.h000664 001750 001750 00000002214 12702465756 013515 0ustar00sergiosergio000000 000000 #ifndef _OSD_H_ #define _OSD_H_ #include #include #include #include #include #include #include "shared.h" #include "main.h" #include "config.h" #include "error.h" #include "unzip.h" #include "fileio.h" #define MAXPATHLEN 1024 #define DEFAULT_PATH "/.genplus" #define osd_input_update sdl_input_update #define GG_ROM "/usr/local/home/.genplus/lock-on/ggenie.bin" #define AR_ROM "/usr/local/home/.genplus/lock-on/areplay.bin" #define SK_ROM "/usr/local/home/.genplus/lock-on/sk.bin" #define SK_UPMEM "/usr/local/home/.genplus/lock-on/sk2chip.bin" #define CD_BIOS_US "/usr/local/home/.genplus/bios/bios_CD_U.bin" #define CD_BIOS_EU "/usr/local/home/.genplus/bios/bios_CD_E.bin" #define CD_BIOS_JP "/usr/local/home/.genplus/bios/bios_CD_J.bin" #define MD_BIOS "/usr/local/home/.genplus/bios/bios_MD.bin" #define MS_BIOS_US "/usr/local/home/.genplus/bios/bios_U.sms" #define MS_BIOS_EU "/usr/local/home/.genplus/bios/bios_E.sms" #define MS_BIOS_JP "/usr/local/home/.genplus/bios/bios_J.sms" #define GG_BIOS "/usr/local/home/.genplus/bios/bios.gg" #endif /* _OSD_H_ */ gcw0/opk-data/PICO.png000664 001750 001750 00000065710 12702465756 015531 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATx՝8έLI"utz#ZDNlEQE%.~?_Ǐ}]Zkue=dgw&<}?}FRvU,B+-_m$||lf಄clkmߦ܄a@0w^A67_|faP;$eZG> R ?ϟ?&I['d"s/, ˉvX)z[έ}׷7-}{oL-Źx)^{%@>< ߾}3`t 7koooF>ʄ0{mjyC;\v5X|(qW.y?FnfoDƹdo%V<~ .Fnq&O t"tq+ڐҒƷ;A"Bޛc/_XrRR onK^Sz2N[_~5ei5E7Wˬwd!9'|A9vkuZlj) `PNW#!:.~X6/MKn0>m zXೈ*y'5jFQ\&Es$JS&lʹa) ym F>6{f~ -%e D-¥9+8χcT.`lS|]h"dA~o2vݺ+V59:Z40J5*~v<[ Iϟ?ؕ oQ"GҀDI{[6} &~o}dS[?,Oi[νbj.q~hѦ"kB_^F d,Sn-{k?mgqIauSFfH׆J)6B<%s9=JLT"E_mRg Mb7fݻD!iQg鍞`mfZJ0^2-7h-p<ɭw#\blC$04Jy-4pUZT~uaRNKpUew3yv-;.{.70?$j-nT[~r" f{ɰ/<潟J[$u2:uthH jOs7/w\ilۖ̀@X' _kx W 6le=w0Mw ⢥[6I |xJ lF:g@zqo3Ŏ4LR\} 1~[o-Uu͓iE5Xx[;adcHi$^6.CU־_1kg2_W4eRKs˕y>}ӣ̴n?C#^ww;>1UI)G.W-"Jw *vnE?&D IsqYh 2l̯-VAyvMNt!G5t.J }%Kï0 lo`nU=] /u+jK"!]j~#ͥG6Ō,[Ȯ.йdFϥ_lt>pKO,K4^ =y6 V |M#&h8A_o+d6zq<K<| Tc8ҫO>URܢp|`D8zԖyw^ )9IW9t^tb] b!'Pg P#.uҐf~Vͯơ|G7; yuA#z Pwe2ˇ#X#$;m-RoN--brU.8=06*ؚ)ar4Of&.~ǍfIݼ-o< /۰Hm%C3Cm-YV/Tkn~8]*ipti.Qo,srːNՖeGQZ#j)^cܝNt*VPᡙ5z~դ5.̄t[CQ(ҽ nh_ƥ3%qF/xa8gUt q0AzcOv wYk墘;BEͬN".~yag۴9YuB\z} rEifx'c%^FdI/p^(R ?(%x8Fi}??k ~š MA繕$}| 4id5Nr"#]uOU׌ȜaD!Q2q 4M&,NN7Z0vJ2n~$`72|(~ ;!L"ZegEn L=&nf1(L0;بCF^5[nq1K74meijGS lkh3<ªKﲟ{-{z kF,Р"NQo6al`+ryw7' yS|3D)ZơpJ%7#N SJ6d[)E<Hb#ϖiwE\[z[RkF.+ydw+PX tzɍ2k0CJa Ťra r|M]"?^%- "gw-Ԯ [p-Onͅ~2D'b)Ple3yjRMV+M!K008Ǝ2m%L㜽<s{}6Xߠ!b':0;I?8ve&vv_ecغO3lfT%)̈o hq5ϟ?7m1BF05~kRm Or<Whϰk7CskC_b&F` Gk4קuI4hnBc`KZv}΀6βt߿޾ׯ( TX,,5tm.rUL$n Q}/_ԫv52|369ybij"׭֥:zom?\@By_kyOq=YFbVnSV%Mb=(F`d7|N~8iq^ש K ֡,6fݘ8IR] uZ?q۷^-ݬrutx"7lJE͇I+ Fbot["SfݡwuC(>iJulCSfrM,tKW#1/TD4O̲׿6KK̥νd_b%fWmz4M)ă Hb3A- 0 ǢIԞhRU =K'Lv-W90 |΅ *˧]?%V>Bu4Ɋf]6?f~rzX٨D2N;e>$^L5F ,K|MAt+31b{\{k+7p3bK0TP5ƛPcvv#Jz 36y8|E#oo2MXj*cNjIP#r-x0"Ϧ$jD8$p,URD Dvxݮu?x؈^<٥-&⤀%LbM- \ze'r%0sׯ@'j*@Z2pn}ć )D{ 6e-^DK&o/nu62zB^_t!nۑ6VtL:Uĥ/﫺ȼW^ D%b[j`wr"=<CYcwݿL<$דKssoDW32M麫GJUv[qeaD+@5'\a&oGѰYyH3s/Zn5DWw|i4\E+[.8|yc7JlTZ-;2f@s 0j{^k} KKd|zdp,b2. *^dAR#J8RM-R ?/[o߷L&h -u Z0SH$ҫn#3٥=o(?zU]JpeQeՓ6NEkE/``9E4Zz]ɔ@Ρ(hx)07-]ے"&%dE~sɀ`} U0U3|eD*(pl# խ (X QV y #fz`Eh`G0!T U=b,:3TTD`ݠFkS4#9.щ wͮ!-z׼}Eϩos8IaF*FwJ,ck`#3=St\"eLd\aAtVe#Q(uMTްL$EY1*e|5%5a`9,{=tXR\,  }slCŨTcxr e5 .ٯ4J|`W["J۳}G 4h'QW[iU0lW{,DX8ɨK: x `|nKEP$$55/&k/O29mɁ#0 IDAT殽E6) #QͶ ̔=s-+䁿;Ԁ*iE0fk 5;~tX'E,“-N_A-&Mb`ɒy"/Lh0\ՈLb'Y՜DR`+b_!1'[wuEh/stCf?D%6.Ջ_Rfuծ Mf ̞f֯^:W-8 j{ =7+ op o1Kt:NuW `ޯ I1_p~0.D!B}F*3C\zKJdI_YM-9Цam;u."9x7IO XnH"WSE\.oq? RN co%S>Es63`MvEWP="0jp&cQQ9t 6"[ܑj9uKԠPx$G(û~۠:6{xg k+VT#n d&EۅT+ hZq_Iv<^TD% [LC~4u,)u|llє xszE7|[2;tjs f<"3K/_֕63,'!A/Fo}f른"oYObԈϟ?ϟ?Ǐ߿||u -5oknb# g* ` :Oɔx%#C jE\H`d;2wnx@6r0*툺mJM?_~%ׯ_~!߿7 KM:W紴R[ ` Gy:(~% KOחŊ2rI[ȼW/@HCkY,~hV4kH|muw$u-7;VTUd2$_uTգ}ϯay+oT8U-H~,{qw o떐խ`8H,ѻn}]2od 09a-ĸg_uZUD5;y/)t"?0r!V.0l@uwA)ۺ_ڀv߿nZk{y # wOn{صƪ KiB))g>hTW eדI,JE=,,]^aji??խ(jU-~#2zapkigy^E9ty<0M1.AqQxThp߂<{ PA AD^3jŗ|<k: 6E/kC 0Mnp-!4g k+7l!RIjƱm۩ a\&ny^$e{āeC6iWpx]ײfZd}e|i,:%*" X=l~G$jo|~Q敏b rwbl9ZӼ,#k4AZS5`B [qzz,x9h]j3iM,7pI 6-.xȞѢ-M,F Iä4dv6 + ǩclə u:\<6^E|ڀQ}vn6z7%ںt0Ôl3hܚ\_[zwlg)w/ܽJz6aqbڗ$w]X jq `=ņe8 ?$5KN{ImU1ܺUd׾?:OћKeT~bGj^[fW>PiLs}_.ȶOHp l^m3tz=\yK^;0muS\Ł+"MU}nի%"^لR 0<>pb)'>UbvxR2]Dèn_=m|{(WsMɖe!u=![.[6ZuFxJw,4EF_ޫ \gzLM<12K0a4m2_߅nRa]1)#z~omF/;>b5FJh4b4[%Q/mT*ABk 84_1)ҳI|(AoüaR+s.CU8nj@D/Z`uͅ.,k0uDcThγasawUhXP]v\ն@Ȧԫ- ,m]nSui n:qj{[stB]~.c Ǚ_ _jGNvBHuM}*\K601CDK0AZlOMY 7FEI9jXbPvE܄ꙙA="f bphش; cӿOblbF }e/mA:ҮuEmx#÷m%so<ppu?HȭP7F^O١90S,FZW f~Ep(Vywخ]]e5vv}tjօpQ4BdmҽUZf^]ZoQws?{D76$2ϛA!So5h.VpfW9 baB#Vd~o2@e޲eJp+XkDjC5őy!U7]{;1 ~7;Ugx \l2,ۭ< O-ޠ~64~YB87 }6 /bFw6*.m*Qy6X6߾}{^Oc6$KqmN|Zӏg;ήYi_W! 'ܺ6wyvUvwg>ғiqqLi> 4? ' R,uI^ҏ ~gbC%ē v `!R~+R\CiM1wv FnRwҵ6;~q5|m2~.vՓNWgh^-y[7 UqnCYMY d& fbIlF80{2ƁCtsP Czɧ%8vxh)乐.GW}M>eKnk2ì_"t#q"zVn2l+Uu}ǻi`FuzGm]m }7Ҡn7/< T<'V=/_LM*Fa8;y$)$644]%诲b]%VkeDQ4_6[ڊ\ׁ&lYfsݑ]CwDF ;|t0[ْKVOw ).=L!:^{>?_"v/rX(L}G%F}n߿mlHEYSu?n5($)Mv `5-GB׊6f?FB`jp3YlT\ L6ToV !\sߖ0Z~B/i.з4,`J8|&Má5a up z lʭ)`%&!Ůs?4@n:!=b۰ng׭N`8U3y 0L1j2Rw$=z#*h-*!ȣ]b4[fO4D/# կ[0jAww#-GnvĶ`"n!sPpz]} U>-BfWVBFӧ Q[3C^*`(25 h~W830~2y-$%in8_=vcKaXoĥ7y ]G]|D1KSߖI-- զ!y0^=#X6"M:gwsح?պz;T+e-#?U{בV \do|4>=q_.g~ nFUKi9 _"O`hdZuK߉9b5fR[{y@J)kB%bo ?xZXփoa+zy&-nt "_unQku=H9BcWW]~C؍NM "Xv+& ބw=~\L#4-pIU8bRjhdu7:ey}8bCso{i4*F74vuB}*I,0;b2A2fbp%?TFe7/kY["0qXv&A\-H5\[dutM< 8yhdRtkVIy5 4`p/?V$,3RŏWBs^$.8Ui|RNШ.;h!]g}(1lSejɗ֔goGkm[ QiqaS3xFaZzEg5aEW/sstHTYF̟>Q'o.}$z܏}% Uvio3kg=^HDtȭ&*kBfn;N{M2mŋFxeO񛇏T[A+HʹK]Iw_d go[Ԉ^u -,iS=Cvx RQa:tzFAa~ fE[!O8 %Y-d ?EPW[ίɹjE*9ƇinC5EL/ 6B(*MBzqʗ>lhڦ𕩦tu]PxC~#IL lr8:-F/ySXz7 5{w+h~INИ&95c#2Dhॹ1R7" i6^+lLmӤFﲯ`v4UAclӳP[94cfY K?)=h *Rt؈ƧO%x[؊}(Gsۜ]ZKO V'j\o_{yWcVO3-n()m Vop Ȱ&N]oIؑZSfXNG~mFpJGh&9Dc7F!ۗMзuW$;ؿ+]ZLnyγx|:zZa3KY}o߾-Q}z!◚3>4 qMcmeU}ֱY<$M`K5Uk YĪȳ~Q)GT<;M=p*ya\rA& L41mqLfٕ ŷf|=鵥HguDo8iS!Pk7Yd4ǥ\)+|/ծvo2O;ú+s_vIeyVj31y)e#IY-p^[sYh'sqm 0pL&O" S?Zk K< [7Y*Fv'Ʌ"k6(.@C6m79Db!%t4^x)(J ']WI. Xtt޷n3Γ-=ղF&Vn4z%U=V}*Cf! 0FH͵9E IDAT.[Ȼd]/TO3 249yhi[ƗL4i 0v,XM2c7޼`~4{t _(+2*vpn4lSQcekTrinb{[efUWdKZ8VO0sI?~3nQ䥟k_|)՛/>!Cݡ:¥WGv52n  ItϹ@FЋ^KހYҮ/J)8.g aʱ˕\}BZs?i,K}l7#Z2#f y'rˡ"c5rX&-b^HҫX^FXb "cD튫#bQk~@m !%2H/Fϋ3 NeyѦ{Uupm4M^R&^mUG2/-e?&WeAAX[ L=%ѧ=-[oPI&޹JR*e*ގAh`]m/v}kF3*Y6{Pq5 T/}aJA|x =_9*_^VNu,`Ojxcn }ԗQ til5nťw0[eu謁Ud[3'W4\<ϗ 5:QC7iu_S/Fu-#[Ago0F}*? ӈ$ĺ~/0BbFMpw)wmo6< jWJ;>gEW3YU(F26v+l|El0K!!D4WaX79<]_]tΈmRPCKU+Br. q4bD)kk0>cVL=FEWLP\}uYBZdv6Deɽ؋xi7zK2еBV `{)r"(ơ]k2Zn|1*kN`[DšGn9s* c#7T|tO :c'Rw)E\P]J]]{YlJu3FP3; QeN .yK+|c\\=#4)Z,)9Wv\qB =K&o_W\O52oV|$H#%Vo.Q5Vsڙ DsNBU&V;y;TSJ8!sk4Ƞ>eLA3i]Iu"=[Ū.[5Ci6=ȕC-ʓIF9"-'֭zSךE4εҕ?ZUu]y#Z9D4& X)$gw=ZYKno5;LN9]RMGI^} nsn{~Og,A$VѵY϶ 4 *({Ң`DEUwTsx~ޔDf8J4/}*V#JW~iTm]A\U\aHdp,ikŬ:9x!iN-7u(r=C>M.EwDžgh51p3I(dU6$B`ll2e9K',Ne\anG3 ~#Rty\E)&y9tMjw{ql1/۴Pg(b^KwXkmCZVh"#8141EvsE5ٮ0uD_6iH!dpNP C($/&,MxZAuB_Qw_tcҚ "rNLPd9SG/Gk㰦~u툮 n0Sr ɻjg;Ud1TRDU`,cW$]*B 'Xi.0Ie#*Z:CCKܩڏ}5 Jצo<=ѱrr:~+RHT]\{[xxRQH5暮 ^ŒUV5P d1?[ĵKWB:*b_1'x^tznYD%:S&D`+Hg{ h:#u'*PA->m7LU(W>#&6,hyb k<+e3jE Id+*<3Q4]BЛ[VvV9le?KgWcj+ !YsRc)#:~` .ܰC6TM3:)s1Qj<.X_݌=hʃm8z|R,pSx8D64$?v < ZA)][ݸjb"ZDGƒToSwѥKն 2H Q-9VIJܕ5uen970DR y7q8hi9Rj- (j WqQͣr9jj=%x4Ԛ1M9| c|LULo(djj0*Fslxbi#]8Ggjx9S>L%O֜1[^ۂbZE쬪,'=sѩ7 4a&Grud'rS^Nww sk99v鴆{rnmؕbiI`47gP[xݜ&3>"UWQ9D]&PGo%S~_f˱SghIf~C 3Ծ</}۠ᵲaN%|.=S~|7+E&o(!rcUo9t/6Pd4Uj50#EzpdVؐrc<nŶ칠&jo*᷹_" WZ= RrF\Y8` ,dQ7#u*XTWlk>> |ب4ZC55({ fo ɖB+̈ 4z)<Q]oӈ%ϡ¹Zg⾧ynk`M7ܞ!:РUCe@izv+a㟒;:e$ڛܑ{skF6%x\|G+wTn 0w\s1DUkɮ^i>Z%E* $];-]bqƠ~c"I j55X,""$I&YE&Bd־%#cr0vWq)P ` GP5ܭ *Y 26-4F\ԋK ;z^E ~ynf9&hfP+ɢr F7zT9qK:8CJ;j; (d{"z4<=Q_ޯvׯ_}V~ti`ʢKPZ47qŌ-[\Σe !b;H GՉl[k ()}:bg.rfHN/9E|FXbB{n D03]q)U pN/22 휂7A%K(RtoKR t؍]{!J{d3 dõ}FLh ߕ'~,A Y&\yE|:. z.Q8h"M,Tc(]\5$el~g mP~D d[ez~R/EӤgyxh]\nxX2I^oiώŔBA>E{`Z@23ZFwS~GTnkA hu&:"Zh)tSȖ(|697m_W[zEsSUG1͜d"5(U3FH_Z%y7}%M>IsRqhQR pkY fPQ1åb 9䋬Y{&kl} f~mV}a?(kF*ƯxQ!gp P5q,p'# X{b4e5B͌ճ-Z(61Р5[~e`:%m۠|nU?@V9&Ґ2jcatO)rk78N{XTi7Ж%@6YE]UeQ,F~UY;i˞X'ڙx)P H-DMni(82+,*Nfw*:d- 횮J$jR EG ])&6@+7|=,JӇ<IRdܘ»>ki:iحY,GE4뫐],4orCkҵ|صsyvoرu:ʚ# UzSf!iE: %*U ޸؍nzeR5%Ii۱+ks{.nTwȯCB|z ]8TZh~{W]hғʞ?I=QސOztPv`{ ܽw(P&bA%]Tviُ[mB_s02$k<0݋&'lTj>yhE7O&9QH\ aT"sܽM JH&&oѳ' .j{0r`Ͻu$Tߔ&8 c08-W5mY>TVWT~% VIDAT ^?LX sM&ͷ]ѓ>,\{wuNuA7G6$I͒z`UhC:^n恷؃2OQ M4̀SVQzGzwFiЪUX=깦DvDqqʙ'BG6J$0`~rnfAb)e',WLn,0Z"$^(k$ /@#<dž#[&X:Irz3C"17Ϙ {<' 8\LԹ6u5Xd^PnV=Ź*Q:-RRn zT(cQ"]u53讥!ZlCvx>?nQ:NڎqX3 h"nCbsN"+Nn9]B\^+*} ;&EUS&ϝjߑFt_sĄ渺 RCyn3 EJr\\Uo'G~jڔܤ-#_EF&/ޒi2w~0%ZZ1IVcgFqa˶9A !hU,\og2T͒Rn`oJ6zKlAFEzyAUI&IU_ A"tLk(r""m4݆F,R{;U&D$} u/r'x,p$ $A76i˿2r DnCXeDYU><SQp(SXz|G W38.&vٻnK ئa0Hu k5kP%D=N,I!f^ݜS4jz& }[??9gēg%<+g_]xh{ۏ>/Nzלd5 ܪ与H2Sk1 )<ӍX|QJp=n{#in';iF ­f#cF^dnnwxNz 3.9 ƿ#+PU9Q!My7\ш&.Tbnx<8*XtgV"yHEl)KHSG7`[@4{jFzk$;"K7`!!qko3{e @E @S1dK6']eru{aSۅV #LwUSCcREɌASF3*J*KfCm0LkR69nOMJ);]f䝚`;4]vxlk7w㐨k>lF:іt`WoRM)D"ۀՖaf6!W3뽨- FR[NEƱ4rt8mR;pߵӰ\s/M{uğyzb3[ddc dصq3c(9x5]zv#RDXb JldW#x\ByI08%REaO׼)8J+(=Bނ.Ir NUq^} FaJ 0אQĶ `h<j亮~fʗ'DBT ggˌd10^ϫ8yKoAFSSS6'Q>0VyI!$(n>occU|[ JguH˛ kogVYl!1OKKtE]<P;CݵpeIo܎ Iҧ<7(|_"ukx]꺬Dm=*9 $nm"h t*{nEM5A"WYD 7Yϗ\ݼ`sCZE.üvۍQE5SIENDB`gcw0/opk-data/GG.png000664 001750 001750 00000062233 12702465756 015271 0ustar00sergiosergio000000 000000 PNG  IHDR@O*< pHYs  ~ IDATx}v8-(q<⬙\l<h@T!KyAl&^&"VJS)YZkR/JC^\.EDavy_.RJ;0Rޘx:adߗRIlrm理RTZo@_Ѵnjwn rQChoooU^ʛRJ?cfi]>\O:~i%sc(ֺO4 : a4p^s&Zr;NdFd* ӨZe-z}v'0P nw}wwW ozhQT(fC_D'i z>w[؅UQV QB-|OpPǷ7$VùASd.Իv_Hj90_~xT*"EE+Ҷ{<ԥ0Wmjn{}}Ei1j!5NCziQ0s!a=??Fb[GI!Ƴ巀-k0k]k}zzADnwww^J㇂_xDZQ`?,d?fq&# 奌t>u4YU;UE9H#7p8Zj5t۽ à (iN{ ^/guh'1+#ylJ?^PrQWQ}z<5.ޝB>(<;| 9{}}-4UoooEEdqLZJ\.19 MuUP Rt}{(,L#RSth*C5/JQ2T{/w Rt=>>ǧ'Dh9׎;apz?: vHX=y يBfݐJ#mBsWSP:{ p8`Nթi˦Mͫ79ن y0ɋBEvK)oadD2֙.-U=ݝMD44Dk9g{+Et:/4_~USI//>` ꤖscN62>V [9Qg\O Ya҈7%hX&l+$p_ fT!{P\EpP+FwZ+J<>==-}f~WWͤԁbHf[MO N1wW墪5(zaK~Csdcfq(Ș_4SƐ۔=?d̀|||Ԋk|he\s7\.OOOZjƷUMÔ̢-ȕBYmzuXxŠZջK31#[> "^I0nŴ<5|2&}ȃ>kfSD-&=9hG xN!YCͅ&Si @a[|>RN=k!z]}/L>)&{fJVl;1#&|0ug_[ՙ7 X3:4_O)=??khNi oxNw+ZfCDNikjkTʪoKuL|imn +൓ /CޔoׁLkbz*d )Ԣt>o_Ң53JuP)Ewxge׫Nhɸ)Js&"zxuA*!U+ S*d䝌į]ݣHGƘ٘c ȋu;^$cE&ߪ-<^7|Qخ[ I46JdZ"2.ë6 GՉ0M-1N7o/P-,'|-eU^o+zؠ?_% z WQ\:̫Hwv;:_]\ŵ[aYƭq҃d0 Qhq\8D=5WXzFeVV~m986dLJx{ eLǮCÉa)@SE;0SKadgbQE7=_Ee88^W3PK7-'O)ycGѭF9k]8]8F@J}q{`ox9cnsf/ZMn_FIhm6la%:,3F\٬jj0x'2l0Èfihy+1zFZ^0<{ kB|>W޳9ed BJx[燗f MGЋ41VzgU8Ě$?!AX٬apW/kdGBrfsL\Q9qzR= 8?n:-r]` dX8FvULIK % ^L2tVEd l6C'8|2=h}V9/ /0xYތYw94/xkݷfXM 2B[ 4_ׯ ^x/)čnz![p3YS{"A~raSW`82NRq*[ 7WqJǹ~́]N4b{. 4|0۰gAjVYBM/pЃmo[GªyƱbV33c7Pǹt.ws~0׃W>K)_|=h)!3dbe^V Ü~_T#i+c7kZ s1xXڽlb0FNWEiO6!Аؿ7uaӓ@餷5nR$9'?=+S+ӯ>IA eq;3W>x~!߃ӛZ*Icn<+2 y NϒGu?/z-zx勺}x߿_᭔+csƷӬEG,7R؊E;|ɪ(LTdp%4Cb2aC_=3/ׯ_֗?1z~ׯ,._]w%N$H,O$/E YYܯGo^լ TcX% )W p|oϟ?1&A3 G.|PK+߰}ͭuwrśdaz'$.4#pJTE3Kzߠ<==MŰQ$A)x߳L""*?OOOu:XFY]g&Drui\-E}~Mlyb#LWM! V,Ui*KW!/S1ÆR՟̀w$0| >: p>>>-ŹrE`Ҵ.'~N,b~ųrҿ է$0f8Ib.˟8ł%\t:ᫎB ˗~^.WƸZ@\7r^V|҃GF25^ho-AUvVi!zȸ_L)%mFxrC_%0 #C7QW8Fň[8}eO>c-ZHp#wViB+4qK0CvZSlbТܢD^Nx5}{{{~~֏ -idP k///QZϟ?Kr`ay\7gӆ{&ʟE;2yٽے[E9aR%^C0Ȣ3CaE2ŵV񾼼WθSyyyѯtsoׯ_G˕>@Q!$q9}kKG'{n)Z&xisP^c懇][~{{ x9 9 nZ}rzҢn5vHz)7a 2wl}On6^gS5ҙ'ˣS{K!rF>[|r81?~`Ks$װ4 p eܕ Qבd-S+joޟf#8,yL<@!྇Gl¸Eunaϟ?u'Ѻ~QY%up۷Z׫Td:}fK~ |,4z8.= mQĬxFO:#g-?`2Z7 0|ES:Y%mhY,寿r9N///bQ$Id9na !L}u6dAQY; ؛]J) ݷ7>ވh:q8ߴx(jq؂ߗ|6qSI4B0KlYl?\joKᒺ_ݖh=rC }^BS{?~qf" }H*屓7~=SQK¾i(w`(}s aLV!+Z Vn#֗]S'cWɱ)XѾIi,;  YH-1yP佉uΦdyWw}+.9$t+;E)e=x!^}^+hX]`<iB{cO'cՃZ Zau[ ƩV_#Woi^sEȉ㖹5E` _?J2LKh> XM1Mv-u?֗ؤš!v/Okɪ;[G0#ɨ-*hSU{`A8au?ͺ-'zhXf>/XĒ f01{@F{VJp[#Z_o[XbUq5j $E Zywǐ~o< ^Zy_8$|qRg9~||<|~yya>Γ0qg$`h{IiH#R0dX׻VȀ}~ƂS =32N#c$VhbH vVJȪz`nLa_oFu c_~nQE0Írߊm_CLό0ۤXECB*4#7_qc&9Tt3[i\žL?M\q~$1Puu89NRjd]:Ոj6e9w0vFR(nBWn;ۛޱFhy<7Ppoh|{{\.:֕jl4- ͖y%F3!"i7+ezʶ)+3္&`էl-bF7U؞ـ[čF^%[z@_t~KW!x>O~כ:bMdf&nZ*@6>m4wB2G=CS~xNI/|/q Z+)~t<ڙy?`l{z .ftH^<~?YWqp8{HAè;L%l3 &A/)7E l%^Ϳ/Ą> Rµac8jl3"D |YL ǣxazɽ a4s1+T fކ|E ֕gCƮ|#lkҷcV13Ыg0ofZzx' IDAT34 ?0ǐIL-D<60`R?-ТA9<'> tBm4J,d87C 㖦:nDpF/h+"zBW Qp<2c,X#޼;@Ddc q4XOCoXsFhp2u93U#^x:x`)aeq5Rgnpi[dZ___K)pL}LS,$93 7/2 Vo 7$-S'`tFHhysoδYwC+gPP%e:e)jJf-b'ٲPf}z7n8GeuJc`cW:j[k)2`э!y> حB<p"sg?ͭXT!}grJ֣ BfahF[X}V"2a-2L@?T~eplj79,$B4{ǰz52u}%.4=0عzULQwbi!cMrh}%+} S ba, bޔaqB64Yj] 1<+:gJC^W0YMÉKE[W~A2B\.wwwAs2]DiX<&W+  ӄ햆.!3-X\nE/B)u|r1KKR8,1wZj}z(֢g*}yUDQ:%3܆ֿ]\Kd07WV{NhD{j|Wtȴe<6Y,;/7$_#T(Zח/_ؙU#*6BFߵ1SRѬ)_]q|E/ j]u63`R̼N,IƼ]x{{ˮ~v||69-<餺oiOL.rv -n=b[}зha":ġ >ߕv4mbѤX.*݌z=_+9xd/S{V=$oK{'Q?tvv+0Wg@o NK)Nr%=xn81=\VkZu5;01V˔GChUخHtgfd(<53È;:b"ϛ W'\ @߆ -NekmB /9a!ĸ|y|slHDftb2OG /Oi‡@+aᠣooo~tY ҥ?~\Ǜ ZNĩfb(" ~D:2kIFsZسJ+_гU|BmWi1FGrL>??+GÏ?Zqh$ܚJV Sĵ hj+g:d_^$~6͇Y`N;1t=h9;x]Іj3t$3vwI#{qH70YuW;~[TDj9zCJK/x(QJ+}I+"v6Ph}b66&+z+O\w I+tx^6DjL+oʹ9xX@ZMƫ{u޻0.v=FڍwZ|?iEe{]&X|~}} r~y: eҗq/P'$2'TPWoҳLZӷ _ `SEc {O*eg?̚WǘGѕ\56}׸sR_EQs48l&3b:3˪!h[AQ ry~|g[1Fߔ\."R0oæK_l}@g=N)%ww.-wcP88罎fgŇiYLFH(N*;F^U fqD e0Cz^b¶CaT݉Xw#VP 4chiTؾZ|jX+YBS>~7ϸ:͌ru(Yub 2atC5vJ)K)z7P҅^FKv{TQib^q|#.mtVIJE3|/X@z8ǣl U Eឝ'|fqi ~XogQAuzk _2O'LxcS X2m{dkoO.&EdP nw<ErZWH~L?Iib>AV/$c d%S53^׸`}/:D9y^{xx0,&W@nNU`/Bu tE'iu֟("VϬ5z-N3Lcg7+M(%#d]gI/8'j櫱X=>>zLVo)cIe-bWxov?4} [#R%X33Qq`Ur;هxNBy`rgx_QH L-B;8:0aL5^kٜB>W0_=yk~vfx gS8k\?~|M%@={KCNU[X@;sߐ$!Ls`դ4t Cyqho`Jc(`j1  C4iP(|Kf|_s_wJOiλ7L(qFyEjau-[/3Wk-)&M+;Zڪ[LAon-2 U`=R!rf=- ߣ(t)? c0Hi. 7I׃GXI_y"iR2`o1eʹNJ;t3muz_qB5,S^$˗/d/2&B73Yv}x}aB,(i씐 ݺ2Vllh+#ީjnQ23%j%b煢V   -dwޞ `pG3Ӳ&&e1iʆ&IӝunĒ4H9R:kmVvGP|z兛g̸=s o܊;:(7 Cjd-鱌81L& 7 k~9B*Bϫ҆P:rֶ$1slhMHjlz{FL GO!S46qd|{g[O`dCOƛP~]f}Mx2Wyи_|Z! ?9`\&kϝ-ml!a+d4H79Wo'V#F>>7Yn"b/`i?J@ VPF=ɮ2XZ;gZ2m*o(L J)vFƒ鸰޴⅖ze7]ϔyK1|fBɒ /wmukL樠,7x~A =*_'h1!bT'n qEFY$yBȭ5o|-ޙVHF 4A5$ SHu3y o+G!Iip.E$^>L]c~@/߰bw4o%rߤdiƞVw5`UaF)C[aG^}a&`z~)y/~)ݤ(~ֻ)JgbKon~: mu K^-RSG 0H}:]sȰIPG Rذً&7g K[G--1aoiQgyiEdL']hPzөtFr'7m-<gsv1_+WϬӘ 6}X4-%],$N$- YM;J a)`p;J5);-]4kd2}@ڍ ,5.B7 uo1^WH;2dc7y\BS)#Sr'- gSt5ot݈~ 5O ߊEoK0è0f1 t"SږG3X\,M[ I3=ˆ|z=:nņකš?Z?ߛuEu1z1/!XhF͗z6Kr`+ rZ U9qjPE9 m.dq^A}k,avGa+ aP'5V+nMe$I?WHbN"26,-&0:b,"eg;W>L4VxZJcVzrng rN,o p~[;[ZO!??F|zΤ*F, >"#CՔB׼H r>[]Kދr)9 8OT7a@%u%3$ 2ф]bl^pśdx7[u"1I9K>YW]ɾ7q&M;s`-L"/"Lz3. )H=i_iOŷ^%%ɴKLKY zY2Y70XЗ@EJlqgTj-= j$djxg@i 躌A Vn^n2\+#O團̒|WnHlV/vH֦]Bp_FI%~Pǃc+cK\?N;ƥGkPh[巸4 {ojU:[?Sҟ0Yq"28B_de(5Y+9qN{Aqզ"C-H R^?{^޷ cCZߎ[5[fU475=H,G0+ dz"\0 #fi?r!.cXƜI@^6Z=2 E!И!WLFBZB/̬B׼V ybuQ'zokO8X.F2"0a8JFA=ǭ 4Z@.ƞ2~Mi#Vf˳b.,=&QJxl!'m0ߟdpj0{W]”/)*|Sh7h#;[j.bqƿzM+{ߨ[榥% 1V2klĚ W"lbo}--MB[sc,zȣN;Bqx+}L)2\kfSS(Bg蝕Z轮/^^nJJ0:ZM iA7\4%ݼp[_1SiY?WmH^줓8HKPVZ Q !f?ã NClho㧧VyL-EY *egQ,eN B $Z|>fd&[Je!T _"Icd-{6҃¯X!S KojP E̿FG lgyjd$;ik[1kg@1>N g3ϳ{* !C4y.ex鷵q^!jxó{OR+>߯XML i>Æ%oU㹕fsL|axE c0 F@?m!2wGX6kgL.ㄍ|*]KXDLqEt _?O yurׇF-WtZ,p0` ˔f|ei *2gBqKPn] y\Ê* mBT[:e;aV<.6,[b Jccuf[CfvJ"[\Wvvoa&ױ}e uQEnQ@lҪY5M+8;A,A)qtrmi߮;^$hOhV!^<̿>`2hOoyY:秔yENq#~:dU[Yl۲Qڸ)r_RCn^ϙd"83 d)(nS }3aZ+" t.)ӻVpx;Ky*BϸȺlksT9TFz,O7r.@bmaoi&i^4 GFeZx 4JC߭W\؊Z]ޯI-0L:Oh#a..KX^'c+{Fq0R̸h/ -;͕~B,c4">s #:!Wuƴ Y1= 0魪Jb1eN~LuAkYY/og#vY?(qH*&e6 !\p8eBi)TMs(>~Fumv^ao]a i.v=l+yP¥1q3+vWG0,Gy28OIXFW8| 7I܄B" %d2ÁM&ܢ0dp%0Uqk<'W+l^$]4}Zˬ 뿺:0 AQĺV$.4{Q:.<6' LDȋg@h-! ZF"/> _pc=c;KӄJEKY)2ͦH>c ]xW^0Jyc.dn̈7=KWIpvnw<___!e;6juyl {3᫐)wq9lX22^Uiة SDt *?p$qj\QܸM 6Y@:^4 NY 3, `OV}N鷯4pV00h+o42w^f^KPrcWӾՉ>|c]d |*B ?]ȐX+<B-eZR+5}&;:H`eViBK8uXi UV"U2޸onKI^ 3мv23ߞ9 ?͍7/ ԕ7*NRnVݑ6J o$5=IeUca鱹l=px6KJ@+VBBzఔPBŹ_uhl-nZ΢W(@1{!Nj1-9U3WfiΚ@׉;>˘l.c/ȴ#vƒYvH̉YDNDSWn$48Got,(+až9/O\yjas <ҿ.0o~iX[@Bnc Ȝu $|CW4;Wa<Pչ,hkފMLA+-1o Q€ ); F=@VffM!\=iH":]3ƜIW1C3\8H6۔D^jKdl03o彅ZާUNZ.nkY^ Vxny FL)Pܞ FExk[}< pJThv ɰkٱ9 1zM-^z3J-ҧW<0vVUn>I J X˹@Sx٭LzYэt0݇\ &WpC3&75huzlB-(,oѧpq*LU.5Ze:qvDaxƛV^t%_X>21G4_Ww_VcЛ S9(!pZ[oco+#xW}A C+4ԝyhd0 k錹*b@Ğ6qg@/xhXA=݂^cY6'mFōkSſax"f2)l,B@5i|*tՍPyS27RشО. M\)rvz7T'DymB# 4;GدS-ԭ:N yu3^eKR2{&e+Qr`_yKK+Dj`Ճ~hfprсY7jD"L0Ye|5oYğ۾=ɰ23Je^?Tl [܆"!vP5KZR+,(VFi}1iV+Mљ3 lHB@lu`1&~YBl}oE0 d%S0קkzxX1m#Y8sK޷B:.tc4 zl N9gL"{paF|Z 3VO#_" c)Z܄<%'TC|境y+Fa((gYrtgKƃ̥1ܦS؝Z^x Z$$ ކ!S11r>v ~?7Y FU{'HƬvJaDQ2Zʤ!VfC/+35B[c#@aXf+`@nJvEͦ J/f 0j.*_C{tʻ۸PV eJGk 0e vuɸLh U <ƃ/FCwRt'ؖ)87Mc`ik#d3}r|2? q+fd-:Jxd\~A(R[cÜ37݋<]0l@ Y\ 2gx cL]Ui~\ VyaB[B\|oy/@W E] }/`S,y*ɔi ߫0[𖐌TC#.fVM0f8qӘDe} ݈Bk2%|^A2o#K'oT)~۪e13iE\kQK Fn.^yc&Ӎuz}uz@BQFTWipnl0.Gߏ s롎g_~CFEE=e;/E>/o`u4P9Z38=Wa̰_l8`U[xv%q*a_^E7]1>J1ągӅB E6Y+v0{>[4pX^q4Euؽc'yND B8sT6w Iy>iM9_ ťl^OJO@@khs u VKɣsҷy?4`֓CjDx ah՛g~Rˬ$bgRZJ|cDgE7ط$S1[Ī[X-#:!qq(| 1L̖3Ut.HW_=0rˠ'Clt%yEըE*'[^"p&3Qæ&kN)@REJe^ ?YU9sz4&l !l+} ~qe[jzpE-m-7ƺ& ˪H΂,[ApfcK.W`{L.#%$ostlӌr=Em/8bf~mI齪A` wGJ_n# őiD=EעL ryk``J0%̂-\Z_QKs<۟ vn}Rh >lE_P~WÆD"p+%O2̖c&4Ju\N8/xL^}Ugaww(JGLKmBam'uz]C;+4iC°N f@Z`&Tn~(a88‡ʾ|*>cX %/^Ǔ Aܡz?43+]6O'ѐW9X {u^Ϋ` 83 6v.-|cfX9Yh~Ɓ( Z&g$ / q]1)ξf߄ ;do)% ]y#I2!F>_gUiÎ/lTpڸ -^jnryJ=FXknC#ou} FH۷o?l!یNϴdH/m6[pEkORx οz<3!6+9e1 r" [_Ȭm KM᭦DR!+މqToZv˽׽cxʸC(uձSk͒lU|VB1Z:DE,b iҳi4@Cښ&cmioٲ3t΁VgA2[Kq낌&0Ռ4WmA%>ewqb}w8y򁋮QT2E-h)EJ(!O s2NKވX?N Ζc\=;e} ](ŕ:J0L]GF=zF<Hv놅+͖aLF"!@0RF/<(ShkjmORn4g1-2 Q_ XG'SxKX rXh c?0Ъq^‚”6rxQYeN~mE(+_ͳuc ^Vbռ˟uu:1,1ty]ժ:ЦTD ⛱8p, E2ȍwe'lsyO+sJv\v{fo4ckϯ^#R6fOyCVo<@g}!'a(e:َHyeQ)YB7-y~|$[N27PuLM1H^S cr~n)/ dvPu:_1cb-[.kE[h";{-K ]X}@aopKC&%b0*IDAT ye¸;7 B l AîŸ ujx6Zא,`2L> ^e7:<RjƁs!~椮b-0:PGPOf.èB33Yn =f'Hhr߂ΤNwr.)_bXo6¤W f]8-в>ɆFeA {2䏣1 /Vzǐf#saɬ1\wte*zP6(,ED_J%t}uUsJLv2 YȦO ̴wwwBPE"5HKfVgTo}lvG ~4v $^unꎠ7ì5a&yɥ8 <[;X~j@uf: ΋*>W ~s_Wؐ˨ҹ3#sou;Э $ҷ$Э|L+j%h\ 9pKE'7ő:ІԒ2L͆UU`XNPO_)Z@bF5ؓYzsoEKΰs՝I;RníW$ɱaQi *I>Kf>AUa5i in$xlme Þn[k/3h[S3еN*'g)1Uo&[VRVK\wЭ̤Bb6NNlbܘE<9vžf9sYHji8叡g`vIENDB`gcw0/config.c000664 001750 001750 00000010350 12702465756 014170 0ustar00sergiosergio000000 000000 #include "osd.h" t_config config; static int config_load(void) { //TODO: extract to function const char *homedir; if ((homedir = getenv("HOME")) == NULL) { homedir = getpwuid(getuid())->pw_dir; } /* open configuration file */ char fname[MAXPATHLEN]; sprintf (fname, "%s%s/config.ini", homedir, DEFAULT_PATH); FILE *fp = fopen(fname, "rb"); if (fp) { /* check file size */ fseek(fp, 0, SEEK_END); if (ftell(fp) != sizeof(config)) { fclose(fp); return 0; } /* read file */ fseek(fp, 0, SEEK_SET); fread(&config, sizeof(config), 1, fp); fclose(fp); return 1; } return 0; } void set_config_defaults(void) { int i; /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; config.psgBoostNoise = 1; config.filter = 1; config.low_freq = 200; config.high_freq = 8000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.dac_bits = 14; config.ym2413 = 1; /* = AUTO (0 = always OFF, 1 = always ON) */ config.mono = 0; /* system options */ config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */ config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */ config.vdp_mode = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.master_clock = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ config.ntsc = 0; config.lcd = 0; /* 0.8 fixed point */ /* display options */ config.overscan = 0; /* 3 = all borders (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */ config.gg_extra = 0; /* 1 = show extended Game Gear screen (256x192) */ config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ config.gcw0_fullscreen = 1; /* 1 = use IPU scaling */ config.keepaspectratio = 1; /* 1 = aspect ratio correct with black bars, 0 = fullscreen without correct aspect ratio */ config.gg_scanlines = 1; /* 1 = use scanlines on Game Gear */ config.smsmaskleftbar = 1; /* 1 = Mask left bar on SMS (better for horizontal scrolling) */ config.sl_autoresume = 1; /* 1 = Automatically resume when saving and loading snapshots */ config.a_stick = 1; /* 1 = A-Stick on */ config.lightgun_speed = 1; /* 1 = simple speed multiplier for lightgun */ config.gcw0_frameskip = 0; /* 0 = off, 1 = skip alternate frames, 2 = skip 2 in 3 frames, etc. Useful for FMV in MCD. */ /* controllers options */ config.cursor = 0; /* different cursor designs */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD; config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; for (i=0; ipw_dir; } /* open configuration file */ char fname[MAXPATHLEN]; sprintf (fname, "%s%s/config.ini", homedir, DEFAULT_PATH); //printf(fname); FILE *fp = fopen(fname, "wb"); if (fp) { /* write file */ fwrite(&config, sizeof(config), 1, fp); fclose(fp); } } core/cart_hw/areplay.h000664 001750 001750 00000004701 12702465756 016107 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * DATEL Action Replay / Pro Action Replay emulation * * Copyright (C) 2009-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _AREPLAY_H_ #define _AREPLAY_H_ #define AR_SWITCH_OFF (0) #define AR_SWITCH_ON (1) #define AR_SWITCH_TRAINER (2) extern void areplay_init(void); extern void areplay_shutdown(void); extern void areplay_reset(int hard); extern void areplay_set_status(int status); extern int areplay_get_status(void); #endif psp2/fileio.h000664 001750 001750 00000004513 12702465756 014227 0ustar00sergiosergio000000 000000 /* * fileio.c * * Load a normal file, or ZIP/GZ archive. * Returns loaded ROM size (zero if an error occured) * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * modified by Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _FILEIO_H_ #define _FILEIO_H_ /* Function prototypes */ extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); #endif /* _FILEIO_H_ */ gx/images/Bg_intro_c4.png000664 001750 001750 00000024224 12702465756 016446 0ustar00sergiosergio000000 000000 PNG  IHDR4#}sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/11/09> IDATx}\u﮽o=;/F4HHŽ z %2߸|])ɧRo*8T*e> m b4Bk{v~h:U]{,9w~Bs'G"۷{xxp DQvnCguR dbo^x_w ?ݕ?X qėc=h[[[*I$/Im5iit]W+ӥ˗/>;];Vh_:ttpp0FeQVfT*uǁyl6|_^4J%ٳg']Vh<'>x~X]]eud2eu38t]x /`mm ^~(Bu躎d2iR2 pIs=yAabڶ ӳ7\.,Әf^C4v܎/IDQD\2V+ UUM`p1x<ubBO?>xL^O 8}4n7"@UUwf1[P`Z188xh"Q9҇V}߮s{flս[IP8T*x^<]z~ _ϔٳgvr钛y̌Y90MҤ [g/z^TU(ڢqZVX,67S̭loҚ>lmwUxG^$I VJ9y晿8tL&!28x Ȳ 2~w" * rjEh6lHPU8XV455bR9cc.JH$̢pQX[$VAӴ%E$t]GZE*bH À $ ,7wQh8c401fL7o߾@+ːeo&R|>kg0M"YI‡a N#ɰYЉiTUeql6 2JR%er:hkk{glcӦ޽{5{%ڨZ-x6ETa#/H>335֦ݻaXP(0 ꫯ"L|RL&D"ݎp8 <$I^( "+uB FVy+2A PZ rZ A?y 0Y*033UiEFSEaDE0 app`cZL&k׮ʕ+GGGn7R(Ɛd|28 $In7UUQav+`yy)AJr̼4<}Qa~뭷L&!vލx1a0܄'b8y$SIT*l6e^C$TU=zO>$dYft``.\Ç$ `&''1>>1`ii OF{{; TUݻߏH$μiLMMaeeZ mmml^oEQj_zP'%<{31[X,ł{ ;v`XUuD"vcyydV́؊PQ,..vG03d[ZZ044]v?)ۋRx<~T*$ >b_Պx<13Et\H$g"2S@EQ`p8裏bllh|$ F4*>z _|ΝΝ;cA$LNN" H~. 8w*l624<#LBunի `߾}l\Āx^r9 !#N3Oyݻ_b4K?~{`@z<0g?.\,ˈD" gH(APsNa:Yj\G_җ000 zA,p8ؿ?zzzfَ,,˨jbp8?Ctvv"X,2EfX,p:1^P(`bb?o>tvvb}}kkka)A ,:zƼ T*c<#`߾}طo"^uJELQt]G.b2ݍjiXV^#H@UU<A*cwj5TUH׋z,ܹsp\젱mgpU4̼ ,NfEGGAnP@:jQf0)̓>ߏIh׋l6nǑ#G{nEdY|>9r?QrpyT*烪(JeT Z>@$CPbVYUUyj5< *\.8{9x衇0:: JZe0^CUUHZرc{.y7Q*!BQ* VVVX7>>v &M$p:)2z<<133dZL&AIp80::lnn閙cΤsZ \ B-T{{;bdq9{bhh^q|>͘AVf똘K/^իַv 8NŋzbX]]cTU %v8,:;;rrYBl6#G`Ϟ= IT*3gɓ'144ULA)+'24MCSS+T*6<;, <^|Er9attjDr$,u?B3R;wDKK :r\CMQ#0.>h̫S= KKK(ˌ( 8u.^qʦR)T*buuD f4 y܊٠XDq:u DSSSx QpQ,!l6033Qܹz:\@ Yf<[tbS~?^ UUz5XZZbA4E,( vP?FFFf"3g>O<..K3o/Qwhmm8fggQ(P(sK ֆnȲΠY\_׋p8\.( :;;H$X0(JJhzz=SE477C4#vꍏCQ\pdO4Hݎ|>P(F7)*qRh@Z$c.]^/~ŋ'2?M`ZD4 ?0K<'N0)+ՌH˅Etuu1fFX,TUU,//nPUrIhN(0<<, QԾi ~e1WY,~lll@QJ%tp0.b(dIkCs5vpyLc'x0773gΠT*t"3&T*1o&I$666gSVdd@mk(VbXZ5dKz֕+WahhLa|8{,l69Mp5TU쫪 A mnnfgIɻ*'vVր籼 xZFh666 2 ,(J H5d%V>kkkhnnfRD4McRô(Nl#Q[Tb. RW"@:Fgg'>x<V[CKވy$ b``$X,biiqfA, AAUUaZQ(X|@ eH#y=MjqrrR:~|`C4f I2}y/ߏ#G 4XJIXy( СCp\Ed2VDG888pGE(b%|EX^^f޳ ,>IDAT2\4+'kt:ł><#x饗L{u]G(B{{;}]}344 8COO?3g`}}$pKv!+++,-Mk#"Fo*nE2dYׯܶ*O?4^~e\|,+9q8OL+P,5?q8H$صkN8z[ qy2:n3~3bzz Kuuu! 5vrx155jʲ χH$aS b>EJv &ʞO _*D"AAtww3W^*Ğ=77t~*nF )NLL Rm >wjΝ}'0::D"kdDQdY6:*,'lA`b_ .SœZECntkb )b`ys|>\(p̊q'1n MRk 7ݴnl6) 134vס 9`KxY$(o>sVK$׿u8NoMCVŜɢ#K2M2KbNnÍ@2]oԾmY)蚭c1F:(35ia~fL̛aks=ATP`h6nG.ó>t:Meտ|ܹX,z*^}U<䓬<8jPuֻヒ(:]O[Yߏ3j?Am_x k.$Iv|>o~frf ?oƎP>o_%#UTn')޹sqcN'OYDm>}qP UyxQ*{8r3+I T wy yѣGqqر]Kv{͛;we9s*ayyy}ssa1$|]d+1N}zppo:;;{v;KptuuСC8t;Mb~Ѝ`]-똛qY,..r! P( H?33ݵ (pw,ܕK?)C###F6550ӃcǎDSSӯHTUE2 ._z y~L_\\<;;;7RO:ٖ;޿D"OJ=ij5477cpphmmgg ZRT*^577D"II>qzzz ØMN]lzYO~5 z!"V*w)vY * Rh=,IUzjfs\+WUUWCc+Ac~ᓁ@sȲl3 Cܠ\s:Ҩv&}txVT*ZP 'Sa7]+[c)4Np(:8=6!I]㣶9J}Ā`iZIQ(7663law:]X5q .~j6dYY,j|?*֋ŢT.C&yT*(J0폚ߕrw1c #include #include #ifdef __cplusplus extern "C" { #endif #ifndef __cplusplus #if defined(_MSC_VER) && !defined(SN_TARGET_PS3) /* Hack applied for MSVC when compiling in C89 mode * as it isn't C99-compliant. */ #define bool unsigned char #define true 1 #define false 0 #else #include #endif #endif /* Used for checking API/ABI mismatches that can break libretro * implementations. * It is not incremented for compatible changes to the API. */ #define RETRO_API_VERSION 1 /* * Libretro's fundamental device abstractions. * * Libretro's input system consists of some standardized device types, * such as a joypad (with/without analog), mouse, keyboard, lightgun * and a pointer. * * The functionality of these devices are fixed, and individual cores * map their own concept of a controller to libretro's abstractions. * This makes it possible for frontends to map the abstract types to a * real input device, and not having to worry about binding input * correctly to arbitrary controller layouts. */ #define RETRO_DEVICE_TYPE_SHIFT 8 #define RETRO_DEVICE_MASK ((1 << RETRO_DEVICE_TYPE_SHIFT) - 1) #define RETRO_DEVICE_SUBCLASS(base, id) (((id + 1) << RETRO_DEVICE_TYPE_SHIFT) | base) /* Input disabled. */ #define RETRO_DEVICE_NONE 0 /* The JOYPAD is called RetroPad. It is essentially a Super Nintendo * controller, but with additional L2/R2/L3/R3 buttons, similar to a * PS1 DualShock. */ #define RETRO_DEVICE_JOYPAD 1 /* The mouse is a simple mouse, similar to Super Nintendo's mouse. * X and Y coordinates are reported relatively to last poll (poll callback). * It is up to the libretro implementation to keep track of where the mouse * pointer is supposed to be on the screen. * The frontend must make sure not to interfere with its own hardware * mouse pointer. */ #define RETRO_DEVICE_MOUSE 2 /* KEYBOARD device lets one poll for raw key pressed. * It is poll based, so input callback will return with the current * pressed state. * For event/text based keyboard input, see * RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK. */ #define RETRO_DEVICE_KEYBOARD 3 /* Lightgun X/Y coordinates are reported relatively to last poll, * similar to mouse. */ #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). * Similar to DualShock it adds two analog sticks. * This is treated as a separate device type as it returns values in the * full analog range of [-0x8000, 0x7fff]. Positive X axis is right. * Positive Y axis is down. * Only use ANALOG type when polling for analog values of the axes. */ #define RETRO_DEVICE_ANALOG 5 /* Abstracts the concept of a pointing mechanism, e.g. touch. * This allows libretro to query in absolute coordinates where on the * screen a mouse (or something similar) is being placed. * For a touch centric device, coordinates reported are the coordinates * of the press. * * Coordinates in X and Y are reported as: * [-0x7fff, 0x7fff]: -0x7fff corresponds to the far left/top of the screen, * and 0x7fff corresponds to the far right/bottom of the screen. * The "screen" is here defined as area that is passed to the frontend and * later displayed on the monitor. * * The frontend is free to scale/resize this screen as it sees fit, however, * (X, Y) = (-0x7fff, -0x7fff) will correspond to the top-left pixel of the * game image, etc. * * To check if the pointer coordinates are valid (e.g. a touch display * actually being touched), PRESSED returns 1 or 0. * * If using a mouse on a desktop, PRESSED will usually correspond to the * left mouse button, but this is a frontend decision. * PRESSED will only return 1 if the pointer is inside the game screen. * * For multi-touch, the index variable can be used to successively query * more presses. * If index = 0 returns true for _PRESSED, coordinates can be extracted * with _X, _Y for index = 0. One can then query _PRESSED, _X, _Y with * index = 1, and so on. * Eventually _PRESSED will return false for an index. No further presses * are registered at this point. */ #define RETRO_DEVICE_POINTER 6 /* Buttons for the RetroPad (JOYPAD). * The placement of these is equivalent to placements on the * Super Nintendo controller. * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. */ #define RETRO_DEVICE_ID_JOYPAD_B 0 #define RETRO_DEVICE_ID_JOYPAD_Y 1 #define RETRO_DEVICE_ID_JOYPAD_SELECT 2 #define RETRO_DEVICE_ID_JOYPAD_START 3 #define RETRO_DEVICE_ID_JOYPAD_UP 4 #define RETRO_DEVICE_ID_JOYPAD_DOWN 5 #define RETRO_DEVICE_ID_JOYPAD_LEFT 6 #define RETRO_DEVICE_ID_JOYPAD_RIGHT 7 #define RETRO_DEVICE_ID_JOYPAD_A 8 #define RETRO_DEVICE_ID_JOYPAD_X 9 #define RETRO_DEVICE_ID_JOYPAD_L 10 #define RETRO_DEVICE_ID_JOYPAD_R 11 #define RETRO_DEVICE_ID_JOYPAD_L2 12 #define RETRO_DEVICE_ID_JOYPAD_R2 13 #define RETRO_DEVICE_ID_JOYPAD_L3 14 #define RETRO_DEVICE_ID_JOYPAD_R3 15 /* Index / Id values for ANALOG device. */ #define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 #define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 #define RETRO_DEVICE_ID_ANALOG_X 0 #define RETRO_DEVICE_ID_ANALOG_Y 1 /* Id values for MOUSE. */ #define RETRO_DEVICE_ID_MOUSE_X 0 #define RETRO_DEVICE_ID_MOUSE_Y 1 #define RETRO_DEVICE_ID_MOUSE_LEFT 2 #define RETRO_DEVICE_ID_MOUSE_RIGHT 3 #define RETRO_DEVICE_ID_MOUSE_WHEELUP 4 #define RETRO_DEVICE_ID_MOUSE_WHEELDOWN 5 #define RETRO_DEVICE_ID_MOUSE_MIDDLE 6 /* Id values for LIGHTGUN types. */ #define RETRO_DEVICE_ID_LIGHTGUN_X 0 #define RETRO_DEVICE_ID_LIGHTGUN_Y 1 #define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 #define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 #define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 #define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 #define RETRO_DEVICE_ID_LIGHTGUN_START 6 /* Id values for POINTER. */ #define RETRO_DEVICE_ID_POINTER_X 0 #define RETRO_DEVICE_ID_POINTER_Y 1 #define RETRO_DEVICE_ID_POINTER_PRESSED 2 /* Returned from retro_get_region(). */ #define RETRO_REGION_NTSC 0 #define RETRO_REGION_PAL 1 /* Id values for LANGUAGE */ enum retro_language { RETRO_LANGUAGE_ENGLISH = 0, RETRO_LANGUAGE_JAPANESE = 1, RETRO_LANGUAGE_FRENCH = 2, RETRO_LANGUAGE_SPANISH = 3, RETRO_LANGUAGE_GERMAN = 4, RETRO_LANGUAGE_ITALIAN = 5, RETRO_LANGUAGE_DUTCH = 6, RETRO_LANGUAGE_PORTUGUESE = 7, RETRO_LANGUAGE_RUSSIAN = 8, RETRO_LANGUAGE_KOREAN = 9, RETRO_LANGUAGE_CHINESE_TRADITIONAL = 10, RETRO_LANGUAGE_CHINESE_SIMPLIFIED = 11, RETRO_LANGUAGE_LAST, /* Ensure sizeof(enum) == sizeof(int) */ RETRO_LANGUAGE_DUMMY = INT_MAX }; /* Passed to retro_get_memory_data/size(). * If the memory type doesn't apply to the * implementation NULL/0 can be returned. */ #define RETRO_MEMORY_MASK 0xff /* Regular save RAM. This RAM is usually found on a game cartridge, * backed up by a battery. * If save game data is too complex for a single memory buffer, * the SAVE_DIRECTORY (preferably) or SYSTEM_DIRECTORY environment * callback can be used. */ #define RETRO_MEMORY_SAVE_RAM 0 /* Some games have a built-in clock to keep track of time. * This memory is usually just a couple of bytes to keep track of time. */ #define RETRO_MEMORY_RTC 1 /* System ram lets a frontend peek into a game systems main RAM. */ #define RETRO_MEMORY_SYSTEM_RAM 2 /* Video ram lets a frontend peek into a game systems video RAM (VRAM). */ #define RETRO_MEMORY_VIDEO_RAM 3 /* Keysyms used for ID in input state callback when polling RETRO_KEYBOARD. */ enum retro_key { RETROK_UNKNOWN = 0, RETROK_FIRST = 0, RETROK_BACKSPACE = 8, RETROK_TAB = 9, RETROK_CLEAR = 12, RETROK_RETURN = 13, RETROK_PAUSE = 19, RETROK_ESCAPE = 27, RETROK_SPACE = 32, RETROK_EXCLAIM = 33, RETROK_QUOTEDBL = 34, RETROK_HASH = 35, RETROK_DOLLAR = 36, RETROK_AMPERSAND = 38, RETROK_QUOTE = 39, RETROK_LEFTPAREN = 40, RETROK_RIGHTPAREN = 41, RETROK_ASTERISK = 42, RETROK_PLUS = 43, RETROK_COMMA = 44, RETROK_MINUS = 45, RETROK_PERIOD = 46, RETROK_SLASH = 47, RETROK_0 = 48, RETROK_1 = 49, RETROK_2 = 50, RETROK_3 = 51, RETROK_4 = 52, RETROK_5 = 53, RETROK_6 = 54, RETROK_7 = 55, RETROK_8 = 56, RETROK_9 = 57, RETROK_COLON = 58, RETROK_SEMICOLON = 59, RETROK_LESS = 60, RETROK_EQUALS = 61, RETROK_GREATER = 62, RETROK_QUESTION = 63, RETROK_AT = 64, RETROK_LEFTBRACKET = 91, RETROK_BACKSLASH = 92, RETROK_RIGHTBRACKET = 93, RETROK_CARET = 94, RETROK_UNDERSCORE = 95, RETROK_BACKQUOTE = 96, RETROK_a = 97, RETROK_b = 98, RETROK_c = 99, RETROK_d = 100, RETROK_e = 101, RETROK_f = 102, RETROK_g = 103, RETROK_h = 104, RETROK_i = 105, RETROK_j = 106, RETROK_k = 107, RETROK_l = 108, RETROK_m = 109, RETROK_n = 110, RETROK_o = 111, RETROK_p = 112, RETROK_q = 113, RETROK_r = 114, RETROK_s = 115, RETROK_t = 116, RETROK_u = 117, RETROK_v = 118, RETROK_w = 119, RETROK_x = 120, RETROK_y = 121, RETROK_z = 122, RETROK_DELETE = 127, RETROK_KP0 = 256, RETROK_KP1 = 257, RETROK_KP2 = 258, RETROK_KP3 = 259, RETROK_KP4 = 260, RETROK_KP5 = 261, RETROK_KP6 = 262, RETROK_KP7 = 263, RETROK_KP8 = 264, RETROK_KP9 = 265, RETROK_KP_PERIOD = 266, RETROK_KP_DIVIDE = 267, RETROK_KP_MULTIPLY = 268, RETROK_KP_MINUS = 269, RETROK_KP_PLUS = 270, RETROK_KP_ENTER = 271, RETROK_KP_EQUALS = 272, RETROK_UP = 273, RETROK_DOWN = 274, RETROK_RIGHT = 275, RETROK_LEFT = 276, RETROK_INSERT = 277, RETROK_HOME = 278, RETROK_END = 279, RETROK_PAGEUP = 280, RETROK_PAGEDOWN = 281, RETROK_F1 = 282, RETROK_F2 = 283, RETROK_F3 = 284, RETROK_F4 = 285, RETROK_F5 = 286, RETROK_F6 = 287, RETROK_F7 = 288, RETROK_F8 = 289, RETROK_F9 = 290, RETROK_F10 = 291, RETROK_F11 = 292, RETROK_F12 = 293, RETROK_F13 = 294, RETROK_F14 = 295, RETROK_F15 = 296, RETROK_NUMLOCK = 300, RETROK_CAPSLOCK = 301, RETROK_SCROLLOCK = 302, RETROK_RSHIFT = 303, RETROK_LSHIFT = 304, RETROK_RCTRL = 305, RETROK_LCTRL = 306, RETROK_RALT = 307, RETROK_LALT = 308, RETROK_RMETA = 309, RETROK_LMETA = 310, RETROK_LSUPER = 311, RETROK_RSUPER = 312, RETROK_MODE = 313, RETROK_COMPOSE = 314, RETROK_HELP = 315, RETROK_PRINT = 316, RETROK_SYSREQ = 317, RETROK_BREAK = 318, RETROK_MENU = 319, RETROK_POWER = 320, RETROK_EURO = 321, RETROK_UNDO = 322, RETROK_LAST, RETROK_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ }; enum retro_mod { RETROKMOD_NONE = 0x0000, RETROKMOD_SHIFT = 0x01, RETROKMOD_CTRL = 0x02, RETROKMOD_ALT = 0x04, RETROKMOD_META = 0x08, RETROKMOD_NUMLOCK = 0x10, RETROKMOD_CAPSLOCK = 0x20, RETROKMOD_SCROLLOCK = 0x40, RETROKMOD_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ }; /* If set, this call is not part of the public libretro API yet. It can * change or be removed at any time. */ #define RETRO_ENVIRONMENT_EXPERIMENTAL 0x10000 /* Environment callback to be used internally in frontend. */ #define RETRO_ENVIRONMENT_PRIVATE 0x20000 /* Environment commands. */ #define RETRO_ENVIRONMENT_SET_ROTATION 1 /* const unsigned * -- * Sets screen rotation of graphics. * Is only implemented if rotation can be accelerated by hardware. * Valid values are 0, 1, 2, 3, which rotates screen by 0, 90, 180, * 270 degrees counter-clockwise respectively. */ #define RETRO_ENVIRONMENT_GET_OVERSCAN 2 /* bool * -- * Boolean value whether or not the implementation should use overscan, * or crop away overscan. */ #define RETRO_ENVIRONMENT_GET_CAN_DUPE 3 /* bool * -- * Boolean value whether or not frontend supports frame duping, * passing NULL to video frame callback. */ /* Environ 4, 5 are no longer supported (GET_VARIABLE / SET_VARIABLES), * and reserved to avoid possible ABI clash. */ #define RETRO_ENVIRONMENT_SET_MESSAGE 6 /* const struct retro_message * -- * Sets a message to be displayed in implementation-specific manner * for a certain amount of 'frames'. * Should not be used for trivial messages, which should simply be * logged via RETRO_ENVIRONMENT_GET_LOG_INTERFACE (or as a * fallback, stderr). */ #define RETRO_ENVIRONMENT_SHUTDOWN 7 /* N/A (NULL) -- * Requests the frontend to shutdown. * Should only be used if game has a specific * way to shutdown the game from a menu item or similar. */ #define RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL 8 /* const unsigned * -- * Gives a hint to the frontend how demanding this implementation * is on a system. E.g. reporting a level of 2 means * this implementation should run decently on all frontends * of level 2 and up. * * It can be used by the frontend to potentially warn * about too demanding implementations. * * The levels are "floating". * * This function can be called on a per-game basis, * as certain games an implementation can play might be * particularly demanding. * If called, it should be called in retro_load_game(). */ #define RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY 9 /* const char ** -- * Returns the "system" directory of the frontend. * This directory can be used to store system specific * content such as BIOSes, configuration data, etc. * The returned value can be NULL. * If so, no such directory is defined, * and it's up to the implementation to find a suitable directory. * * NOTE: Some cores used this folder also for "save" data such as * memory cards, etc, for lack of a better place to put it. * This is now discouraged, and if possible, cores should try to * use the new GET_SAVE_DIRECTORY. */ #define RETRO_ENVIRONMENT_SET_PIXEL_FORMAT 10 /* const enum retro_pixel_format * -- * Sets the internal pixel format used by the implementation. * The default pixel format is RETRO_PIXEL_FORMAT_0RGB1555. * This pixel format however, is deprecated (see enum retro_pixel_format). * If the call returns false, the frontend does not support this pixel * format. * * This function should be called inside retro_load_game() or * retro_get_system_av_info(). */ #define RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS 11 /* const struct retro_input_descriptor * -- * Sets an array of retro_input_descriptors. * It is up to the frontend to present this in a usable way. * The array is terminated by retro_input_descriptor::description * being set to NULL. * This function can be called at any time, but it is recommended * to call it as early as possible. */ #define RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK 12 /* const struct retro_keyboard_callback * -- * Sets a callback function used to notify core about keyboard events. */ #define RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE 13 /* const struct retro_disk_control_callback * -- * Sets an interface which frontend can use to eject and insert * disk images. * This is used for games which consist of multiple images and * must be manually swapped out by the user (e.g. PSX). */ #define RETRO_ENVIRONMENT_SET_HW_RENDER 14 /* struct retro_hw_render_callback * -- * Sets an interface to let a libretro core render with * hardware acceleration. * Should be called in retro_load_game(). * If successful, libretro cores will be able to render to a * frontend-provided framebuffer. * The size of this framebuffer will be at least as large as * max_width/max_height provided in get_av_info(). * If HW rendering is used, pass only RETRO_HW_FRAME_BUFFER_VALID or * NULL to retro_video_refresh_t. */ #define RETRO_ENVIRONMENT_GET_VARIABLE 15 /* struct retro_variable * -- * Interface to acquire user-defined information from environment * that cannot feasibly be supported in a multi-system way. * 'key' should be set to a key which has already been set by * SET_VARIABLES. * 'data' will be set to a value or NULL. */ #define RETRO_ENVIRONMENT_SET_VARIABLES 16 /* const struct retro_variable * -- * Allows an implementation to signal the environment * which variables it might want to check for later using * GET_VARIABLE. * This allows the frontend to present these variables to * a user dynamically. * This should be called as early as possible (ideally in * retro_set_environment). * * 'data' points to an array of retro_variable structs * terminated by a { NULL, NULL } element. * retro_variable::key should be namespaced to not collide * with other implementations' keys. E.g. A core called * 'foo' should use keys named as 'foo_option'. * retro_variable::value should contain a human readable * description of the key as well as a '|' delimited list * of expected values. * * The number of possible options should be very limited, * i.e. it should be feasible to cycle through options * without a keyboard. * * First entry should be treated as a default. * * Example entry: * { "foo_option", "Speed hack coprocessor X; false|true" } * * Text before first ';' is description. This ';' must be * followed by a space, and followed by a list of possible * values split up with '|'. * * Only strings are operated on. The possible values will * generally be displayed and stored as-is by the frontend. */ #define RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE 17 /* bool * -- * Result is set to true if some variables are updated by * frontend since last call to RETRO_ENVIRONMENT_GET_VARIABLE. * Variables should be queried with GET_VARIABLE. */ #define RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME 18 /* const bool * -- * If true, the libretro implementation supports calls to * retro_load_game() with NULL as argument. * Used by cores which can run without particular game data. * This should be called within retro_set_environment() only. */ #define RETRO_ENVIRONMENT_GET_LIBRETRO_PATH 19 /* const char ** -- * Retrieves the absolute path from where this libretro * implementation was loaded. * NULL is returned if the libretro was loaded statically * (i.e. linked statically to frontend), or if the path cannot be * determined. * Mostly useful in cooperation with SET_SUPPORT_NO_GAME as assets can * be loaded without ugly hacks. */ /* Environment 20 was an obsolete version of SET_AUDIO_CALLBACK. * It was not used by any known core at the time, * and was removed from the API. */ #define RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK 22 /* const struct retro_audio_callback * -- * Sets an interface which is used to notify a libretro core about audio * being available for writing. * The callback can be called from any thread, so a core using this must * have a thread safe audio implementation. * It is intended for games where audio and video are completely * asynchronous and audio can be generated on the fly. * This interface is not recommended for use with emulators which have * highly synchronous audio. * * The callback only notifies about writability; the libretro core still * has to call the normal audio callbacks * to write audio. The audio callbacks must be called from within the * notification callback. * The amount of audio data to write is up to the implementation. * Generally, the audio callback will be called continously in a loop. * * Due to thread safety guarantees and lack of sync between audio and * video, a frontend can selectively disallow this interface based on * internal configuration. A core using this interface must also * implement the "normal" audio interface. * * A libretro core using SET_AUDIO_CALLBACK should also make use of * SET_FRAME_TIME_CALLBACK. */ #define RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK 21 /* const struct retro_frame_time_callback * -- * Lets the core know how much time has passed since last * invocation of retro_run(). * The frontend can tamper with the timing to fake fast-forward, * slow-motion, frame stepping, etc. * In this case the delta time will use the reference value * in frame_time_callback.. */ #define RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE 23 /* struct retro_rumble_interface * -- * Gets an interface which is used by a libretro core to set * state of rumble motors in controllers. * A strong and weak motor is supported, and they can be * controlled indepedently. */ #define RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES 24 /* uint64_t * -- * Gets a bitmask telling which device type are expected to be * handled properly in a call to retro_input_state_t. * Devices which are not handled or recognized always return * 0 in retro_input_state_t. * Example bitmask: caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG). * Should only be called in retro_run(). */ #define RETRO_ENVIRONMENT_GET_SENSOR_INTERFACE (25 | RETRO_ENVIRONMENT_EXPERIMENTAL) /* struct retro_sensor_interface * -- * Gets access to the sensor interface. * The purpose of this interface is to allow * setting state related to sensors such as polling rate, * enabling/disable it entirely, etc. * Reading sensor state is done via the normal * input_state_callback API. */ #define RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE (26 | RETRO_ENVIRONMENT_EXPERIMENTAL) /* struct retro_camera_callback * -- * Gets an interface to a video camera driver. * A libretro core can use this interface to get access to a * video camera. * New video frames are delivered in a callback in same * thread as retro_run(). * * GET_CAMERA_INTERFACE should be called in retro_load_game(). * * Depending on the camera implementation used, camera frames * will be delivered as a raw framebuffer, * or as an OpenGL texture directly. * * The core has to tell the frontend here which types of * buffers can be handled properly. * An OpenGL texture can only be handled when using a * libretro GL core (SET_HW_RENDER). * It is recommended to use a libretro GL core when * using camera interface. * * The camera is not started automatically. The retrieved start/stop * functions must be used to explicitly * start and stop the camera driver. */ #define RETRO_ENVIRONMENT_GET_LOG_INTERFACE 27 /* struct retro_log_callback * -- * Gets an interface for logging. This is useful for * logging in a cross-platform way * as certain platforms cannot use use stderr for logging. * It also allows the frontend to * show logging information in a more suitable way. * If this interface is not used, libretro cores should * log to stderr as desired. */ #define RETRO_ENVIRONMENT_GET_PERF_INTERFACE 28 /* struct retro_perf_callback * -- * Gets an interface for performance counters. This is useful * for performance logging in a cross-platform way and for detecting * architecture-specific features, such as SIMD support. */ #define RETRO_ENVIRONMENT_GET_LOCATION_INTERFACE 29 /* struct retro_location_callback * -- * Gets access to the location interface. * The purpose of this interface is to be able to retrieve * location-based information from the host device, * such as current latitude / longitude. */ #define RETRO_ENVIRONMENT_GET_CONTENT_DIRECTORY 30 /* const char ** -- * Returns the "content" directory of the frontend. * This directory can be used to store specific assets that the * core relies upon, such as art assets, * input data, etc etc. * The returned value can be NULL. * If so, no such directory is defined, * and it's up to the implementation to find a suitable directory. */ #define RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY 31 /* const char ** -- * Returns the "save" directory of the frontend. * This directory can be used to store SRAM, memory cards, * high scores, etc, if the libretro core * cannot use the regular memory interface (retro_get_memory_data()). * * NOTE: libretro cores used to check GET_SYSTEM_DIRECTORY for * similar things before. * They should still check GET_SYSTEM_DIRECTORY if they want to * be backwards compatible. * The path here can be NULL. It should only be non-NULL if the * frontend user has set a specific save path. */ #define RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO 32 /* const struct retro_system_av_info * -- * Sets a new av_info structure. This can only be called from * within retro_run(). * This should *only* be used if the core is completely altering the * internal resolutions, aspect ratios, timings, sampling rate, etc. * Calling this can require a full reinitialization of video/audio * drivers in the frontend, * * so it is important to call it very sparingly, and usually only with * the users explicit consent. * An eventual driver reinitialize will happen so that video and * audio callbacks * happening after this call within the same retro_run() call will * target the newly initialized driver. * * This callback makes it possible to support configurable resolutions * in games, which can be useful to * avoid setting the "worst case" in max_width/max_height. * * ***HIGHLY RECOMMENDED*** Do not call this callback every time * resolution changes in an emulator core if it's * expected to be a temporary change, for the reasons of possible * driver reinitialization. * This call is not a free pass for not trying to provide * correct values in retro_get_system_av_info(). If you need to change * things like aspect ratio or nominal width/height, * use RETRO_ENVIRONMENT_SET_GEOMETRY, which is a softer variant * of SET_SYSTEM_AV_INFO. * * If this returns false, the frontend does not acknowledge a * changed av_info struct. */ #define RETRO_ENVIRONMENT_SET_PROC_ADDRESS_CALLBACK 33 /* const struct retro_get_proc_address_interface * -- * Allows a libretro core to announce support for the * get_proc_address() interface. * This interface allows for a standard way to extend libretro where * use of environment calls are too indirect, * e.g. for cases where the frontend wants to call directly into the core. * * If a core wants to expose this interface, SET_PROC_ADDRESS_CALLBACK * **MUST** be called from within retro_set_environment(). */ #define RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO 34 /* const struct retro_subsystem_info * -- * This environment call introduces the concept of libretro "subsystems". * A subsystem is a variant of a libretro core which supports * different kinds of games. * The purpose of this is to support e.g. emulators which might * have special needs, e.g. Super Nintendo's Super GameBoy, Sufami Turbo. * It can also be used to pick among subsystems in an explicit way * if the libretro implementation is a multi-system emulator itself. * * Loading a game via a subsystem is done with retro_load_game_special(), * and this environment call allows a libretro core to expose which * subsystems are supported for use with retro_load_game_special(). * A core passes an array of retro_game_special_info which is terminated * with a zeroed out retro_game_special_info struct. * * If a core wants to use this functionality, SET_SUBSYSTEM_INFO * **MUST** be called from within retro_set_environment(). */ #define RETRO_ENVIRONMENT_SET_CONTROLLER_INFO 35 /* const struct retro_controller_info * -- * This environment call lets a libretro core tell the frontend * which controller types are recognized in calls to * retro_set_controller_port_device(). * * Some emulators such as Super Nintendo * support multiple lightgun types which must be specifically * selected from. * It is therefore sometimes necessary for a frontend to be able * to tell the core about a special kind of input device which is * not covered by the libretro input API. * * In order for a frontend to understand the workings of an input device, * it must be a specialized type * of the generic device types already defined in the libretro API. * * Which devices are supported can vary per input port. * The core must pass an array of const struct retro_controller_info which * is terminated with a blanked out struct. Each element of the struct * corresponds to an ascending port index to * retro_set_controller_port_device(). * Even if special device types are set in the libretro core, * libretro should only poll input based on the base input device types. */ #define RETRO_ENVIRONMENT_SET_MEMORY_MAPS (36 | RETRO_ENVIRONMENT_EXPERIMENTAL) /* const struct retro_memory_map * -- * This environment call lets a libretro core tell the frontend * about the memory maps this core emulates. * This can be used to implement, for example, cheats in a core-agnostic way. * * Should only be used by emulators; it doesn't make much sense for * anything else. * It is recommended to expose all relevant pointers through * retro_get_memory_* as well. * * Can be called from retro_init and retro_load_game. */ #define RETRO_ENVIRONMENT_SET_GEOMETRY 37 /* const struct retro_game_geometry * -- * This environment call is similar to SET_SYSTEM_AV_INFO for changing * video parameters, but provides a guarantee that drivers will not be * reinitialized. * This can only be called from within retro_run(). * * The purpose of this call is to allow a core to alter nominal * width/heights as well as aspect ratios on-the-fly, which can be * useful for some emulators to change in run-time. * * max_width/max_height arguments are ignored and cannot be changed * with this call as this could potentially require a reinitialization or a * non-constant time operation. * If max_width/max_height are to be changed, SET_SYSTEM_AV_INFO is required. * * A frontend must guarantee that this environment call completes in * constant time. */ #define RETRO_ENVIRONMENT_GET_USERNAME 38 /* const char ** * Returns the specified username of the frontend, if specified by the user. * This username can be used as a nickname for a core that has online facilities * or any other mode where personalization of the user is desirable. * The returned value can be NULL. * If this environ callback is used by a core that requires a valid username, * a default username should be specified by the core. */ #define RETRO_ENVIRONMENT_GET_LANGUAGE 39 /* unsigned * -- * Returns the specified language of the frontend, if specified by the user. * It can be used by the core for localization purposes. */ #define RETRO_MEMDESC_CONST (1 << 0) /* The frontend will never change this memory area once retro_load_game has returned. */ #define RETRO_MEMDESC_BIGENDIAN (1 << 1) /* The memory area contains big endian data. Default is little endian. */ #define RETRO_MEMDESC_ALIGN_2 (1 << 16) /* All memory access in this area is aligned to their own size, or 2, whichever is smaller. */ #define RETRO_MEMDESC_ALIGN_4 (2 << 16) #define RETRO_MEMDESC_ALIGN_8 (3 << 16) #define RETRO_MEMDESC_MINSIZE_2 (1 << 24) /* All memory in this region is accessed at least 2 bytes at the time. */ #define RETRO_MEMDESC_MINSIZE_4 (2 << 24) #define RETRO_MEMDESC_MINSIZE_8 (3 << 24) struct retro_memory_descriptor { uint64_t flags; /* Pointer to the start of the relevant ROM or RAM chip. * It's strongly recommended to use 'offset' if possible, rather than * doing math on the pointer. * * If the same byte is mapped my multiple descriptors, their descriptors * must have the same pointer. * If 'start' does not point to the first byte in the pointer, put the * difference in 'offset' instead. * * May be NULL if there's nothing usable here (e.g. hardware registers and * open bus). No flags should be set if the pointer is NULL. * It's recommended to minimize the number of descriptors if possible, * but not mandatory. */ void *ptr; size_t offset; /* This is the location in the emulated address space * where the mapping starts. */ size_t start; /* Which bits must be same as in 'start' for this mapping to apply. * The first memory descriptor to claim a certain byte is the one * that applies. * A bit which is set in 'start' must also be set in this. * Can be zero, in which case each byte is assumed mapped exactly once. * In this case, 'len' must be a power of two. */ size_t select; /* If this is nonzero, the set bits are assumed not connected to the * memory chip's address pins. */ size_t disconnect; /* This one tells the size of the current memory area. * If, after start+disconnect are applied, the address is higher than * this, the highest bit of the address is cleared. * * If the address is still too high, the next highest bit is cleared. * Can be zero, in which case it's assumed to be infinite (as limited * by 'select' and 'disconnect'). */ size_t len; /* To go from emulated address to physical address, the following * order applies: * Subtract 'start', pick off 'disconnect', apply 'len', add 'offset'. * * The address space name must consist of only a-zA-Z0-9_-, * should be as short as feasible (maximum length is 8 plus the NUL), * and may not be any other address space plus one or more 0-9A-F * at the end. * However, multiple memory descriptors for the same address space is * allowed, and the address space name can be empty. NULL is treated * as empty. * * Address space names are case sensitive, but avoid lowercase if possible. * The same pointer may exist in multiple address spaces. * * Examples: * blank+blank - valid (multiple things may be mapped in the same namespace) * 'Sp'+'Sp' - valid (multiple things may be mapped in the same namespace) * 'A'+'B' - valid (neither is a prefix of each other) * 'S'+blank - valid ('S' is not in 0-9A-F) * 'a'+blank - valid ('a' is not in 0-9A-F) * 'a'+'A' - valid (neither is a prefix of each other) * 'AR'+blank - valid ('R' is not in 0-9A-F) * 'ARB'+blank - valid (the B can't be part of the address either, because * there is no namespace 'AR') * blank+'B' - not valid, because it's ambigous which address space B1234 * would refer to. * The length can't be used for that purpose; the frontend may want * to append arbitrary data to an address, without a separator. */ const char *addrspace; }; /* The frontend may use the largest value of 'start'+'select' in a * certain namespace to infer the size of the address space. * * If the address space is larger than that, a mapping with .ptr=NULL * should be at the end of the array, with .select set to all ones for * as long as the address space is big. * * Sample descriptors (minus .ptr, and RETRO_MEMFLAG_ on the flags): * SNES WRAM: * .start=0x7E0000, .len=0x20000 * (Note that this must be mapped before the ROM in most cases; some of the * ROM mappers * try to claim $7E0000, or at least $7E8000.) * SNES SPC700 RAM: * .addrspace="S", .len=0x10000 * SNES WRAM mirrors: * .flags=MIRROR, .start=0x000000, .select=0xC0E000, .len=0x2000 * .flags=MIRROR, .start=0x800000, .select=0xC0E000, .len=0x2000 * SNES WRAM mirrors, alternate equivalent descriptor: * .flags=MIRROR, .select=0x40E000, .disconnect=~0x1FFF * (Various similar constructions can be created by combining parts of * the above two.) * SNES LoROM (512KB, mirrored a couple of times): * .flags=CONST, .start=0x008000, .select=0x408000, .disconnect=0x8000, .len=512*1024 * .flags=CONST, .start=0x400000, .select=0x400000, .disconnect=0x8000, .len=512*1024 * SNES HiROM (4MB): * .flags=CONST, .start=0x400000, .select=0x400000, .len=4*1024*1024 * .flags=CONST, .offset=0x8000, .start=0x008000, .select=0x408000, .len=4*1024*1024 * SNES ExHiROM (8MB): * .flags=CONST, .offset=0, .start=0xC00000, .select=0xC00000, .len=4*1024*1024 * .flags=CONST, .offset=4*1024*1024, .start=0x400000, .select=0xC00000, .len=4*1024*1024 * .flags=CONST, .offset=0x8000, .start=0x808000, .select=0xC08000, .len=4*1024*1024 * .flags=CONST, .offset=4*1024*1024+0x8000, .start=0x008000, .select=0xC08000, .len=4*1024*1024 * Clarify the size of the address space: * .ptr=NULL, .select=0xFFFFFF * .len can be implied by .select in many of them, but was included for clarity. */ struct retro_memory_map { const struct retro_memory_descriptor *descriptors; unsigned num_descriptors; }; struct retro_controller_description { /* Human-readable description of the controller. Even if using a generic * input device type, this can be set to the particular device type the * core uses. */ const char *desc; /* Device type passed to retro_set_controller_port_device(). If the device * type is a sub-class of a generic input device type, use the * RETRO_DEVICE_SUBCLASS macro to create an ID. * * E.g. RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1). */ unsigned id; }; struct retro_controller_info { const struct retro_controller_description *types; unsigned num_types; }; struct retro_subsystem_memory_info { /* The extension associated with a memory type, e.g. "psram". */ const char *extension; /* The memory type for retro_get_memory(). This should be at * least 0x100 to avoid conflict with standardized * libretro memory types. */ unsigned type; }; struct retro_subsystem_rom_info { /* Describes what the content is (SGB BIOS, GB ROM, etc). */ const char *desc; /* Same definition as retro_get_system_info(). */ const char *valid_extensions; /* Same definition as retro_get_system_info(). */ bool need_fullpath; /* Same definition as retro_get_system_info(). */ bool block_extract; /* This is set if the content is required to load a game. * If this is set to false, a zeroed-out retro_game_info can be passed. */ bool required; /* Content can have multiple associated persistent * memory types (retro_get_memory()). */ const struct retro_subsystem_memory_info *memory; unsigned num_memory; }; struct retro_subsystem_info { /* Human-readable string of the subsystem type, e.g. "Super GameBoy" */ const char *desc; /* A computer friendly short string identifier for the subsystem type. * This name must be [a-z]. * E.g. if desc is "Super GameBoy", this can be "sgb". * This identifier can be used for command-line interfaces, etc. */ const char *ident; /* Infos for each content file. The first entry is assumed to be the * "most significant" content for frontend purposes. * E.g. with Super GameBoy, the first content should be the GameBoy ROM, * as it is the most "significant" content to a user. * If a frontend creates new file paths based on the content used * (e.g. savestates), it should use the path for the first ROM to do so. */ const struct retro_subsystem_rom_info *roms; /* Number of content files associated with a subsystem. */ unsigned num_roms; /* The type passed to retro_load_game_special(). */ unsigned id; }; typedef void (*retro_proc_address_t)(void); /* libretro API extension functions: * (None here so far). * * Get a symbol from a libretro core. * Cores should only return symbols which are actual * extensions to the libretro API. * * Frontends should not use this to obtain symbols to standard * libretro entry points (static linking or dlsym). * * The symbol name must be equal to the function name, * e.g. if void retro_foo(void); exists, the symbol must be called "retro_foo". * The returned function pointer must be cast to the corresponding type. */ typedef retro_proc_address_t (*retro_get_proc_address_t)(const char *sym); struct retro_get_proc_address_interface { retro_get_proc_address_t get_proc_address; }; enum retro_log_level { RETRO_LOG_DEBUG = 0, RETRO_LOG_INFO, RETRO_LOG_WARN, RETRO_LOG_ERROR, RETRO_LOG_DUMMY = INT_MAX }; /* Logging function. Takes log level argument as well. */ typedef void (*retro_log_printf_t)(enum retro_log_level level, const char *fmt, ...); struct retro_log_callback { retro_log_printf_t log; }; /* Performance related functions */ /* ID values for SIMD CPU features */ #define RETRO_SIMD_SSE (1 << 0) #define RETRO_SIMD_SSE2 (1 << 1) #define RETRO_SIMD_VMX (1 << 2) #define RETRO_SIMD_VMX128 (1 << 3) #define RETRO_SIMD_AVX (1 << 4) #define RETRO_SIMD_NEON (1 << 5) #define RETRO_SIMD_SSE3 (1 << 6) #define RETRO_SIMD_SSSE3 (1 << 7) #define RETRO_SIMD_MMX (1 << 8) #define RETRO_SIMD_MMXEXT (1 << 9) #define RETRO_SIMD_SSE4 (1 << 10) #define RETRO_SIMD_SSE42 (1 << 11) #define RETRO_SIMD_AVX2 (1 << 12) #define RETRO_SIMD_VFPU (1 << 13) #define RETRO_SIMD_PS (1 << 14) #define RETRO_SIMD_AES (1 << 15) typedef uint64_t retro_perf_tick_t; typedef int64_t retro_time_t; struct retro_perf_counter { const char *ident; retro_perf_tick_t start; retro_perf_tick_t total; retro_perf_tick_t call_cnt; bool registered; }; /* Returns current time in microseconds. * Tries to use the most accurate timer available. */ typedef retro_time_t (*retro_perf_get_time_usec_t)(void); /* A simple counter. Usually nanoseconds, but can also be CPU cycles. * Can be used directly if desired (when creating a more sophisticated * performance counter system). * */ typedef retro_perf_tick_t (*retro_perf_get_counter_t)(void); /* Returns a bit-mask of detected CPU features (RETRO_SIMD_*). */ typedef uint64_t (*retro_get_cpu_features_t)(void); /* Asks frontend to log and/or display the state of performance counters. * Performance counters can always be poked into manually as well. */ typedef void (*retro_perf_log_t)(void); /* Register a performance counter. * ident field must be set with a discrete value and other values in * retro_perf_counter must be 0. * Registering can be called multiple times. To avoid calling to * frontend redundantly, you can check registered field first. */ typedef void (*retro_perf_register_t)(struct retro_perf_counter *counter); /* Starts a registered counter. */ typedef void (*retro_perf_start_t)(struct retro_perf_counter *counter); /* Stops a registered counter. */ typedef void (*retro_perf_stop_t)(struct retro_perf_counter *counter); /* For convenience it can be useful to wrap register, start and stop in macros. * E.g.: * #ifdef LOG_PERFORMANCE * #define RETRO_PERFORMANCE_INIT(perf_cb, name) static struct retro_perf_counter name = {#name}; if (!name.registered) perf_cb.perf_register(&(name)) * #define RETRO_PERFORMANCE_START(perf_cb, name) perf_cb.perf_start(&(name)) * #define RETRO_PERFORMANCE_STOP(perf_cb, name) perf_cb.perf_stop(&(name)) * #else * ... Blank macros ... * #endif * * These can then be used mid-functions around code snippets. * * extern struct retro_perf_callback perf_cb; * Somewhere in the core. * * void do_some_heavy_work(void) * { * RETRO_PERFORMANCE_INIT(cb, work_1; * RETRO_PERFORMANCE_START(cb, work_1); * heavy_work_1(); * RETRO_PERFORMANCE_STOP(cb, work_1); * * RETRO_PERFORMANCE_INIT(cb, work_2); * RETRO_PERFORMANCE_START(cb, work_2); * heavy_work_2(); * RETRO_PERFORMANCE_STOP(cb, work_2); * } * * void retro_deinit(void) * { * perf_cb.perf_log(); * Log all perf counters here for example. * } */ struct retro_perf_callback { retro_perf_get_time_usec_t get_time_usec; retro_get_cpu_features_t get_cpu_features; retro_perf_get_counter_t get_perf_counter; retro_perf_register_t perf_register; retro_perf_start_t perf_start; retro_perf_stop_t perf_stop; retro_perf_log_t perf_log; }; /* FIXME: Document the sensor API and work out behavior. * It will be marked as experimental until then. */ enum retro_sensor_action { RETRO_SENSOR_ACCELEROMETER_ENABLE = 0, RETRO_SENSOR_ACCELEROMETER_DISABLE, RETRO_SENSOR_DUMMY = INT_MAX }; /* Id values for SENSOR types. */ #define RETRO_SENSOR_ACCELEROMETER_X 0 #define RETRO_SENSOR_ACCELEROMETER_Y 1 #define RETRO_SENSOR_ACCELEROMETER_Z 2 typedef bool (*retro_set_sensor_state_t)(unsigned port, enum retro_sensor_action action, unsigned rate); typedef float (*retro_sensor_get_input_t)(unsigned port, unsigned id); struct retro_sensor_interface { retro_set_sensor_state_t set_sensor_state; retro_sensor_get_input_t get_sensor_input; }; enum retro_camera_buffer { RETRO_CAMERA_BUFFER_OPENGL_TEXTURE = 0, RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER, RETRO_CAMERA_BUFFER_DUMMY = INT_MAX }; /* Starts the camera driver. Can only be called in retro_run(). */ typedef bool (*retro_camera_start_t)(void); /* Stops the camera driver. Can only be called in retro_run(). */ typedef void (*retro_camera_stop_t)(void); /* Callback which signals when the camera driver is initialized * and/or deinitialized. * retro_camera_start_t can be called in initialized callback. */ typedef void (*retro_camera_lifetime_status_t)(void); /* A callback for raw framebuffer data. buffer points to an XRGB8888 buffer. * Width, height and pitch are similar to retro_video_refresh_t. * First pixel is top-left origin. */ typedef void (*retro_camera_frame_raw_framebuffer_t)(const uint32_t *buffer, unsigned width, unsigned height, size_t pitch); /* A callback for when OpenGL textures are used. * * texture_id is a texture owned by camera driver. * Its state or content should be considered immutable, except for things like * texture filtering and clamping. * * texture_target is the texture target for the GL texture. * These can include e.g. GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE, and possibly * more depending on extensions. * * affine points to a packed 3x3 column-major matrix used to apply an affine * transform to texture coordinates. (affine_matrix * vec3(coord_x, coord_y, 1.0)) * After transform, normalized texture coord (0, 0) should be bottom-left * and (1, 1) should be top-right (or (width, height) for RECTANGLE). * * GL-specific typedefs are avoided here to avoid relying on gl.h in * the API definition. */ typedef void (*retro_camera_frame_opengl_texture_t)(unsigned texture_id, unsigned texture_target, const float *affine); struct retro_camera_callback { /* Set by libretro core. * Example bitmask: caps = (1 << RETRO_CAMERA_BUFFER_OPENGL_TEXTURE) | (1 << RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER). */ uint64_t caps; unsigned width; /* Desired resolution for camera. Is only used as a hint. */ unsigned height; retro_camera_start_t start; /* Set by frontend. */ retro_camera_stop_t stop; /* Set by frontend. */ /* Set by libretro core if raw framebuffer callbacks will be used. */ retro_camera_frame_raw_framebuffer_t frame_raw_framebuffer; /* Set by libretro core if OpenGL texture callbacks will be used. */ retro_camera_frame_opengl_texture_t frame_opengl_texture; /* Set by libretro core. Called after camera driver is initialized and * ready to be started. * Can be NULL, in which this callback is not called. */ retro_camera_lifetime_status_t initialized; /* Set by libretro core. Called right before camera driver is * deinitialized. * Can be NULL, in which this callback is not called. */ retro_camera_lifetime_status_t deinitialized; }; /* Sets the interval of time and/or distance at which to update/poll * location-based data. * * To ensure compatibility with all location-based implementations, * values for both interval_ms and interval_distance should be provided. * * interval_ms is the interval expressed in milliseconds. * interval_distance is the distance interval expressed in meters. */ typedef void (*retro_location_set_interval_t)(unsigned interval_ms, unsigned interval_distance); /* Start location services. The device will start listening for changes to the * current location at regular intervals (which are defined with * retro_location_set_interval_t). */ typedef bool (*retro_location_start_t)(void); /* Stop location services. The device will stop listening for changes * to the current location. */ typedef void (*retro_location_stop_t)(void); /* Get the position of the current location. Will set parameters to * 0 if no new location update has happened since the last time. */ typedef bool (*retro_location_get_position_t)(double *lat, double *lon, double *horiz_accuracy, double *vert_accuracy); /* Callback which signals when the location driver is initialized * and/or deinitialized. * retro_location_start_t can be called in initialized callback. */ typedef void (*retro_location_lifetime_status_t)(void); struct retro_location_callback { retro_location_start_t start; retro_location_stop_t stop; retro_location_get_position_t get_position; retro_location_set_interval_t set_interval; retro_location_lifetime_status_t initialized; retro_location_lifetime_status_t deinitialized; }; enum retro_rumble_effect { RETRO_RUMBLE_STRONG = 0, RETRO_RUMBLE_WEAK = 1, RETRO_RUMBLE_DUMMY = INT_MAX }; /* Sets rumble state for joypad plugged in port 'port'. * Rumble effects are controlled independently, * and setting e.g. strong rumble does not override weak rumble. * Strength has a range of [0, 0xffff]. * * Returns true if rumble state request was honored. * Calling this before first retro_run() is likely to return false. */ typedef bool (*retro_set_rumble_state_t)(unsigned port, enum retro_rumble_effect effect, uint16_t strength); struct retro_rumble_interface { retro_set_rumble_state_t set_rumble_state; }; /* Notifies libretro that audio data should be written. */ typedef void (*retro_audio_callback_t)(void); /* True: Audio driver in frontend is active, and callback is * expected to be called regularily. * False: Audio driver in frontend is paused or inactive. * Audio callback will not be called until set_state has been * called with true. * Initial state is false (inactive). */ typedef void (*retro_audio_set_state_callback_t)(bool enabled); struct retro_audio_callback { retro_audio_callback_t callback; retro_audio_set_state_callback_t set_state; }; /* Notifies a libretro core of time spent since last invocation * of retro_run() in microseconds. * * It will be called right before retro_run() every frame. * The frontend can tamper with timing to support cases like * fast-forward, slow-motion and framestepping. * * In those scenarios the reference frame time value will be used. */ typedef int64_t retro_usec_t; typedef void (*retro_frame_time_callback_t)(retro_usec_t usec); struct retro_frame_time_callback { retro_frame_time_callback_t callback; /* Represents the time of one frame. It is computed as * 1000000 / fps, but the implementation will resolve the * rounding to ensure that framestepping, etc is exact. */ retro_usec_t reference; }; /* Pass this to retro_video_refresh_t if rendering to hardware. * Passing NULL to retro_video_refresh_t is still a frame dupe as normal. * */ #define RETRO_HW_FRAME_BUFFER_VALID ((void*)-1) /* Invalidates the current HW context. * Any GL state is lost, and must not be deinitialized explicitly. * If explicit deinitialization is desired by the libretro core, * it should implement context_destroy callback. * If called, all GPU resources must be reinitialized. * Usually called when frontend reinits video driver. * Also called first time video driver is initialized, * allowing libretro core to initialize resources. */ typedef void (*retro_hw_context_reset_t)(void); /* Gets current framebuffer which is to be rendered to. * Could change every frame potentially. */ typedef uintptr_t (*retro_hw_get_current_framebuffer_t)(void); /* Get a symbol from HW context. */ typedef retro_proc_address_t (*retro_hw_get_proc_address_t)(const char *sym); enum retro_hw_context_type { RETRO_HW_CONTEXT_NONE = 0, /* OpenGL 2.x. Driver can choose to use latest compatibility context. */ RETRO_HW_CONTEXT_OPENGL = 1, /* OpenGL ES 2.0. */ RETRO_HW_CONTEXT_OPENGLES2 = 2, /* Modern desktop core GL context. Use version_major/ * version_minor fields to set GL version. */ RETRO_HW_CONTEXT_OPENGL_CORE = 3, /* OpenGL ES 3.0 */ RETRO_HW_CONTEXT_OPENGLES3 = 4, /* OpenGL ES 3.1+. Set version_major/version_minor. For GLES2 and GLES3, * use the corresponding enums directly. */ RETRO_HW_CONTEXT_OPENGLES_VERSION = 5, RETRO_HW_CONTEXT_DUMMY = INT_MAX }; struct retro_hw_render_callback { /* Which API to use. Set by libretro core. */ enum retro_hw_context_type context_type; /* Called when a context has been created or when it has been reset. * An OpenGL context is only valid after context_reset() has been called. * * When context_reset is called, OpenGL resources in the libretro * implementation are guaranteed to be invalid. * * It is possible that context_reset is called multiple times during an * application lifecycle. * If context_reset is called without any notification (context_destroy), * the OpenGL context was lost and resources should just be recreated * without any attempt to "free" old resources. */ retro_hw_context_reset_t context_reset; /* Set by frontend. */ retro_hw_get_current_framebuffer_t get_current_framebuffer; /* Set by frontend. */ retro_hw_get_proc_address_t get_proc_address; /* Set if render buffers should have depth component attached. */ bool depth; /* Set if stencil buffers should be attached. */ bool stencil; /* If depth and stencil are true, a packed 24/8 buffer will be added. * Only attaching stencil is invalid and will be ignored. */ /* Use conventional bottom-left origin convention. If false, * standard libretro top-left origin semantics are used. */ bool bottom_left_origin; /* Major version number for core GL context or GLES 3.1+. */ unsigned version_major; /* Minor version number for core GL context or GLES 3.1+. */ unsigned version_minor; /* If this is true, the frontend will go very far to avoid * resetting context in scenarios like toggling fullscreen, etc. */ bool cache_context; /* The reset callback might still be called in extreme situations * such as if the context is lost beyond recovery. * * For optimal stability, set this to false, and allow context to be * reset at any time. */ /* A callback to be called before the context is destroyed in a * controlled way by the frontend. */ retro_hw_context_reset_t context_destroy; /* OpenGL resources can be deinitialized cleanly at this step. * context_destroy can be set to NULL, in which resources will * just be destroyed without any notification. * * Even when context_destroy is non-NULL, it is possible that * context_reset is called without any destroy notification. * This happens if context is lost by external factors (such as * notified by GL_ARB_robustness). * * In this case, the context is assumed to be already dead, * and the libretro implementation must not try to free any OpenGL * resources in the subsequent context_reset. */ /* Creates a debug context. */ bool debug_context; }; /* Callback type passed in RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK. * Called by the frontend in response to keyboard events. * down is set if the key is being pressed, or false if it is being released. * keycode is the RETROK value of the char. * character is the text character of the pressed key. (UTF-32). * key_modifiers is a set of RETROKMOD values or'ed together. * * The pressed/keycode state can be indepedent of the character. * It is also possible that multiple characters are generated from a * single keypress. * Keycode events should be treated separately from character events. * However, when possible, the frontend should try to synchronize these. * If only a character is posted, keycode should be RETROK_UNKNOWN. * * Similarily if only a keycode event is generated with no corresponding * character, character should be 0. */ typedef void (*retro_keyboard_event_t)(bool down, unsigned keycode, uint32_t character, uint16_t key_modifiers); struct retro_keyboard_callback { retro_keyboard_event_t callback; }; /* Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. * Should be set for implementations which can swap out multiple disk * images in runtime. * * If the implementation can do this automatically, it should strive to do so. * However, there are cases where the user must manually do so. * * Overview: To swap a disk image, eject the disk image with * set_eject_state(true). * Set the disk index with set_image_index(index). Insert the disk again * with set_eject_state(false). */ /* If ejected is true, "ejects" the virtual disk tray. * When ejected, the disk image index can be set. */ typedef bool (*retro_set_eject_state_t)(bool ejected); /* Gets current eject state. The initial state is 'not ejected'. */ typedef bool (*retro_get_eject_state_t)(void); /* Gets current disk index. First disk is index 0. * If return value is >= get_num_images(), no disk is currently inserted. */ typedef unsigned (*retro_get_image_index_t)(void); /* Sets image index. Can only be called when disk is ejected. * The implementation supports setting "no disk" by using an * index >= get_num_images(). */ typedef bool (*retro_set_image_index_t)(unsigned index); /* Gets total number of images which are available to use. */ typedef unsigned (*retro_get_num_images_t)(void); struct retro_game_info; /* Replaces the disk image associated with index. * Arguments to pass in info have same requirements as retro_load_game(). * Virtual disk tray must be ejected when calling this. * * Replacing a disk image with info = NULL will remove the disk image * from the internal list. * As a result, calls to get_image_index() can change. * * E.g. replace_image_index(1, NULL), and previous get_image_index() * returned 4 before. * Index 1 will be removed, and the new index is 3. */ typedef bool (*retro_replace_image_index_t)(unsigned index, const struct retro_game_info *info); /* Adds a new valid index (get_num_images()) to the internal disk list. * This will increment subsequent return values from get_num_images() by 1. * This image index cannot be used until a disk image has been set * with replace_image_index. */ typedef bool (*retro_add_image_index_t)(void); struct retro_disk_control_callback { retro_set_eject_state_t set_eject_state; retro_get_eject_state_t get_eject_state; retro_get_image_index_t get_image_index; retro_set_image_index_t set_image_index; retro_get_num_images_t get_num_images; retro_replace_image_index_t replace_image_index; retro_add_image_index_t add_image_index; }; enum retro_pixel_format { /* 0RGB1555, native endian. * 0 bit must be set to 0. * This pixel format is default for compatibility concerns only. * If a 15/16-bit pixel format is desired, consider using RGB565. */ RETRO_PIXEL_FORMAT_0RGB1555 = 0, /* XRGB8888, native endian. * X bits are ignored. */ RETRO_PIXEL_FORMAT_XRGB8888 = 1, /* RGB565, native endian. * This pixel format is the recommended format to use if a 15/16-bit * format is desired as it is the pixel format that is typically * available on a wide range of low-power devices. * * It is also natively supported in APIs like OpenGL ES. */ RETRO_PIXEL_FORMAT_RGB565 = 2, /* Ensure sizeof() == sizeof(int). */ RETRO_PIXEL_FORMAT_UNKNOWN = INT_MAX }; struct retro_message { const char *msg; /* Message to be displayed. */ unsigned frames; /* Duration in frames of message. */ }; /* Describes how the libretro implementation maps a libretro input bind * to its internal input system through a human readable string. * This string can be used to better let a user configure input. */ struct retro_input_descriptor { /* Associates given parameters with a description. */ unsigned port; unsigned device; unsigned index; unsigned id; /* Human readable description for parameters. * The pointer must remain valid until * retro_unload_game() is called. */ const char *description; }; struct retro_system_info { /* All pointers are owned by libretro implementation, and pointers must * remain valid until retro_deinit() is called. */ const char *library_name; /* Descriptive name of library. Should not * contain any version numbers, etc. */ const char *library_version; /* Descriptive version of core. */ const char *valid_extensions; /* A string listing probably content * extensions the core will be able to * load, separated with pipe. * I.e. "bin|rom|iso". * Typically used for a GUI to filter * out extensions. */ /* If true, retro_load_game() is guaranteed to provide a valid pathname * in retro_game_info::path. * ::data and ::size are both invalid. * * If false, ::data and ::size are guaranteed to be valid, but ::path * might not be valid. * * This is typically set to true for libretro implementations that must * load from file. * Implementations should strive for setting this to false, as it allows * the frontend to perform patching, etc. */ bool need_fullpath; /* If true, the frontend is not allowed to extract any archives before * loading the real content. * Necessary for certain libretro implementations that load games * from zipped archives. */ bool block_extract; }; struct retro_game_geometry { unsigned base_width; /* Nominal video width of game. */ unsigned base_height; /* Nominal video height of game. */ unsigned max_width; /* Maximum possible width of game. */ unsigned max_height; /* Maximum possible height of game. */ float aspect_ratio; /* Nominal aspect ratio of game. If * aspect_ratio is <= 0.0, an aspect ratio * of base_width / base_height is assumed. * A frontend could override this setting, * if desired. */ }; struct retro_system_timing { double fps; /* FPS of video content. */ double sample_rate; /* Sampling rate of audio. */ }; struct retro_system_av_info { struct retro_game_geometry geometry; struct retro_system_timing timing; }; struct retro_variable { /* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. * If NULL, obtains the complete environment string if more * complex parsing is necessary. * The environment string is formatted as key-value pairs * delimited by semicolons as so: * "key1=value1;key2=value2;..." */ const char *key; /* Value to be obtained. If key does not exist, it is set to NULL. */ const char *value; }; struct retro_game_info { const char *path; /* Path to game, UTF-8 encoded. * Usually used as a reference. * May be NULL if rom was loaded from stdin * or similar. * retro_system_info::need_fullpath guaranteed * that this path is valid. */ const void *data; /* Memory buffer of loaded game. Will be NULL * if need_fullpath was set. */ size_t size; /* Size of memory buffer. */ const char *meta; /* String of implementation specific meta-data. */ }; /* Callbacks */ /* Environment callback. Gives implementations a way of performing * uncommon tasks. Extensible. */ typedef bool (*retro_environment_t)(unsigned cmd, void *data); /* Render a frame. Pixel format is 15-bit 0RGB1555 native endian * unless changed (see RETRO_ENVIRONMENT_SET_PIXEL_FORMAT). * * Width and height specify dimensions of buffer. * Pitch specifices length in bytes between two lines in buffer. * * For performance reasons, it is highly recommended to have a frame * that is packed in memory, i.e. pitch == width * byte_per_pixel. * Certain graphic APIs, such as OpenGL ES, do not like textures * that are not packed in memory. */ typedef void (*retro_video_refresh_t)(const void *data, unsigned width, unsigned height, size_t pitch); /* Renders a single audio frame. Should only be used if implementation * generates a single sample at a time. * Format is signed 16-bit native endian. */ typedef void (*retro_audio_sample_t)(int16_t left, int16_t right); /* Renders multiple audio frames in one go. * * One frame is defined as a sample of left and right channels, interleaved. * I.e. int16_t buf[4] = { l, r, l, r }; would be 2 frames. * Only one of the audio callbacks must ever be used. */ typedef size_t (*retro_audio_sample_batch_t)(const int16_t *data, size_t frames); /* Polls input. */ typedef void (*retro_input_poll_t)(void); /* Queries for input for player 'port'. device will be masked with * RETRO_DEVICE_MASK. * * Specialization of devices such as RETRO_DEVICE_JOYPAD_MULTITAP that * have been set with retro_set_controller_port_device() * will still use the higher level RETRO_DEVICE_JOYPAD to request input. */ typedef int16_t (*retro_input_state_t)(unsigned port, unsigned device, unsigned index, unsigned id); /* Sets callbacks. retro_set_environment() is guaranteed to be called * before retro_init(). * * The rest of the set_* functions are guaranteed to have been called * before the first call to retro_run() is made. */ void retro_set_environment(retro_environment_t); void retro_set_video_refresh(retro_video_refresh_t); void retro_set_audio_sample(retro_audio_sample_t); void retro_set_audio_sample_batch(retro_audio_sample_batch_t); void retro_set_input_poll(retro_input_poll_t); void retro_set_input_state(retro_input_state_t); /* Library global initialization/deinitialization. */ void retro_init(void); void retro_deinit(void); /* Must return RETRO_API_VERSION. Used to validate ABI compatibility * when the API is revised. */ unsigned retro_api_version(void); /* Gets statically known system info. Pointers provided in *info * must be statically allocated. * Can be called at any time, even before retro_init(). */ void retro_get_system_info(struct retro_system_info *info); /* Gets information about system audio/video timings and geometry. * Can be called only after retro_load_game() has successfully completed. * NOTE: The implementation of this function might not initialize every * variable if needed. * E.g. geom.aspect_ratio might not be initialized if core doesn't * desire a particular aspect ratio. */ void retro_get_system_av_info(struct retro_system_av_info *info); /* Sets device to be used for player 'port'. * By default, RETRO_DEVICE_JOYPAD is assumed to be plugged into all * available ports. * Setting a particular device type is not a guarantee that libretro cores * will only poll input based on that particular device type. It is only a * hint to the libretro core when a core cannot automatically detect the * appropriate input device type on its own. It is also relevant when a * core can change its behavior depending on device type. */ void retro_set_controller_port_device(unsigned port, unsigned device); /* Resets the current game. */ void retro_reset(void); /* Runs the game for one video frame. * During retro_run(), input_poll callback must be called at least once. * * If a frame is not rendered for reasons where a game "dropped" a frame, * this still counts as a frame, and retro_run() should explicitly dupe * a frame if GET_CAN_DUPE returns true. * In this case, the video callback can take a NULL argument for data. */ void retro_run(void); /* Returns the amount of data the implementation requires to serialize * internal state (save states). * Between calls to retro_load_game() and retro_unload_game(), the * returned size is never allowed to be larger than a previous returned * value, to ensure that the frontend can allocate a save state buffer once. */ size_t retro_serialize_size(void); /* Serializes internal state. If failed, or size is lower than * retro_serialize_size(), it should return false, true otherwise. */ bool retro_serialize(void *data, size_t size); bool retro_unserialize(const void *data, size_t size); void retro_cheat_reset(void); void retro_cheat_set(unsigned index, bool enabled, const char *code); /* Loads a game. */ bool retro_load_game(const struct retro_game_info *game); /* Loads a "special" kind of game. Should not be used, * except in extreme cases. */ bool retro_load_game_special( unsigned game_type, const struct retro_game_info *info, size_t num_info ); /* Unloads a currently loaded game. */ void retro_unload_game(void); /* Gets region of game. */ unsigned retro_get_region(void); /* Gets region of memory. */ void *retro_get_memory_data(unsigned id); size_t retro_get_memory_size(unsigned id); #ifdef __cplusplus } #endif #endif gx/utils/vi_encoder.h000664 001750 001750 00000004632 12702465756 015771 0ustar00sergiosergio000000 000000 /**************************************************************************** * vi_encoder.c * * Wii Audio/Video Encoder support * * Copyright (C) 2009 Eke-Eke, with some code from libogc (C) Hector Martin * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * 3. The name of the author may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifdef HW_RVL typedef enum { VI_GM_0_1=1, VI_GM_0_2, VI_GM_0_3, VI_GM_0_4, VI_GM_0_5, VI_GM_0_6, VI_GM_0_7, VI_GM_0_8, VI_GM_0_9, VI_GM_1_0, VI_GM_1_1, VI_GM_1_2, VI_GM_1_3, VI_GM_1_4, VI_GM_1_5, VI_GM_1_6, VI_GM_1_7, VI_GM_1_8, VI_GM_1_9, VI_GM_2_0, VI_GM_2_1, VI_GM_2_2, VI_GM_2_3, VI_GM_2_4, VI_GM_2_5, VI_GM_2_6, VI_GM_2_7, VI_GM_2_8, VI_GM_2_9, VI_GM_3_0 } VIGamma; extern void VIDEO_SetGamma(VIGamma gamma); extern void VIDEO_SetTrapFilter(bool enable); #endif core/cart_hw/areplay.c000664 001750 001750 00000023055 12702465756 016105 0ustar00sergiosergio000000 000000 /**************************************************************************** * Genesis Plus * Action Replay / Pro Action Replay emulation * * Copyright (C) 2009-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" #define TYPE_PRO1 0x12 #define TYPE_PRO2 0x22 static struct { uint8 enabled; uint8 status; uint8 *rom; uint8 *ram; uint16 regs[13]; uint16 old[4]; uint16 data[4]; uint32 addr[4]; } action_replay; static void ar_write_regs(uint32 address, uint32 data); static void ar_write_regs_2(uint32 address, uint32 data); static void ar_write_ram_8(uint32 address, uint32 data); void areplay_init(void) { int size; memset(&action_replay,0,sizeof(action_replay)); /* store Action replay ROM (max. 128k) & RAM (64k) above cartridge ROM + SRAM area */ if (cart.romsize > 0x810000) return; action_replay.rom = cart.rom + 0x810000; action_replay.ram = cart.rom + 0x830000; /* try to load Action Replay ROM file */ size = load_archive(AR_ROM, action_replay.rom, 0x20000, NULL); /* detect Action Replay board type */ switch (size) { case 0x8000: { if (!memcmp(action_replay.rom + 0x120, "ACTION REPLAY ", 16)) { /* normal Action Replay (32K) */ action_replay.enabled = TYPE_AR; /* internal registers mapped at $010000-$01ffff */ m68k.memory_map[0x01].write16 = ar_write_regs; break; } } case 0x10000: case 0x20000: { /* Read stack pointer MSB */ uint8 sp = READ_BYTE(action_replay.rom, 0x01); /* Detect board version */ if ((sp == 0x42) && !memcmp(action_replay.rom + 0x120, "ACTION REPLAY 2 ", 16)) { /* PRO Action Replay 1 (64/128K) */ action_replay.enabled = TYPE_PRO1; /* internal registers mapped at $010000-$01ffff */ m68k.memory_map[0x01].write16 = ar_write_regs; } else if ((sp == 0x60) && !memcmp(action_replay.rom + 0x3c6, "ACTION REPLAY II", 16)) { /* PRO Action Replay 2 (64K) */ action_replay.enabled = TYPE_PRO2; /* internal registers mapped at $100000-$10ffff */ m68k.memory_map[0x10].write16 = ar_write_regs_2; } /* internal RAM (64k), mapped at $420000-$42ffff or $600000-$60ffff */ if (action_replay.enabled) { m68k.memory_map[sp].base = action_replay.ram; m68k.memory_map[sp].read8 = NULL; m68k.memory_map[sp].read16 = NULL; m68k.memory_map[sp].write8 = ar_write_ram_8; m68k.memory_map[sp].write16 = NULL; } break; } default: { break; } } #ifdef LSB_FIRST if (action_replay.enabled) { int i; for (i= 0; i> 1; if (offset > 12) { m68k_unused_16_w(address,data); return; } /* update internal register */ action_replay.regs[offset] = data; /* MODE register */ if (action_replay.regs[3] == 0xffff) { /* check switch status */ if (action_replay.status == AR_SWITCH_ON) { /* reset existing patches */ areplay_set_status(AR_SWITCH_OFF); areplay_set_status(AR_SWITCH_ON); } /* enable Cartridge ROM */ m68k.memory_map[0].base = cart.rom; } } static void ar_write_regs_2(uint32 address, uint32 data) { /* enable Cartridge ROM */ if (((address & 0xff) == 0x78) && (data == 0xffff)) { m68k.memory_map[0].base = cart.rom; } } static void ar_write_ram_8(uint32 address, uint32 data) { /* byte writes are handled as word writes, with LSB duplicated in MSB (/LWR is not used) */ *(uint16 *)(action_replay.ram + (address & 0xfffe)) = (data | (data << 8)); } gx/images/Ctrl_4wayplay.png000664 001750 001750 00000012702 12702465756 017051 0ustar00sergiosergio000000 000000 PNG  IHDRH\ͪsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATx{Ug0"X"! yIj춙Wm fe嶛fe7F- OBf`n=3O3>(|_k\>{=̌ !`p(p265S3{_~󁳁;~ <}3='@|Z`3te&p&/k~ۙ t1h^Jah`60u@3O tRW[̬} kI#2?CZЋ4ۿovhfہ/o^@11ׄt~<&X <t6u7gwemеh8[}Hg|FͰ` Iw!bf;C&y}}E=~o.QdDVaB02 3[B9{(|{ Pa8#}H u78KlkV1՛N3BhE`AiS E1($w ϔTL`2Tt|PE2l#EW ppFo>s[Il3M܈L8:eYy+rulIʮ ;&A/E5$$6 m{^KtQ l?K/R:E: DRz}/̬̞@fR7ǑBNQD C>h^Ov !ɼ9XGg Y?FBBDŽk./2 ȱu|F:$\);e2"pdBARZ)mq 2h01۳~&"F~_<~d H4 O1d~!aHǹV12o0NĞ_LD> | -ddC̬zCCC"=u$Ғ QzY!fn!ȉ!gW̝ mbp?]E>o>r@c:>a$ӊ~,FTĖo1D7Q\?"x 5| R N)qK^d} ]f"ϛ9āi#HaPی"_{G}XNB(QʥO4zJ;YB= }#}! ! U}6i! q ͬ9I$1"ڣpP"Ac0̶,ef伷h@#pZ YJdS|" !ɞ J[P̿'f6.&rn' B8|zy=ҸIKQF~~L)Q0bq?ԁ~6Jįդ3Pi-0+-Cvm(ELJk|ފ_bg'UL2p^|W+xS(yiH"0\ \I2m;ϓ̣[Emَx dr$i{ꡭZt0?w/Įˁ拳ѿo@*%kR,` MFۢV!Vu:!ख़l~y/CF 8y&](Iþ8'|w"gU[OT} ߃qdwz!FV=v> XmG4$?AhHߍo E<5p=Q&OEڳ "u냽%(Eu< -<$N̶xqDY/)Yր 3[O|{;WE?19YH ^\Ie;bcmE6o?W)m\|ϡ4_[I8 9z_dNH&:ۋ8Α(*Hh9t)?8?GO^w', )h|٠;Ytp7ZbǀWx?G m|px]dۑi$sZLt*ɼwh;_(w?|P}#W!3%iMӆL2ˑ~! q?:ik$ 0+ w'p{O`=nvY}U^Gle4qH/(nOh2JX?y5ҟ?'ps'bt{Apd~{F (Elȩهe ?OFmoy=6'ЈxNWV wO?_"Px2ȹߞifhQDd≻x:1!#VRz8݉"Nf|s(c=ڬF!c!"?OT! ۈA/C!<Q!͞W](kf;Щ (&ȝ\mn|xYq7JuDEcA$zG=S5D!fĿ"ĝ&iރ6kȺx?J݆x)!EJ<>TjBp:gڲ9f#s':EU]3"}"J.$qHN;xl:]^f1@|f;p tQ6*^NBt$ ͈7! Yvd&_&g6jOqS5C&z֓3@ G7_璎jځH@C/,=ZFil@{31̞Ϗ!e#i6;[>I$Fn E6DүZ5#: O y};BV$S#J; 9g{{b424pw_ND=nDDm3 ? CJ_$3Cx4`ꑚXFLmQoTă"@y~/?yij| Q"G"hoQZ25`ďnE/) !hf !<!_!_|Bg}D6>=p 2!<xD>8@+M"FT-iBdo'ǃ5$P4ZONCM2^Cdrbߧo&r|1Jw ͹w[My2A<#?prm*tem !EZ2t8%G@NDubVQ 3BjnO4pn#~29Uh VA`4o&[P2m_OȓkߙBD<*ZFb!! ߏL-ŷcw -d^OA/'[y(掮"n$F ăI~y7O!NܻI;j_G -G55>@ tE'dh5qMANvgSv77;ͬޚ"ZSoF"_SWR"5H *R"5H *R"5H *R"5H *R"5H *R"5H *R"5HW/˲beevkYmEQ4זesWIS,[+է͢(fߜeVWuOW8wQV_s {n-f+H9<XSE(E\/.+˖gc37e3)2<'2Y {;eY^^\RL j`+ܞ,yEQ\~8@EQ,A}B_0"0eeYss7~d]Y7eyC6qORm}ey1Z%uћM$sOZ&Ӆ7@?[V0$X?2(EQ [ԏrZ۹2 iq-ݻZx<edux(W𚢊nSkW8 =imVfǰ/>2Sr`i-eY\$[ʲZڼ.&k.'/gb@hkHXTYp ʲג%,˯L Z˲?M|mY\gWN(e(G%R(bk}2ֲ,Oư{r+O*?Eh5%d&LpVT<{䊊*e5PxRڽ>ϕey|5-F$mIENDB`gx/images/Button_up.png000664 001750 001750 00000007472 12702465756 016302 0ustar00sergiosergio000000 000000 PNG  IHDRh ?`sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATx]ky=ݳew'$F$a$@ @ ɎY\RGURRU/ep)UH?$K[RRN ( y3sޞY=U{;=݃âFshs6`Xklw]wGN(Lc(09jY$1vPL;ՌD@ӭ 1 .VU0S= ][-S44`H=_heЮkwoakf2yd;LML0mYHYB(]34W3/5޾I0x &אqY||Xu&(v_bĂ1~kY3*|<$Bch8_H@\-LʄZ n,#): <B=-`VCK luu-ݼ/پQ`Պ?^:ޅƦmm),jnSS;\cn_*_͚39#?1MeVc[ M4hzԄt0Dƞk'FIi:WA÷-3cǘb85>U?I'?΁I;Nr+/HM,-: OX o@`,º@(zp\z$דs`ꕷ/>n]_A[qK&ݗuMsύLݙaRJ[(! ؁t/oPbz]IR54hĨT0:^=̦< :R\q cbjŧ*%/'SJ=B4h)uYW+[6mh[zKX dLӎcJ_1-F $7Mi"RPBA Ӵ2ɹ_B?6hil>Nxڠ7!׃A[A@G3O^4MӠ`B ZsOʠZ3k@.@1X]Xbvwo\whOw+Gk.UjI=\(=>Y16_MDz\2̞X' 1Z@t9{02heR>ʠZРkHl&;;hؽ}kv.%o瞷Q=\i.fϦ2^=s~el2}+ft9fjVPPP=cJ)%7L+ˤȑ#6lljk]L60Jn1-ɴm]*+Αw\?Bt9{0ZAZA'b< clZ:zOV&GOJ t& gƧ3*fiڠղŃBSScs:ϟ{ovuw/8RԮl.?2yÄx/[;C|_x^LN01%)(([tfo~رc֯_^G&f̜02e h?FTF(gv*֭?zөOzenu< qƧ8D NlߖΓGGGxt=NȞ>u\f6$2heB>I\>s۽=xbnl@)!|?pgo#5-3Bqԭ < < q zv!9lz{O?[o= /|/J+/&Nvsi5YAz@_OWȘߠkVm_x^s86R̵([A MC{ے#?/y,rɌZnVOkZAzBGimiƗa۹ 51h1 ۴pogv?tӄOô.S6ػc+g c'X磋^|^__ ~ ;me;8wad"i8?|k˦SƍOs+hƘ>22</vL)X+C| Zʪ-pѝc c/o4-.69׎: Z8j]A:)%^~䅿8p˲,V\$Lo6Sw*\UBLӄCcH$ihijO~_=xŻǎ/J^:.OLm0C&rc644# drf2>)(((\C-DS"2`NvK !uk6P픪µf>Hc .-b1|K(wJ$D`m%dǥŝjv], rEꡌIj(wp$m齈F\ץu:.ǁ8 ě T ,U -)`jHI ڟ'Z "y*tLC$ʹo|\ ̮2ʠͧ9o 5}YP0,/~XQқlVZTldw"கV|>E-4v"ߓy@^<%&mu Ƕa;<!ճ 1 #hw!dS S 'o Ä&!;vBH&oV~iqz&UQO<\ -h RPB.DžhooUIENDB`core/000700 001750 001750 00000000000 12703321515 012615 5ustar00sergiosergio000000 000000 gx/utils/vi_encoder.c000664 001750 001750 00000035025 12702465756 015764 0ustar00sergiosergio000000 000000 /**************************************************************************** * vi_encoder.c * * Wii Audio/Video Encoder support * * Copyright (C) 2009 Eke-Eke, with some code from libogc (C) Hector Martin * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * 3. The name of the author may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifdef HW_RVL #include #include #include #include #include "vi_encoder.h" /**************************************************************************** * I2C driver by Hector Martin (marcan) * ****************************************************************************/ #define _SHIFTL(v, s, w) \ ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s))) #define _SHIFTR(v, s, w) \ ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1))) extern void udelay(int us); static u32 i2cIdentFirst = 0; static u32 i2cIdentFlag = 1; static vu16* const _viReg = (u16*)0xCC002000; static vu32* const _i2cReg = (u32*)0xCD800000; static inline void __viOpenI2C(u32 channel) { u32 val = ((_i2cReg[49]&~0x8000)|0x4000); val |= _SHIFTL(channel,15,1); _i2cReg[49] = val; } static inline u32 __viSetSCL(u32 channel) { u32 val = (_i2cReg[48]&~0x4000); val |= _SHIFTL(channel,14,1); _i2cReg[48] = val; return 1; } static inline u32 __viSetSDA(u32 channel) { u32 val = (_i2cReg[48]&~0x8000); val |= _SHIFTL(channel,15,1); _i2cReg[48] = val; return 1; } static inline u32 __viGetSDA() { return _SHIFTR(_i2cReg[50],15,1); } static inline void __viCheckI2C() { __viOpenI2C(0); udelay(4); i2cIdentFlag = 0; if(__viGetSDA()!=0) i2cIdentFlag = 1; } static u32 __sendSlaveAddress(u8 addr) { u32 i; __viSetSDA(i2cIdentFlag^1); udelay(2); __viSetSCL(0); for(i=0;i<8;i++) { if(addr&0x80) __viSetSDA(i2cIdentFlag); else __viSetSDA(i2cIdentFlag^1); udelay(2); __viSetSCL(1); udelay(2); __viSetSCL(0); addr <<= 1; } __viOpenI2C(0); udelay(2); __viSetSCL(1); udelay(2); if(i2cIdentFlag==1 && __viGetSDA()!=0) return 0; __viSetSDA(i2cIdentFlag^1); __viOpenI2C(1); __viSetSCL(0); return 1; } static u32 __VISendI2CData(u8 addr,void *val,u32 len) { u8 c; s32 i,j; u32 level,ret; if(i2cIdentFirst==0) { __viCheckI2C(); i2cIdentFirst = 1; } _CPU_ISR_Disable(level); __viOpenI2C(1); __viSetSCL(1); __viSetSDA(i2cIdentFlag); udelay(4); ret = __sendSlaveAddress(addr); if(ret==0) { _CPU_ISR_Restore(level); return 0; } __viOpenI2C(1); for(i=0;i> 8; buf[2] = data & 0xFF; __VISendI2CData(0xe0,buf,3); udelay(2); } static void __VIWriteI2CRegister32(u8 reg, u32 data) { u8 buf[5]; buf[0] = reg; buf[1] = data >> 24; buf[2] = (data >> 16) & 0xFF; buf[3] = (data >> 8) & 0xFF; buf[4] = data & 0xFF; __VISendI2CData(0xe0,buf,5); udelay(2); } static void __VIWriteI2CRegisterBuf(u8 reg, int size, u8 *data) { u8 buf[0x100]; buf[0] = reg; memcpy(&buf[1], data, size); __VISendI2CData(0xe0,buf,size+1); udelay(2); } /**************************************************************************** * A/V functions support (Eke-Eke) * ****************************************************************************/ static const u8 gamma_coeffs[][33] = { /* GM_0_0 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* GM_0_1 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x97, 0x3B, 0x49, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x80, 0x1B, 0x80, 0xEB, 0x00 }, /* GM_0_2 */ { 0x00, 0x00, 0x00, 0x28, 0x00, 0x5A, 0x02, 0xDB, 0x0D, 0x8D, 0x30, 0x49, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x10, 0x00, 0x10, 0x40, 0x11, 0x00, 0x18, 0x80, 0x42, 0x00, 0xEB, 0x00 }, /* GM_0_3 */ { 0x00, 0x00, 0x00, 0x7A, 0x02, 0x3C, 0x07, 0x6D, 0x12, 0x9C, 0x27, 0x24, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x10, 0x00, 0x10, 0xC0, 0x15, 0x80, 0x29, 0x00, 0x62, 0x00, 0xEB, 0x00 }, /* GM_0_4 */ { 0x00, 0x4E, 0x01, 0x99, 0x05, 0x2D, 0x0B, 0x24, 0x14, 0x29, 0x20, 0xA4, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x00, 0x10, 0x10, 0x40, 0x12, 0xC0, 0x1D, 0xC0, 0x3B, 0x00, 0x78, 0xC0, 0xEB, 0x00 }, /* GM_0_5 */ { 0x00, 0xEC, 0x03, 0xD7, 0x08, 0x00, 0x0D, 0x9E, 0x14, 0x3E, 0x1B, 0xDB, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x10, 0xC0, 0x16, 0xC0, 0x27, 0xC0, 0x4B, 0x80, 0x89, 0x80, 0xEB, 0x00 }, /* GM_0_6 */ { 0x02, 0x76, 0x06, 0x66, 0x0A, 0x96, 0x0E, 0xF3, 0x13, 0xAC, 0x18, 0x49, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x32, 0x80, 0x59, 0xC0, 0x96, 0x00, 0xEB, 0x00 }, /* GM_0_7 */ { 0x04, 0xEC, 0x08, 0xF5, 0x0C, 0x96, 0x0F, 0xCF, 0x12, 0xC6, 0x15, 0x80, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3C, 0xC0, 0x66, 0x40, 0x9F, 0xC0, 0xEB, 0x00 }, /* GM_0_8 */ { 0x08, 0x00, 0x0B, 0xAE, 0x0E, 0x00, 0x10, 0x30, 0x11, 0xCB, 0x13, 0x49, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x16, 0x80, 0x28, 0xC0, 0x46, 0x80, 0x71, 0x00, 0xA7, 0x80, 0xEB, 0x00 }, /* GM_0_9 */ { 0x0B, 0xB1, 0x0E, 0x14, 0x0F, 0x2D, 0x10, 0x18, 0x10, 0xE5, 0x11, 0x80, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x19, 0x80, 0x2F, 0x80, 0x4F, 0xC0, 0x7A, 0x00, 0xAD, 0xC0, 0xEB, 0x00 }, /* GM_1_0 */ { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xEB, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, 0x00, 0xA0, 0x00, 0xEB, 0x00 }, /* GM_1_1 */ { 0x14, 0xEC, 0x11, 0xC2, 0x10, 0x78, 0x0F, 0xB6, 0x0F, 0x2F, 0x0E, 0xB6, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x21, 0x00, 0x3C, 0xC0, 0x5F, 0xC0, 0x89, 0x00, 0xB7, 0x80, 0xEB, 0x00 }, /* GM_1_2 */ { 0x19, 0xD8, 0x13, 0x33, 0x10, 0xD2, 0x0F, 0x6D, 0x0E, 0x5E, 0x0D, 0xA4, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x25, 0x00, 0x43, 0x00, 0x66, 0xC0, 0x8F, 0x40, 0xBB, 0x40, 0xEB, 0x00 }, /* GM_1_3 */ { 0x1E, 0xC4, 0x14, 0x7A, 0x11, 0x0F, 0xF, 0x0C, 0x0D, 0xA1, 0x0C, 0xB6, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x29, 0x00, 0x49, 0x00, 0x6D, 0x40, 0x94, 0xC0, 0xBE, 0x80, 0xEB, 0x00 }, /* GM_1_4 */ { 0x24, 0x00, 0x15, 0x70, 0x11, 0x0F, 0x0E, 0xAA, 0x0D, 0x0F, 0x0B, 0xDB, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x2D, 0x40, 0x4E, 0xC0, 0x73, 0x00, 0x99, 0x80, 0xC1, 0x80, 0xEB, 0x00 }, /* GM_1_5 */ { 0x29, 0x3B, 0x16, 0x3D, 0x11, 0x0F, 0x0E, 0x30, 0x0C, 0x7D, 0x0B, 0x24, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x31, 0x80, 0x54, 0x40, 0x78, 0x80, 0x9D, 0xC0, 0xC4, 0x00, 0xEB, 0x00 }, /* GM_1_6 */ { 0x2E, 0x27, 0x17, 0x0A, 0x10, 0xD2, 0x0D, 0xE7, 0x0B, 0xEB, 0x0A, 0x80, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x35, 0x80, 0x59, 0x80, 0x7D, 0x40, 0xA1, 0xC0, 0xC6, 0x40, 0xEB, 0x00 }, /* GM_1_7 */ { 0x33, 0x62, 0x17, 0x5C, 0x10, 0xD2, 0x0D, 0x6D, 0x0B, 0x6D, 0x09, 0xED, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x39, 0xC0, 0x5E, 0x40, 0x82, 0x00, 0xA5, 0x40, 0xC8, 0x40, 0xEB, 0x00 }, /* GM_1_8 */ { 0x38, 0x4E, 0x17, 0xAE, 0x10, 0xB4, 0x0D, 0x0C, 0x0A, 0xF0, 0x09, 0x6D, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x3D, 0xC0, 0x62, 0xC0, 0x86, 0x40, 0xA8, 0x80, 0xCA, 0x00, 0xEB, 0x00 }, /* GM_1_9 */ { 0x3D, 0x3B, 0x18, 0x00, 0x10, 0x5A, 0x0C, 0xC3, 0x0A, 0x72, 0x09, 0x00, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x41, 0xC0, 0x67, 0x40, 0x8A, 0x00, 0xAB, 0x80, 0xCB, 0x80, 0xEB, 0x00 }, /* GM_2_0 */ { 0x41, 0xD8, 0x18, 0x28, 0x10, 0x3C, 0x0C, 0x49, 0x0A, 0x1F, 0x08, 0x92, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x45, 0x80, 0x6B, 0x40, 0x8D, 0xC0, 0xAE, 0x00, 0xCD, 0x00, 0xEB, 0x00 }, /* GM_2_1 */ { 0x46, 0x76, 0x18, 0x51, 0x0F, 0xE1, 0x0C, 0x00, 0x09, 0xB6, 0x08, 0x36, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x49, 0x40, 0x6F, 0x40, 0x91, 0x00, 0xB0, 0x80, 0xCE, 0x40, 0xEB, 0x00 }, /* GM_2_2 */ { 0x4A, 0xC4, 0x18, 0x7A, 0x0F, 0xA5, 0x0B, 0x9E, 0x09, 0x63, 0x07, 0xDB, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x4C, 0xC0, 0x73, 0x00, 0x94, 0x40, 0xB2, 0xC0, 0xCF, 0x80, 0xEB, 0x00 }, /* GM_2_3 */ { 0x4F, 0x13, 0x18, 0x51, 0x0F, 0x69, 0x0B, 0x6D, 0x09, 0x0F, 0x07, 0x80, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x50, 0x40, 0x76, 0x40, 0x97, 0x00, 0xB5, 0x00, 0xD0, 0xC0, 0xEB, 0x00 }, /* GM_2_4 */ { 0x53, 0x13, 0x18, 0x7A, 0x0F, 0x0F, 0x0B, 0x24, 0x08, 0xBC, 0x07, 0x36, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x53, 0x80, 0x79, 0xC0, 0x99, 0xC0, 0xB7, 0x00, 0xD1, 0xC0, 0xEB, 0x00 }, /* GM_2_5 */ { 0x57, 0x13, 0x18, 0x51, 0x0E, 0xF0, 0x0A, 0xC3, 0x08, 0x7D, 0x06, 0xED, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x56, 0xC0, 0x7C, 0xC0, 0x9C, 0x80, 0xB8, 0xC0, 0xD2, 0xC0, 0xEB, 0x00 }, /* GM_2_6 */ { 0x5B, 0x13, 0x18, 0x28, 0x0E, 0x96, 0x0A, 0x92, 0x08, 0x29, 0x06, 0xB6, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x5A, 0x00, 0x7F, 0xC0, 0x9E, 0xC0, 0xBA, 0x80, 0xD3, 0x80, 0xEB, 0x00 }, /* GM_2_7 */ { 0x5E, 0xC4, 0x18, 0x00, 0x0E, 0x78, 0x0A, 0x30, 0x08, 0x00, 0x06, 0x6D, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x5D, 0x00, 0x82, 0x80, 0xA1, 0x40, 0xBC, 0x00, 0xD4, 0x80, 0xEB, 0x00 }, /* GM_2_8 */ { 0x62, 0x76, 0x17, 0xD7, 0x0E, 0x1E, 0x0A, 0x00, 0x07, 0xC1, 0x06, 0x36, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x60, 0x00, 0x85, 0x40, 0xA3, 0x40, 0xBD, 0x80, 0xD5, 0x40, 0xEB, 0x00 }, /* GM_2_9 */ { 0x65, 0xD8, 0x17, 0xAE, 0x0D, 0xE1, 0x09, 0xCF, 0x07, 0x82, 0x06, 0x00, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x62, 0xC0, 0x87, 0xC0, 0xA5, 0x40, 0xBF, 0x00, 0xD6, 0x00, 0xEB, 0x00 }, /* GM_3_0 */ { 0x69, 0x3B, 0x17, 0x85, 0x0D, 0xA5, 0x09, 0x86, 0x07, 0x43, 0x05, 0xDB, 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, 0x10, 0x00, 0x65, 0x80, 0x8A, 0x40, 0xA7, 0x40, 0xC0, 0x40, 0xD6, 0x80, 0xEB, 0x00 } }; void __VISetTiming(u8 timing) { __VIWriteI2CRegister8(0x00,timing); } void __VISetYUVSEL(u8 dtvstatus) { u8 vdacFlagRegion = 0; u32 currTvMode = _SHIFTR(_viReg[1],8,2); if(currTvMode==VI_PAL || currTvMode==VI_EURGB60) vdacFlagRegion = 2; else if(currTvMode==VI_MPAL) vdacFlagRegion = 1; __VIWriteI2CRegister8(0x01, _SHIFTL(dtvstatus,5,3)|(vdacFlagRegion&0x1f)); } void __VISetVBICtrl(u16 data) { __VIWriteI2CRegister16(0x02, data); } void __VISetTrapFilter(u8 disable) { if (disable) __VIWriteI2CRegister8(0x03, 0); else __VIWriteI2CRegister8(0x03, 1); } void __VISet3in1Output(u8 enable) { __VIWriteI2CRegister8(0x04,enable); } void __VISetCGMS(u16 value) { __VIWriteI2CRegister16(0x05, value); } void __VISetWSS(u16 value) { __VIWriteI2CRegister16(0x08, value); } void __VISetRGBOverDrive(u8 value) { u32 currTvMode = _SHIFTR(_viReg[1],8,2); if (currTvMode == VI_DEBUG) __VIWriteI2CRegister8(0x0A,(value<<1)|1); else __VIWriteI2CRegister8(0x0A,0); } void __VISetOverSampling(void) { __VIWriteI2CRegister8(0x65,1); } void __VISetCCSEL(void) { __VIWriteI2CRegister8(0x6a,1); } void __VISetFilterEURGB60(u8 enable) { __VIWriteI2CRegister8(0x6e, enable); } void __VISetVolume(u16 value) { __VIWriteI2CRegister16(0x71,value); } void __VISetClosedCaption(u32 value) { __VIWriteI2CRegister32(0x7a, value); } void __VISetGamma(VIGamma gamma) { u8 *data = (u8 *)&gamma_coeffs[gamma][0]; __VIWriteI2CRegisterBuf(0x10, 0x21, data); } /* User Configurable */ void VIDEO_SetGamma(VIGamma gamma) { __VISetGamma(gamma); } void VIDEO_SetTrapFilter(bool enable) { if (enable) __VISetTrapFilter(0); else __VISetTrapFilter(1); } #endif core/input_hw/sportspad.h000664 001750 001750 00000004710 12702465756 016677 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Sports Pad support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _SPORTSPAD_H_ #define _SPORTSPAD_H_ /* Function prototypes */ extern void sportspad_reset(int index); extern unsigned char sportspad_1_read(void); extern unsigned char sportspad_2_read(void); extern void sportspad_1_write(unsigned char data, unsigned char mask); extern void sportspad_2_write(unsigned char data, unsigned char mask); #endif libretro/libretro.c000664 001750 001750 00000174675 12702465756 015554 0ustar00sergiosergio000000 000000 #ifndef _MSC_VER #include #endif #include #include #include #ifdef _MSC_VER #define snprintf _snprintf #endif #ifdef _XBOX1 #include #endif #define RETRO_DEVICE_MDPAD_3B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0) #define RETRO_DEVICE_MDPAD_6B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1) #define RETRO_DEVICE_MSPAD_2B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 2) #define RETRO_DEVICE_MDPAD_3B_WAYPLAY RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 3) #define RETRO_DEVICE_MDPAD_6B_WAYPLAY RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 4) #define RETRO_DEVICE_MDPAD_3B_TEAMPLAYER RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 5) #define RETRO_DEVICE_MDPAD_6B_TEAMPLAYER RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 6) #define RETRO_DEVICE_MSPAD_2B_MASTERTAP RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 7) #define RETRO_DEVICE_PADDLE RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 0) #define RETRO_DEVICE_SPORTSPAD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 1) #define RETRO_DEVICE_XE_1AP RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 2) #define RETRO_DEVICE_PHASER RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 0) #define RETRO_DEVICE_MENACER RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 1) #define RETRO_DEVICE_JUSTIFIERS RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 2) #define RETRO_DEVICE_GRAPHIC_BOARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_POINTER, 0) #include "shared.h" #include "libretro.h" #include "md_ntsc.h" #include "sms_ntsc.h" sms_ntsc_t *sms_ntsc; md_ntsc_t *md_ntsc; char GG_ROM[256]; char AR_ROM[256]; char SK_ROM[256]; char SK_UPMEM[256]; char MD_BIOS[256]; char GG_BIOS[256]; char MS_BIOS_EU[256]; char MS_BIOS_JP[256]; char MS_BIOS_US[256]; char CD_BIOS_EU[256]; char CD_BIOS_US[256]; char CD_BIOS_JP[256]; char CD_BRAM_JP[256]; char CD_BRAM_US[256]; char CD_BRAM_EU[256]; char CART_BRAM[256]; static int vwidth; static int vheight; static uint32_t brm_crc[2]; static uint8_t brm_format[0x40] = { 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f }; static bool is_running = 0; static uint8_t temp[0x10000]; static int16 soundbuffer[3068]; static uint16_t bitmap_data_[720 * 576]; static const double pal_fps = 53203424.0 / (3420.0 * 313.0); static const double ntsc_fps = 53693175.0 / (3420.0 * 262.0); static char g_rom_dir[1024]; static retro_log_printf_t log_cb; static retro_video_refresh_t video_cb; static retro_input_poll_t input_poll_cb; static retro_input_state_t input_state_cb; static retro_environment_t environ_cb; static retro_audio_sample_batch_t audio_cb; /* Cheat Support */ #define MAX_CHEATS (150) typedef struct { bool enable; uint16_t data; uint16_t old; uint32_t address; uint8_t *prev; } CHEATENTRY; static int maxcheats = 0; static int maxROMcheats = 0; static int maxRAMcheats = 0; static CHEATENTRY cheatlist[MAX_CHEATS]; static uint8_t cheatIndexes[MAX_CHEATS]; static char ggvalidchars[] = "ABCDEFGHJKLMNPRSTVWXYZ0123456789"; static char arvalidchars[] = "0123456789ABCDEF"; /************************************ * Genesis Plus GX implementation ************************************/ #undef CHUNKSIZE #define CHUNKSIZE (0x10000) void error(char * fmt, ...) { char buffer[256]; va_list ap; va_start(ap, fmt); vsprintf(buffer, fmt, ap); if (log_cb) log_cb(RETRO_LOG_ERROR, "%s\n", buffer); va_end(ap); } int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) { int size, left; /* Open file */ FILE *fd = fopen(filename, "rb"); if (!fd) { /* Master System & Game Gear BIOS are optional files */ if (!strcmp(filename,MS_BIOS_US) || !strcmp(filename,MS_BIOS_EU) || !strcmp(filename,MS_BIOS_JP) || !strcmp(filename,GG_BIOS)) { return 0; } /* Mega CD BIOS are required files */ if (!strcmp(filename,CD_BIOS_US) || !strcmp(filename,CD_BIOS_EU) || !strcmp(filename,CD_BIOS_JP)) { if (log_cb) log_cb(RETRO_LOG_ERROR, "Unable to open CD BIOS: %s.\n", filename); return 0; } if (log_cb) log_cb(RETRO_LOG_ERROR, "Unable to open file.\n"); return 0; } /* Get file size */ fseek(fd, 0, SEEK_END); size = ftell(fd); /* size limit */ if (size > MAXROMSIZE) { fclose(fd); if (log_cb) log_cb(RETRO_LOG_ERROR, "File is too large.\n"); return 0; } else if (size > maxsize) { size = maxsize; } if (log_cb) log_cb(RETRO_LOG_INFO, "INFORMATION - Loading %d bytes ...\n", size); /* filename extension */ if (extension) { memcpy(extension, &filename[strlen(filename) - 3], 3); extension[3] = 0; } /* Read into buffer */ left = size; fseek(fd, 0, SEEK_SET); while (left > CHUNKSIZE) { fread(buffer, CHUNKSIZE, 1, fd); buffer += CHUNKSIZE; left -= CHUNKSIZE; } /* Read remaining bytes */ fread(buffer, left, 1, fd); /* Close file */ fclose(fd); /* Return loaded ROM size */ return size; } static void RAMCheatUpdate(void); void osd_input_update(void) { int i, player = 0; unsigned int temp; input_poll_cb(); /* Update RAM patches */ RAMCheatUpdate(); for (i = 0; i < MAX_INPUTS; i++) { temp = 0; switch (input.dev[i]) { case DEVICE_PAD6B: { if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L)) temp |= INPUT_X; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X)) temp |= INPUT_Y; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R)) temp |= INPUT_Z; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT)) temp |= INPUT_MODE; } case DEVICE_PAD3B: { if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y)) temp |= INPUT_A; } case DEVICE_PAD2B: { if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B)) temp |= INPUT_B; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A)) temp |= INPUT_C; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)) temp |= INPUT_START; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP)) temp |= INPUT_UP; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN)) temp |= INPUT_DOWN; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT)) temp |= INPUT_LEFT; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)) temp |= INPUT_RIGHT; player++; break; } case DEVICE_MOUSE: { input.analog[i][0] = input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); if (config.invert_mouse) input.analog[i][1] = input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); else input.analog[i][1] = -input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); if (input.analog[i][0] < -255) input.analog[i][0] = -255; else if (input.analog[i][0] > 255) input.analog[i][0] = 255; if (input.analog[i][1] < -255) input.analog[i][1] = -255; else if (input.analog[i][1] > 255) input.analog[i][1] = 255; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) temp |= INPUT_MOUSE_LEFT; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)) temp |= INPUT_MOUSE_RIGHT; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN)) temp |= INPUT_MOUSE_CENTER; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE)) temp |= INPUT_START; player++; break; } case DEVICE_LIGHTGUN: { input.analog[i][0] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 0x7fff) * bitmap.viewport.w) / 0xfffe; input.analog[i][1] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 0x7fff) * bitmap.viewport.h) / 0xfffe; if (input_state_cb(player, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_TRIGGER)) temp |= INPUT_A; if (input_state_cb(player, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_TURBO)) temp |= INPUT_B; if (input_state_cb(player, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_PAUSE)) temp |= INPUT_C; if (input_state_cb(player, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_START)) temp |= INPUT_START; player++; break; } case DEVICE_PADDLE: { input.analog[i][0] = (input_state_cb(player, RETRO_DEVICE_ANALOG, 0, RETRO_DEVICE_ID_ANALOG_X) + 0x8000) >> 8; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B)) temp |= INPUT_BUTTON1; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)) temp |= INPUT_START; player++; break; } case DEVICE_SPORTSPAD: { input.analog[i][0] = (input_state_cb(player, RETRO_DEVICE_ANALOG, 0, RETRO_DEVICE_ID_ANALOG_X) + 0x8000) >> 8; input.analog[i][1] = (input_state_cb(player, RETRO_DEVICE_ANALOG, 0, RETRO_DEVICE_ID_ANALOG_Y) + 0x8000) >> 8; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B)) temp |= INPUT_BUTTON1; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A)) temp |= INPUT_BUTTON2; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)) temp |= INPUT_START; player++; break; } case DEVICE_PICO: { input.analog[i][0] = 0x03c + ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 0x7fff) * (0x17c-0x03c)) / 0xfffe; input.analog[i][1] = 0x1fc + ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 0x7fff) * (0x2f7-0x1fc)) / 0xfffe; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) temp |= INPUT_PICO_PEN; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)) temp |= INPUT_PICO_RED; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP)) pico_current = (pico_current - 1) & 7; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN)) pico_current = (pico_current + 1) & 7; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP)) temp |= INPUT_UP; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN)) temp |= INPUT_DOWN; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT)) temp |= INPUT_LEFT; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)) temp |= INPUT_RIGHT; player++; break; } case DEVICE_TEREBI: { input.analog[i][0] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 0x7fff) * 250) / 0xfffe; input.analog[i][1] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 0x7fff) * 250) / 0xfffe; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) temp |= INPUT_BUTTON1; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE)) temp |= INPUT_START; player++; break; } case DEVICE_GRAPHIC_BOARD: { input.analog[i][0] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 0x7fff) * 255) / 0xfffe; input.analog[i][1] = ((input_state_cb(player, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 0x7fff) * 255) / 0xfffe; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) temp |= INPUT_GRAPHIC_PEN; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE)) temp |= INPUT_GRAPHIC_DO; if (input_state_cb(player, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)) temp |= INPUT_GRAPHIC_MENU; player++; break; } case DEVICE_XE_1AP: { int rx = input.analog[i][0] = input_state_cb(player, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X); int ry = input.analog[i][1] = input_state_cb(player, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y); if (abs(rx) > abs(ry)) { input.analog[i+1][0] = (rx + 0x8000) >> 8; } else { input.analog[i+1][0] = (0x7fff - ry) >> 8; } input.analog[i][0] = (input_state_cb(player, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) + 0x8000) >> 8; input.analog[i][1] = (input_state_cb(player, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) + 0x8000) >> 8; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R)) temp |= INPUT_XE_A; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2)) temp |= INPUT_XE_B; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L)) temp |= INPUT_XE_C; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2)) temp |= INPUT_XE_D; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y)) temp |= INPUT_XE_E1; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B)) temp |= INPUT_XE_E2; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT)) temp |= INPUT_XE_SELECT; if (input_state_cb(player, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)) temp |= INPUT_XE_START; player++; break; } default: break; } input.pad[i] = temp; } } static void draw_cursor(int16_t x, int16_t y, uint16_t color) { uint16_t *ptr = (uint16_t *)bitmap.data + ((bitmap.viewport.y + y) * bitmap.width) + x + bitmap.viewport.x; ptr[-3*bitmap.width] = ptr[-bitmap.width] = ptr[bitmap.width] = ptr[3*bitmap.width] = ptr[-3] = ptr[-1] = ptr[1] = ptr[3] = color; ptr[-2*bitmap.width] = ptr[2*bitmap.width] = ptr[-2] = ptr[2] = ptr[0] = 0xffff; } static void init_bitmap(void) { memset(&bitmap, 0, sizeof(bitmap)); bitmap.width = 720; bitmap.height = 576; bitmap.pitch = 720 * 2; bitmap.data = (uint8_t *)bitmap_data_; } static void config_default(void) { int i; /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; config.hq_fm = 1; /* high-quality resampling */ config.psgBoostNoise = 1; config.filter = 0; /* no filter */ config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 1.0; config.mg = 1.0; config.hg = 1.0; config.dac_bits = 14; /* MAX DEPTH */ config.ym2413 = 2; /* AUTO */ config.mono = 0; /* STEREO output */ /* system options */ config.system = 0; /* AUTO */ config.region_detect = 0; /* AUTO */ config.vdp_mode = 0; /* AUTO */ config.master_clock = 0; /* AUTO */ config.force_dtack = 0; config.addr_error = 1; config.bios = 0; config.lock_on = 0; config.lcd = 0; /* 0.8 fixed point */ /* video options */ config.overscan = 0; config.gg_extra = 0; config.ntsc = 0; config.lcd = 0; config.render = 0; /* input options */ input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD; for (i=0; i CHUNKSIZE) { fread(scd.cartridge.area + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Read remaining bytes */ if (filesize) { fread(scd.cartridge.area + done, filesize, 1, fp); } /* close file */ fclose(fp); /* update CRC */ brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); } /* check if cartridge backup RAM is correctly formatted */ if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { /* clear cartridge backup RAM */ memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); /* Cartridge Backup RAM size fields */ brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; /* format cartridge backup RAM */ memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - 0x40, brm_format, 0x40); } } } static void bram_save(void) { FILE *fp; /* verify that internal backup RAM has been modified */ if (crc32(0, scd.bram, 0x2000) != brm_crc[0]) { /* check if it is correctly formatted before saving */ if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) { switch (region_code) { case REGION_JAPAN_NTSC: fp = fopen(CD_BRAM_JP, "wb"); break; case REGION_EUROPE: fp = fopen(CD_BRAM_EU, "wb"); break; case REGION_USA: fp = fopen(CD_BRAM_US, "wb"); break; default: return; } if (fp != NULL) { fwrite(scd.bram, 0x2000, 1, fp); fclose(fp); /* update CRC */ brm_crc[0] = crc32(0, scd.bram, 0x2000); } } } /* verify that cartridge backup RAM has been modified */ if (scd.cartridge.id && (crc32(0, scd.cartridge.area, scd.cartridge.mask + 1) != brm_crc[1])) { /* check if it is correctly formatted before saving */ if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) { fp = fopen(CART_BRAM, "wb"); if (fp != NULL) { int filesize = scd.cartridge.mask + 1; int done = 0; /* Write to file (2k blocks) */ while (filesize > CHUNKSIZE) { fwrite(scd.cartridge.area + done, CHUNKSIZE, 1, fp); done += CHUNKSIZE; filesize -= CHUNKSIZE; } /* Write remaining bytes */ if (filesize) { fwrite(scd.cartridge.area + done, filesize, 1, fp); } /* Close file */ fclose(fp); /* update CRC */ brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); } } } } static void extract_directory(char *buf, const char *path, size_t size) { char *base; strncpy(buf, path, size - 1); buf[size - 1] = '\0'; base = strrchr(buf, '/'); if (!base) base = strrchr(buf, '\\'); if (base) *base = '\0'; else buf[0] = '\0'; } static bool update_viewport(void) { int ow = vwidth; int oh = vheight; vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); if (config.ntsc) { if (reg[12] & 1) vwidth = MD_NTSC_OUT_WIDTH(vwidth); else vwidth = SMS_NTSC_OUT_WIDTH(vwidth); } if (config.render && interlaced) { vheight = vheight * 2; } return ((ow != vwidth) || (oh != vheight)); } static void check_variables(void) { unsigned orig_value; bool update_viewports = false; bool reinit = false; struct retro_variable var = {0}; var.key = "genesis_plus_gx_system_hw"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.system; if (!strcmp(var.value, "sg-1000")) config.system = SYSTEM_SG; else if (!strcmp(var.value, "sg-1000 II")) config.system = SYSTEM_SGII; else if (!strcmp(var.value, "mark-III")) config.system = SYSTEM_MARKIII; else if (!strcmp(var.value, "master system")) config.system = SYSTEM_SMS; else if (!strcmp(var.value, "master system II")) config.system = SYSTEM_SMS2; else if (!strcmp(var.value, "game gear")) config.system = SYSTEM_GG; else if (!strcmp(var.value, "mega drive / genesis")) config.system = SYSTEM_MD; else config.system = 0; if (orig_value != config.system) { if (system_hw) { switch (config.system) { case 0: system_hw = romtype; /* AUTO */ break; case SYSTEM_MD: system_hw = (romtype & SYSTEM_MD) ? romtype : SYSTEM_PBC; break; case SYSTEM_GG: system_hw = (romtype == SYSTEM_GG) ? SYSTEM_GG : SYSTEM_GGMS; break; default: system_hw = config.system; break; } reinit = true; } } } var.key = "genesis_plus_gx_region_detect"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.region_detect; if (!strcmp(var.value, "ntsc-u")) config.region_detect = 1; else if (!strcmp(var.value, "pal")) config.region_detect = 2; else if (!strcmp(var.value, "ntsc-j")) config.region_detect = 3; else config.region_detect = 0; if (orig_value != config.region_detect) { if (system_hw) { get_region(NULL); reinit = true; } } } var.key = "genesis_plus_gx_bios"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.bios; if (!strcmp(var.value, "enabled")) config.bios = 3; else config.bios = 0; if (orig_value != config.bios) { if (system_hw) { reinit = true; } } } var.key = "genesis_plus_gx_force_dtack"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (!strcmp(var.value, "enabled")) config.force_dtack = 1; else config.force_dtack = 0; } var.key = "genesis_plus_gx_addr_error"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (!strcmp(var.value, "enabled")) m68k.aerr_enabled = config.addr_error = 1; else m68k.aerr_enabled = config.addr_error = 0; } var.key = "genesis_plus_gx_lock_on"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.lock_on; if (!strcmp(var.value, "game genie")) config.lock_on = TYPE_GG; else if (!strcmp(var.value, "action replay (pro)")) config.lock_on = TYPE_AR; else if (!strcmp(var.value, "sonic & knuckles")) config.lock_on = TYPE_SK; else config.lock_on = 0; if (orig_value != config.lock_on) { if (system_hw == SYSTEM_MD) reinit = true; } } var.key = "genesis_plus_gx_ym2413"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.ym2413; if (!strcmp(var.value, "enabled")) config.ym2413 = 1; else if (!strcmp(var.value, "disabled")) config.ym2413 = 0; else config.ym2413 = 2; if (orig_value != config.ym2413) { if (system_hw && (config.ym2413 & 2) && ((system_hw & SYSTEM_PBC) != SYSTEM_MD)) { memcpy(temp, sram.sram, sizeof(temp)); sms_cart_init(); memcpy(sram.sram, temp, sizeof(temp)); } } } var.key = "genesis_plus_gx_dac_bits"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (!strcmp(var.value, "enabled")) config.dac_bits = 9; else config.dac_bits = 14; YM2612Config(config.dac_bits); } var.key = "genesis_plus_gx_blargg_ntsc_filter"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.ntsc; if (strcmp(var.value, "disabled") == 0) config.ntsc = 0; else if (strcmp(var.value, "monochrome") == 0) { config.ntsc = 1; sms_ntsc_init(sms_ntsc, &sms_ntsc_monochrome); md_ntsc_init(md_ntsc, &md_ntsc_monochrome); } else if (strcmp(var.value, "composite") == 0) { config.ntsc = 1; sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite); } else if (strcmp(var.value, "svideo") == 0) { config.ntsc = 1; sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo); } else if (strcmp(var.value, "rgb") == 0) { config.ntsc = 1; sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); } if (orig_value != config.ntsc) update_viewports = true; } var.key = "genesis_plus_gx_lcd_filter"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (strcmp(var.value, "disabled") == 0) config.lcd = 0; else if (strcmp(var.value, "enabled") == 0) config.lcd = (uint8)(0.80 * 256); } var.key = "genesis_plus_gx_overscan"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.overscan; if (strcmp(var.value, "disabled") == 0) config.overscan = 0; else if (strcmp(var.value, "top/bottom") == 0) config.overscan = 1; else if (strcmp(var.value, "left/right") == 0) config.overscan = 2; else if (strcmp(var.value, "full") == 0) config.overscan = 3; if (orig_value != config.overscan) update_viewports = true; } var.key = "genesis_plus_gx_gg_extra"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.gg_extra; if (strcmp(var.value, "disabled") == 0) config.gg_extra = 0; else if (strcmp(var.value, "enabled") == 0) config.gg_extra = 1; if (orig_value != config.gg_extra) update_viewports = true; } var.key = "genesis_plus_gx_render"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { orig_value = config.render; if (strcmp(var.value, "single field") == 0) config.render = 0; else config.render = 1; if (orig_value != config.render) update_viewports = true; } var.key = "genesis_plus_gx_gun_cursor"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (strcmp(var.value, "no") == 0) config.gun_cursor = 0; else config.gun_cursor = 1; } var.key = "genesis_plus_gx_invert_mouse"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { if (strcmp(var.value, "no") == 0) config.invert_mouse = 0; else config.invert_mouse = 1; } if (reinit) { audio_init(44100, snd.frame_rate); memcpy(temp, sram.sram, sizeof(temp)); system_init(); system_reset(); memcpy(sram.sram, temp, sizeof(temp)); } if (update_viewports) { bitmap.viewport.changed = 3; if ((system_hw == SYSTEM_GG) && !config.gg_extra) bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; else bitmap.viewport.x = (config.overscan & 2) * 7; } } /* Cheat Support */ static uint32_t decode_cheat(char *string, int index) { char *p; int i,n; uint32_t len = 0; uint32_t address = 0; uint16_t data = 0; uint8_t ref = 0; /* 16-bit Game Genie code (ABCD-EFGH) */ if ((strlen(string) >= 9) && (string[4] == '-')) { /* 16-bit system only */ if ((system_hw & SYSTEM_PBC) != SYSTEM_MD) { return 0; } for (i = 0; i < 8; i++) { if (i == 4) string++; p = strchr (ggvalidchars, *string++); if (p == NULL) return 0; n = p - ggvalidchars; switch (i) { case 0: data |= n << 3; break; case 1: data |= n >> 2; address |= (n & 3) << 14; break; case 2: address |= n << 9; break; case 3: address |= (n & 0xF) << 20 | (n >> 4) << 8; break; case 4: data |= (n & 1) << 12; address |= (n >> 1) << 16; break; case 5: data |= (n & 1) << 15 | (n >> 1) << 8; break; case 6: data |= (n >> 3) << 13; address |= (n & 7) << 5; break; case 7: address |= n; break; } } /* code length */ len = 9; } /* 8-bit Game Genie code (DDA-AAA-XXX) */ else if ((strlen(string) >= 11) && (string[3] == '-') && (string[7] == '-')) { /* 8-bit system only */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { return 0; } /* decode 8-bit data */ for (i=0; i<2; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((1 - i) * 4)); } /* decode 16-bit address (low 12-bits) */ for (i=0; i<3; i++) { if (i==1) string++; /* skip separator */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((2 - i) * 4)); } /* decode 16-bit address (high 4-bits) */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; n ^= 0xF; /* bits inversion */ address |= (n << 12); /* RAM address are also supported */ if (address >= 0xC000) { /* convert to 24-bit Work RAM address */ address = 0xFF0000 | (address & 0x1FFF); } /* decode reference 8-bit data */ for (i=0; i<2; i++) { string++; /* skip separator and 2nd digit */ p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; ref |= (n << ((1 - i) * 4)); } ref = (ref >> 2) | ((ref & 0x03) << 6); /* 2-bit right rotation */ ref ^= 0xBA; /* XOR */ /* update old data value */ cheatlist[index].old = ref; /* code length */ len = 11; } /* Action Replay code */ else if (string[6] == ':') { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit code (AAAAAA:DDDD) */ if (strlen(string) < 11) return 0; /* decode 24-bit address */ for (i=0; i<6; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((5 - i) * 4)); } /* decode 16-bit data */ string++; for (i=0; i<4; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((3 - i) * 4)); } /* code length */ len = 11; } else { /* 8-bit code (xxAAAA:DD) */ if (strlen(string) < 9) return 0; /* decode 16-bit address */ string+=2; for (i=0; i<4; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; address |= (n << ((3 - i) * 4)); } /* ROM addresses are not supported */ if (address < 0xC000) return 0; /* convert to 24-bit Work RAM address */ address = 0xFF0000 | (address & 0x1FFF); /* decode 8-bit data */ string++; for (i=0; i<2; i++) { p = strchr (arvalidchars, *string++); if (p == NULL) return 0; n = (p - arvalidchars) & 0xF; data |= (n << ((1 - i) * 4)); } /* code length */ len = 9; } } /* Valid code found ? */ if (len) { /* update cheat address & data values */ cheatlist[index].address = address; cheatlist[index].data = data; } /* return code length (0 = invalid) */ return len; } static void apply_cheats(void) { uint8_t *ptr; int i; /* clear ROM&RAM patches counter */ maxROMcheats = maxRAMcheats = 0; for (i = 0; i < maxcheats; i++) { if (cheatlist[i].enable) { if (cheatlist[i].address < cart.romsize) { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* patch ROM data */ cheatlist[i].old = *(uint16_t *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)); *(uint16_t *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)) = cheatlist[i].data; } else { /* add ROM patch */ maxROMcheats++; cheatIndexes[MAX_CHEATS - maxROMcheats] = i; /* get current banked ROM address */ ptr = &z80_readmap[(cheatlist[i].address) >> 10][cheatlist[i].address & 0x03FF]; /* check if reference matches original ROM data */ if (((uint8_t)cheatlist[i].old) == *ptr) { /* patch data */ *ptr = cheatlist[i].data; /* save patched ROM address */ cheatlist[i].prev = ptr; } else { /* no patched ROM address yet */ cheatlist[i].prev = NULL; } } } else if (cheatlist[i].address >= 0xFF0000) { /* add RAM patch */ cheatIndexes[maxRAMcheats++] = i; } } } } static void clear_cheats(void) { int i = maxcheats; /* disable cheats in reversed order in case the same address is used by multiple patches */ while (i > 0) { if (cheatlist[i-1].enable) { if (cheatlist[i-1].address < cart.romsize) { if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* restore original ROM data */ *(uint16_t *)(cart.rom + (cheatlist[i-1].address & 0xFFFFFE)) = cheatlist[i-1].old; } else { /* check if previous banked ROM address has been patched */ if (cheatlist[i-1].prev != NULL) { /* restore original data */ *cheatlist[i-1].prev = cheatlist[i-1].old; /* no more patched ROM address */ cheatlist[i-1].prev = NULL; } } } } i--; } } /**************************************************************************** * RAMCheatUpdate * * Apply RAM patches (this should be called once per frame) * ****************************************************************************/ static void RAMCheatUpdate(void) { int index, cnt = maxRAMcheats; while (cnt) { /* get cheat index */ index = cheatIndexes[--cnt]; /* apply RAM patch */ if (cheatlist[index].data & 0xFF00) { /* 16-bit patch */ *(uint16_t *)(work_ram + (cheatlist[index].address & 0xFFFE)) = cheatlist[index].data; } else { /* 8-bit patch */ work_ram[cheatlist[index].address & 0xFFFF] = cheatlist[index].data; } } } /**************************************************************************** * ROMCheatUpdate * * Apply ROM patches (this should be called each time banking is changed) * ****************************************************************************/ void ROMCheatUpdate(void) { int index, cnt = maxROMcheats; uint8_t *ptr; while (cnt) { /* get cheat index */ index = cheatIndexes[MAX_CHEATS - cnt]; /* check if previous banked ROM address was patched */ if (cheatlist[index].prev != NULL) { /* restore original data */ *cheatlist[index].prev = cheatlist[index].old; /* no more patched ROM address */ cheatlist[index].prev = NULL; } /* get current banked ROM address */ ptr = &z80_readmap[(cheatlist[index].address) >> 10][cheatlist[index].address & 0x03FF]; /* check if reference matches original ROM data */ if (((uint8_t)cheatlist[index].old) == *ptr) { /* patch data */ *ptr = cheatlist[index].data; /* save patched ROM address */ cheatlist[index].prev = ptr; } /* next ROM patch */ cnt--; } } /************************************ * libretro implementation ************************************/ unsigned retro_api_version(void) { return RETRO_API_VERSION; } void retro_set_environment(retro_environment_t cb) { static const struct retro_variable vars[] = { { "genesis_plus_gx_system_hw", "System hardware; auto|sg-1000|sg-1000 II|mark-III|master system|master system II|game gear|mega drive / genesis" }, { "genesis_plus_gx_region_detect", "System region; auto|ntsc-u|pal|ntsc-j" }, { "genesis_plus_gx_force_dtack", "System lockups; enabled|disabled" }, { "genesis_plus_gx_bios", "System bootrom; disabled|enabled" }, { "genesis_plus_gx_addr_error", "68k address error; enabled|disabled" }, { "genesis_plus_gx_lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" }, { "genesis_plus_gx_ym2413", "Master System FM; auto|disabled|enabled" }, { "genesis_plus_gx_dac_bits", "YM2612 DAC quantization; disabled|enabled" }, { "genesis_plus_gx_blargg_ntsc_filter", "Blargg NTSC filter; disabled|monochrome|composite|svideo|rgb" }, { "genesis_plus_gx_lcd_filter", "LCD Ghosting filter; disabled|enabled" }, { "genesis_plus_gx_overscan", "Borders; disabled|top/bottom|left/right|full" }, { "genesis_plus_gx_gg_extra", "Game Gear extended screen; disabled|enabled" }, { "genesis_plus_gx_render", "Interlaced mode 2 output; single field|double field" }, { "genesis_plus_gx_gun_cursor", "Show Lightgun crosshair; no|yes" }, { "genesis_plus_gx_invert_mouse", "Invert Mouse Y-axis; no|yes" }, { NULL, NULL }, }; static const struct retro_controller_description port_1[] = { { "Joypad Auto", RETRO_DEVICE_JOYPAD }, { "Joypad Port Empty", RETRO_DEVICE_NONE }, { "MD Joypad 3 Button", RETRO_DEVICE_MDPAD_3B }, { "MD Joypad 6 Button", RETRO_DEVICE_MDPAD_6B }, { "MS Joypad 2 Button", RETRO_DEVICE_MSPAD_2B }, { "MD Joypad 3 Button + 4-WayPlay", RETRO_DEVICE_MDPAD_3B_WAYPLAY }, { "MD Joypad 6 Button + 4-WayPlay", RETRO_DEVICE_MDPAD_6B_WAYPLAY }, { "MD Joypad 3 Button + Teamplayer", RETRO_DEVICE_MDPAD_3B_TEAMPLAYER }, { "MD Joypad 6 Button + Teamplayer", RETRO_DEVICE_MDPAD_6B_TEAMPLAYER }, { "MS Joypad 2 Button + Master Tap", RETRO_DEVICE_MSPAD_2B_MASTERTAP }, { "MS Light Phaser", RETRO_DEVICE_PHASER }, { "MS Paddle Control", RETRO_DEVICE_PADDLE }, { "MS Sports Pad", RETRO_DEVICE_SPORTSPAD }, { "MS Graphic Board", RETRO_DEVICE_GRAPHIC_BOARD }, { "MD XE-1AP", RETRO_DEVICE_XE_1AP }, { "MD Mouse", RETRO_DEVICE_MOUSE }, }; static const struct retro_controller_description port_2[] = { { "Joypad Auto", RETRO_DEVICE_JOYPAD }, { "Joypad Port Empty", RETRO_DEVICE_NONE }, { "MD Joypad 3 Button", RETRO_DEVICE_MDPAD_3B }, { "MD Joypad 6 Button", RETRO_DEVICE_MDPAD_6B }, { "MS Joypad 2 Button", RETRO_DEVICE_MSPAD_2B }, { "MD Joypad 3 Button + 4-WayPlay", RETRO_DEVICE_MDPAD_3B_WAYPLAY }, { "MD Joypad 6 Button + 4-WayPlay", RETRO_DEVICE_MDPAD_6B_WAYPLAY }, { "MD Joypad 3 Button + Teamplayer", RETRO_DEVICE_MDPAD_3B_TEAMPLAYER }, { "MD Joypad 6 Button + Teamplayer", RETRO_DEVICE_MDPAD_6B_TEAMPLAYER }, { "MS Joypad 2 Button + Master Tap", RETRO_DEVICE_MSPAD_2B_MASTERTAP }, { "MD Menacer", RETRO_DEVICE_MENACER }, { "MD Justifiers", RETRO_DEVICE_JUSTIFIERS }, { "MS Light Phaser", RETRO_DEVICE_PHASER }, { "MS Paddle Control", RETRO_DEVICE_PADDLE }, { "MS Sports Pad", RETRO_DEVICE_SPORTSPAD }, { "MS Graphic Board", RETRO_DEVICE_GRAPHIC_BOARD }, { "MD XE-1AP", RETRO_DEVICE_XE_1AP }, { "MD Mouse", RETRO_DEVICE_MOUSE }, }; static const struct retro_controller_info ports[] = { { port_1, 16 }, { port_2, 18 }, { 0 }, }; environ_cb = cb; cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars); cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); } void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; } void retro_set_audio_sample(retro_audio_sample_t cb) { (void)cb; } void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_cb = cb; } void retro_set_input_poll(retro_input_poll_t cb) { input_poll_cb = cb; } void retro_set_input_state(retro_input_state_t cb) { input_state_cb = cb; } void retro_get_system_info(struct retro_system_info *info) { info->library_name = "Genesis Plus GX"; info->library_version = "v1.7.4"; info->valid_extensions = "mdx|md|smd|gen|bin|cue|iso|sms|gg|sg"; info->block_extract = false; info->need_fullpath = true; } void retro_get_system_av_info(struct retro_system_av_info *info) { info->geometry.base_width = vwidth; info->geometry.base_height = vheight; info->geometry.max_width = 720; info->geometry.max_height = 576; info->geometry.aspect_ratio = 4.0 / 3.0; info->timing.fps = snd.frame_rate; info->timing.sample_rate = 44100; } void retro_set_controller_port_device(unsigned port, unsigned device) { switch(device) { case RETRO_DEVICE_NONE: input.system[port] = NO_SYSTEM; break; case RETRO_DEVICE_MDPAD_3B: config.input[port*4].padtype = DEVICE_PAD3B; input.system[port] = SYSTEM_GAMEPAD; break; case RETRO_DEVICE_MDPAD_6B: config.input[port*4].padtype = DEVICE_PAD6B; input.system[port] = SYSTEM_GAMEPAD; break; case RETRO_DEVICE_MSPAD_2B: config.input[port*4].padtype = DEVICE_PAD2B; input.system[port] = SYSTEM_GAMEPAD; break; case RETRO_DEVICE_MDPAD_3B_WAYPLAY: { int i; for (i=0; i<4; i++) { config.input[i].padtype = DEVICE_PAD3B; } input.system[0] = input.system[1] = SYSTEM_WAYPLAY; break; } case RETRO_DEVICE_MDPAD_6B_WAYPLAY: { int i; for (i=0; i<4; i++) { config.input[i].padtype = DEVICE_PAD6B; } input.system[0] = input.system[1] = SYSTEM_WAYPLAY; break; } case RETRO_DEVICE_MDPAD_3B_TEAMPLAYER: { int i; for (i=0; i<4; i++) { config.input[port*4 + i].padtype = DEVICE_PAD3B; } input.system[port] = SYSTEM_TEAMPLAYER; break; } case RETRO_DEVICE_MDPAD_6B_TEAMPLAYER: { int i; for (i=0; i<4; i++) { config.input[port*4 + i].padtype = DEVICE_PAD6B; } input.system[port] = SYSTEM_TEAMPLAYER; break; } case RETRO_DEVICE_MSPAD_2B_MASTERTAP: { int i; for (i=0; i<4; i++) { config.input[port*4 + i].padtype = DEVICE_PAD2B; } input.system[port] = SYSTEM_MASTERTAP; break; } case RETRO_DEVICE_MENACER: input.system[1] = SYSTEM_MENACER; break; case RETRO_DEVICE_JUSTIFIERS: input.system[1] = SYSTEM_JUSTIFIER; break; case RETRO_DEVICE_PHASER: input.system[port] = SYSTEM_LIGHTPHASER; break; case RETRO_DEVICE_PADDLE: input.system[port] = SYSTEM_PADDLE; break; case RETRO_DEVICE_SPORTSPAD: input.system[port] = SYSTEM_SPORTSPAD; break; case RETRO_DEVICE_XE_1AP: input.system[port] = SYSTEM_XE_1AP; break; case RETRO_DEVICE_MOUSE: input.system[port] = SYSTEM_MOUSE; break; case RETRO_DEVICE_GRAPHIC_BOARD: input.system[port] = SYSTEM_GRAPHIC_BOARD; break; case RETRO_DEVICE_JOYPAD: default: config.input[port*4].padtype = DEVICE_PAD2B | DEVICE_PAD6B | DEVICE_PAD3B; input.system[port] = SYSTEM_GAMEPAD; break; } old_system[0] = input.system[0]; old_system[1] = input.system[1]; io_init(); input_reset(); } size_t retro_serialize_size(void) { return STATE_SIZE; } bool retro_serialize(void *data, size_t size) { if (size != STATE_SIZE) return FALSE; state_save(data); return TRUE; } bool retro_unserialize(const void *data, size_t size) { if (size != STATE_SIZE) return FALSE; if (!state_load((uint8_t*)data)) return FALSE; return TRUE; } void retro_cheat_reset(void) { /* clear existing ROM patches */ clear_cheats(); /* delete all cheats */ maxcheats = maxROMcheats = maxRAMcheats = 0; } void retro_cheat_set(unsigned index, bool enabled, const char *code) { /* clear existing ROM patches */ clear_cheats(); /* interpret code and check if this is a valid cheat code */ if (decode_cheat((char *)code, maxcheats)) { int i; /* check if cheat code already exists */ for (i=0; ipath, sizeof(g_rom_dir)); if (!environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) || !dir) { if (log_cb) log_cb(RETRO_LOG_INFO, "[genplus]: Defaulting system directory to %s.\n", g_rom_dir); dir = g_rom_dir; } snprintf(GG_ROM, sizeof(GG_ROM), "%s%cggenie.bin", dir, slash); snprintf(AR_ROM, sizeof(AR_ROM), "%s%careplay.bin", dir, slash); snprintf(SK_ROM, sizeof(SK_ROM), "%s%csk.bin", dir, slash); snprintf(SK_UPMEM, sizeof(SK_UPMEM), "%s%csk2chip.bin", dir, slash); snprintf(MD_BIOS, sizeof(MD_BIOS), "%s%cbios_MD.bin", dir, slash); snprintf(GG_BIOS, sizeof(GG_BIOS), "%s%cbios.gg", dir, slash); snprintf(MS_BIOS_EU, sizeof(MS_BIOS_EU), "%s%cbios_E.sms", dir, slash); snprintf(MS_BIOS_US, sizeof(MS_BIOS_US), "%s%cbios_U.sms", dir, slash); snprintf(MS_BIOS_JP, sizeof(MS_BIOS_JP), "%s%cbios_J.sms", dir, slash); snprintf(CD_BIOS_EU, sizeof(CD_BIOS_EU), "%s%cbios_CD_E.bin", dir, slash); snprintf(CD_BIOS_US, sizeof(CD_BIOS_US), "%s%cbios_CD_U.bin", dir, slash); snprintf(CD_BIOS_JP, sizeof(CD_BIOS_JP), "%s%cbios_CD_J.bin", dir, slash); snprintf(CD_BRAM_EU, sizeof(CD_BRAM_EU), "%s%cscd_E.brm", dir, slash); snprintf(CD_BRAM_US, sizeof(CD_BRAM_US), "%s%cscd_U.brm", dir, slash); snprintf(CD_BRAM_JP, sizeof(CD_BRAM_JP), "%s%cscd_J.brm", dir, slash); snprintf(CART_BRAM, sizeof(CART_BRAM), "%s%ccart.brm", dir, slash); if (log_cb) { log_cb(RETRO_LOG_INFO, "Game Genie ROM should be located at: %s\n", GG_ROM); log_cb(RETRO_LOG_INFO, "Action Replay (Pro) ROM should be located at: %s\n", AR_ROM); log_cb(RETRO_LOG_INFO, "Sonic & Knuckles (2 MB) ROM should be located at: %s\n", SK_ROM); log_cb(RETRO_LOG_INFO, "Sonic & Knuckles UPMEM (256 KB) ROM should be located at: %s\n", SK_UPMEM); log_cb(RETRO_LOG_INFO, "Mega Drive TMSS BOOTROM should be located at: %s\n", MD_BIOS); log_cb(RETRO_LOG_INFO, "Game Gear TMSS BOOTROM should be located at: %s\n", GG_BIOS); log_cb(RETRO_LOG_INFO, "Master System (PAL) BOOTROM should be located at: %s\n", MS_BIOS_EU); log_cb(RETRO_LOG_INFO, "Master System (NTSC-U) BOOTROM should be located at: %s\n", MS_BIOS_US); log_cb(RETRO_LOG_INFO, "Master System (NTSC-J) BOOTROM should be located at: %s\n", MS_BIOS_JP); log_cb(RETRO_LOG_INFO, "Mega CD (PAL) BIOS should be located at: %s\n", CD_BIOS_EU); log_cb(RETRO_LOG_INFO, "Sega CD (NTSC-U) BIOS should be located at: %s\n", CD_BIOS_US); log_cb(RETRO_LOG_INFO, "Mega CD (NTSC-J) BIOS should be located at: %s\n", CD_BIOS_JP); log_cb(RETRO_LOG_INFO, "Mega CD (PAL) BRAM is located at: %s\n", CD_BRAM_EU); log_cb(RETRO_LOG_INFO, "Sega CD (NTSC-U) BRAM is located at: %s\n", CD_BRAM_US); log_cb(RETRO_LOG_INFO, "Mega CD (NTSC-J) BRAM is located at: %s\n", CD_BRAM_JP); log_cb(RETRO_LOG_INFO, "Sega/Mega CD RAM CART is located at: %s\n", CART_BRAM); } check_variables(); if (!load_rom((char *)info->path)) return false; if ((config.bios & 1) && !(system_bios & SYSTEM_MD)) { memset(boot_rom, 0xFF, 0x800); if (load_archive(MD_BIOS, boot_rom, 0x800, NULL) > 0) { if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) { system_bios |= SYSTEM_MD; } #ifdef LSB_FIRST for (i=0; i<0x800; i+=2) { uint8 temp = boot_rom[i]; boot_rom[i] = boot_rom[i+1]; boot_rom[i+1] = temp; } #endif } } audio_init(44100, vdp_pal ? pal_fps : ntsc_fps); system_init(); system_reset(); is_running = false; if (system_hw == SYSTEM_MCD) bram_load(); update_viewport(); return true; } bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info) { (void)game_type; (void)info; (void)num_info; return FALSE; } void retro_unload_game(void) { if (system_hw == SYSTEM_MCD) bram_save(); } unsigned retro_get_region(void) { return vdp_pal ? RETRO_REGION_PAL : RETRO_REGION_NTSC; } void *retro_get_memory_data(unsigned id) { if (!sram.on) return NULL; switch (id) { case RETRO_MEMORY_SAVE_RAM: return sram.sram; default: return NULL; } } size_t retro_get_memory_size(unsigned id) { int i; if (!sram.on) return 0; switch (id) { case RETRO_MEMORY_SAVE_RAM: { /* if emulation is not running, we assume the frontend is requesting SRAM size for loading */ if (!is_running) { /* max supported size is returned */ return 0x10000; } /* otherwise, we assume this is for saving and we need to check if SRAM data has been modified */ /* this is obviously not %100 safe since the frontend could still be trying to load SRAM while emulation is running */ /* a better solution would be that the frontend itself checks if data has been modified before writing it to a file */ for (i=0xffff; i>=0; i--) { if (sram.sram[i] != 0xff) { /* only save modified size */ return (i+1); } } } default: return 0; } } static void check_system_specs(void) { unsigned level = 7; environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level); } void retro_init(void) { struct retro_log_callback log; unsigned level, rgb565; sms_ntsc = calloc(1, sizeof(sms_ntsc_t)); md_ntsc = calloc(1, sizeof(md_ntsc_t)); init_bitmap(); config_default(); level = 1; environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level); if (environ_cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &log)) log_cb = log.log; else log_cb = NULL; #ifdef FRONTEND_SUPPORTS_RGB565 rgb565 = RETRO_PIXEL_FORMAT_RGB565; if(environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &rgb565)) if (log_cb) log_cb(RETRO_LOG_INFO, "Frontend supports RGB565 - will use that instead of XRGB1555.\n"); #endif check_system_specs(); } void retro_deinit(void) { audio_shutdown(); if (md_ntsc) free(md_ntsc); if (sms_ntsc) free(sms_ntsc); } void retro_reset(void) { gen_reset(0); } void retro_run(void) { bool updated = false; is_running = true; if (system_hw == SYSTEM_MCD) system_frame_scd(0); else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) system_frame_gen(0); else system_frame_sms(0); if (bitmap.viewport.changed & 1) { bitmap.viewport.changed &= ~1; if (update_viewport()) { struct retro_system_av_info info; retro_get_system_av_info(&info); environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &info.geometry); } } if (config.gun_cursor) { if (input.system[0] == SYSTEM_LIGHTPHASER) { draw_cursor(input.analog[0][0], input.analog[0][1], 0x001f); } else if (input.dev[4] == DEVICE_LIGHTGUN) { draw_cursor(input.analog[4][0], input.analog[4][1], 0x001f); } if (input.system[1] == SYSTEM_LIGHTPHASER) { draw_cursor(input.analog[4][0], input.analog[4][1], 0xf800); } else if (input.dev[5] == DEVICE_LIGHTGUN) { draw_cursor(input.analog[5][0], input.analog[5][1], 0xf800); } } video_cb(bitmap.data, vwidth, vheight, 720 * 2); audio_cb(soundbuffer, audio_update(soundbuffer)); environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated); if (updated) check_variables(); } #undef CHUNKSIZE gx/images/Button_load.png000664 001750 001750 00000010554 12702465756 016570 0ustar00sergiosergio000000 000000 PNG  IHDR88;sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09?IDATxݚ{t}?oCZk֮Yl1Ll0Q!`bح6rNGKSN)$'Mȱ1ib4@`%ٖ0X$ՌgW+nNO9{.w$@ @e $A .brG JTl"7dӑ.KO8@_a4Mo88@eMP+[`uY~ ZŁK%JT < l = t?D:[..ASb=ibc<%44}F_?EԟP ﵟ( 0/MUp?0w@Um+۴Ȃ>.bŶ{Q$ـ;:-;_-2ʕ6-b)$jrMP+@R>~zOM?/њDQ|P$#`S?e;~]je[;s;?B 'F VAPL&C&!LL&(6oxj78sr?͋7<((I瑾e۶?kQ5 M׮θ_!wp`ZZp 2,JH$$ $,cs-28]Ef73\>LOUf2TUf*2v>B": XͿ@m3۶?k.IҒQ۟=/\B~i\!gRkVط0we~$I (Iw;¡ebsdYCx=nv{N`f8h`Vxtm8PG݂n$IIGk?a:CӲ5Y e"TUg73dfp!ס6%zO0{ѭ~~3';=+ (|9ҬA?ǙLrl6՘~_4a+'^">roFE(++\4Ie2؅l;`seG[[֭# 3BAww7T*i24Ι%2\.V+g 8o9=tvGj/P[XmY+?؉iȲ3***XlA+GBP]]ͣ>7߼yѾb[s}O⯼={ |a(89=[:lp89?zӮ|c/[o, ёs[Ě<"I 9MD"(4̀6 zg?7@": 4NoCh4jRJ<7z&( wuW`̏{9=~v fRrE5?vt;3]4%HljR)(;v@Q$O?x'ey/4[b,-f@Q\RT\Bرci&MU(˲ͱ$F%2~/ģFJ6( 6X\RT`۶mW*NĖX={H$ u6u5xN cBkPfU0+8m&D"azCCCرo;ݞ3~))AsfG*Tj.2Zw Pj :WTWB&Q4$cʍ_~eX~}NI/vQ9^P >jjB;CS.%}qi֯_ٳ5ǐbV:m`uŁZuKE kWЩSf֭lܸ\g#q8`\?ߍ TԵdg$91F`U@;\ONQR1_C:jL&Coo/?8ه)ie<\.vfPo0xO*QPaIm^GdMYLFq\M9~+kv??K+mzO`nb#(!7e썭˴Hq$ItPl%S?-׉-rrغL3! TsY]eݳH$gBB)@b uSQ;(8|U[vOCNx7I]ite:SB!9w Ko @26JjkӀmϋ~sx6O%fbؔ`fw>!k!ꛮ1kVYqxzZIKkp9F~uр =|y!x|J_'Z^3A^U9,zOLE1"o)<]Rp7pk|F/4>{x->VE{(M (b !}_+;8} 4U p!˙FΞtbX`9w?ޒrNn%oؤ571HI\gw۞*?9.V3'99Ƈ[-v^s-+HPzlya!QŞKt/FWl%(,Xw҆zOphsDG*!睙B@ X( 4r*h$PUϪ6m {(~;ʥ[AѯtvG<{;JNtWW)]\[ @rb0Ƈ$IFqmξ!v6qZ h9)/+K -j*0~t)`z,2  hBd'kf&! ^޹Pq_+6kMIENDB`core/hvc.h000664 001750 001750 00000143310 12702465756 013603 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * HV Counters * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ /* NTSC, 256x192 ------------- Lines Description 192 Active display 24 Bottom border 3 Bottom blanking 3 Vertical blanking 13 Top blanking 27 Top border V counter values 00-DA, D5-FF NTSC, 256x224 ------------- Lines Description 224 Active display 8 Bottom border 3 Bottom blanking 3 Vertical blanking 13 Top blanking 11 Top border V counter values 00-EA, E5-FF NTSC, 256x240 ------------- This mode does not work on NTSC machines. All 30 rows of the name table are displayed, there is no border, blanking, or retrace period, and the next frame starts after the 30th row. The display rolls continuously though it can be stabilized by adjusting the vertical hold. V counter values 00-FF, 00-06 PAL, 256x192 ------------ Lines Description 192 Active display 48 Bottom border 3 Bottom blanking 3 Vertical blanking 13 Top blanking 54 Top border V counter values 00-F2, BA-FF PAL, 256x224 ------------ Lines Description 224 Active display 32 Bottom border 3 Bottom blanking 3 Vertical blanking 13 Top blanking 38 Top border V counter values 00-FF, 00-02, CA-FF PAL, 256x240 ------------ Lines Description 240 Active display 24 Bottom border 3 Bottom blanking 3 Vertical blanking 13 Top blanking 30 Top border V counter values 00-FF, 00-0A, D2-FF Here are some details about what the different screen areas look like, useful if you are emulating overscan or if you want to have a 'virtual' vertical hold control in your emulator. Active display - Where the display generated by the VDP goes. Bottom border - Filled with border color from VDP register #7. Bottom blanking - Filled with a light black color. (like display was blanked) Vertical sync - Filled with a pure black color. (like display was turned off) Top blanking - Filled with a light black color. (like display was blanked) Top border - Filled with the border color from VDP register #7. */ #ifndef _HVC_H_ #define _HVC_H_ /***************************************************************/ /* */ /* H-counter timings in H32 & H40 modes (starts from HINT) */ /* */ /* There are normally 3420 Master Clock counts per raster line */ /* with 342 dots/line in H32 mode & 420 dots/line in H40 mode. */ /* */ /* in H32 mode, dot clock is divided from MCLK (MCLK/10) */ /* in H40 mode, dot clock is divided from EDCLK (EDCLK/2) */ /* */ /* EDCLK (external dot clock ?) is generated outside the VDP: */ /* When HSYNC is low, EDCLK varies between MCLK/10 and MCLK/8, */ /* otherwise it is fixed to MCLK/8. */ /* */ /* Notes: */ /* (1) VDP register 12 bit 7 enables use of EDCLK when set */ /* (2) VDP register 12 bit 5 forces HSYNC high when set */ /* (3) H32 or H40 mode is selected with VDP register $0C bit 0 */ /* and can be set independently from above settings */ /* */ /* On real hardware, non-standard timings can be obtained by */ /* modifying those settings (for example, dot clock can be set */ /* to MCLK/8 in both modes if HSYNC output is disabled and if */ /* EDCLK input is enabled in H32 mode / disabled in H40 mode), */ /* resulting in slightly different H-counter and VDP timings. */ /* */ /* Genesis Plus GX timings always assume standard settings i.e */ /* HSYNC output always enabled and EDCLK input enabled in H40 */ /* mode / disabled in H32 mode. */ /* */ /***************************************************************/ static const uint8 cycle2hc32[3420] = { /* end of active display (14 pixels -> 140 Mcycles) , H interrupt triggered, Vcounter increment */ 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, /* right border (14 pixels -> 140 Mcycles) */ 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, /* right blanking (9 pixels -> 90 Mcycles), VDP status HBLANK flag set */ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, /* horizontal sync (26 pixels -> 260 Mcycles) */ 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, /* left blanking (24 pixels -> 240 Mcycles) */ 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* V interrupt triggered (MD mode) */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* left border (13 pixels -> 130 Mcycles) , VDP status HBLANK flag cleared */ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, /* remaining active display (252 pixels -> 2520 Mcycles) */ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84 }; static const uint8 cycle2hc40[3420] = { /* end of active display (16 pixels -> 128 Mcycles) , HINT triggered , Vcounter increment */ 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, /* right border (14 pixels -> 112 Mcycles) */ 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, /* right blanking (9 pixels -> 72 Mcycles) , VDP status HBLANK flag set */ 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, /* horizontal sync (32 pixels -> 313 Mcycles) */ 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, /* left blanking (32 pixels -> 259 Mcycles) */ 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Vertical Interrupt triggered */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, /* left border (13 pixels -> 104 Mcycles) , VDP status HBLANK flag cleared */ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* remaining active display (304 pixels -> 2432 Mcycles) */ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4}; #endif /* _HVC_H_ */ core/input_hw/sportspad.c000664 001750 001750 00000007640 12702465756 016677 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Sega Sports Pad support * * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; uint8 Counter; } sportspad[2]; void sportspad_reset(int index) { input.analog[index][0] = 128; input.analog[index][1] = 128; sportspad[index>>2].State = 0x40; sportspad[index>>2].Counter = 0; } INLINE unsigned char sportspad_read(int port) { /* Buttons 1(B) & 2(C) status (active low) */ unsigned char temp = ~(input.pad[port] & 0x30); /* Pad index */ int index = port >> 2; /* Clear low bits */ temp &= 0x70; /* Detect current state */ switch (sportspad[index].Counter & 3) { case 1: { /* X position high bits */ temp |= (input.analog[port][0] >> 4) & 0x0F; break; } case 2: { /* X position low bits */ temp |= input.analog[port][0] & 0x0F; break; } case 3: { /* Y position high bits */ temp |= (input.analog[port][1] >> 4) & 0x0F; break; } default: { /* Y position low bits */ temp |= input.analog[port][1] & 0x0F; break; } } return temp; } INLINE void sportspad_write(int index, unsigned char data, unsigned char mask) { /* update bits set as output only */ data = (sportspad[index].State & ~mask) | (data & mask); /* check TH transitions */ if ((data ^ sportspad[index].State) & 0x40) { sportspad[index].Counter++; } /* update internal state */ sportspad[index].State = data; } unsigned char sportspad_1_read(void) { return sportspad_read(0); } unsigned char sportspad_2_read(void) { return sportspad_read(4); } void sportspad_1_write(unsigned char data, unsigned char mask) { sportspad_write(0, data, mask); } void sportspad_2_write(unsigned char data, unsigned char mask) { sportspad_write(1, data, mask); } gx/gui/saveicon.h000664 001750 001750 00000021160 12702465756 015102 0ustar00sergiosergio000000 000000 /*********************************************************** * Genesis Plus Save Icon * Made by Brakken (http://www.tehskeen.com) * ************************************************************/ unsigned short icon[1024] = { 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xEB5A, 0xFBDE, 0xFBDE, 0xFBDE, 0xBDCD, 0xFBDE, 0xF7BD, 0xF7BD, 0xAD49, 0xEB59, 0xB9AD, 0xC1EF, 0xC1EF, 0x9062, 0x8000, 0x8C41, 0x8C41, 0x8000, 0x9CE6, 0xA0E6, 0xA507, 0x8400, 0x9CC5, 0xA0E6, 0xA0E6, 0xC1EF, 0xC1EF, 0xC1EF, 0xC1EF, 0x8000, 0x8000, 0x8000, 0x8000, 0x9083, 0x8C63, 0x8C63, 0x9484, 0x8C63, 0x9083, 0x9484, 0x94A4, 0xC1EF, 0xC20F, 0xC20F, 0xBDCE, 0x8000, 0x8000, 0x8000, 0x8000, 0x9083, 0x8821, 0x8842, 0x8842, 0x8842, 0xA107, 0xB58C, 0xAD6B, 0xA529, 0x94A4, 0x9083, 0x94A4, 0x8000, 0x8000, 0x8400, 0x8400, 0x8842, 0x8842, 0x8842, 0x8821, 0xB18B, 0xA949, 0xA108, 0xA107, 0xA528, 0xB9AD, 0xC630, 0xCE51, 0x8000, 0x8000, 0x8000, 0x8000, 0x8821, 0x8821, 0x8821, 0x8400, 0xA108, 0xA529, 0xA108, 0xA529, 0xCA30, 0xC630, 0xCA30, 0xFBDE, 0x8000, 0x8000, 0x8000, 0xAD27, 0x8400, 0x9083, 0x8863, 0x8400, 0x9CE6, 0x8842, 0x8C63, 0x8C20, 0xFBDE, 0xFBDE, 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xDA92, 0xFBDE, 0xFBDE, 0xFBDE, 0xC1AB, 0xF7BD, 0xFBDE, 0xFBDE, 0xF7BD, 0xF7BD, 0xF7BD, 0xA0E6, 0xF7BD, 0xF7BD, 0xF39C, 0x9484, 0xF39C, 0xF39C, 0xDEF7, 0x8C41, 0xF39C, 0xEF7B, 0xD272, 0x8400, 0x8C42, 0x9CE6, 0xA507, 0xA0E6, 0x8C63, 0x9CC5, 0xA107, 0x9CE6, 0x9484, 0x98A5, 0x9CE6, 0x98C5, 0x9CC5, 0x98C5, 0xA0E7, 0x98C5, 0x8C42, 0x9083, 0x94A5, 0x9083, 0x8C42, 0x9083, 0x9084, 0x8C62, 0x8C62, 0x9083, 0x9084, 0x8C62, 0x8C63, 0x9083, 0x94A4, 0x8C63, 0x8842, 0x9CC6, 0xA107, 0xA0E7, 0x8842, 0x8842, 0xA108, 0xA54A, 0x8842, 0x8C63, 0xB5AD, 0xB5AD, 0x8C63, 0x8C62, 0x8842, 0x8C63, 0x98C5, 0xA528, 0xB5AC, 0xB5AC, 0xA52A, 0xBDEF, 0xC631, 0xCA52, 0xB9CE, 0xB9CE, 0xA94A, 0xAD6B, 0x8C63, 0x8821, 0x8821, 0x8821, 0xA529, 0x98C5, 0x98C5, 0xA0E6, 0xC210, 0xA529, 0xA529, 0xA529, 0xB5AD, 0xB5CD, 0xB5AD, 0xBDEF, 0x8400, 0x8821, 0x8C62, 0x8821, 0xA0E7, 0x8842, 0x8842, 0x8C41, 0x9083, 0x8842, 0x8842, 0x8842, 0x94A5, 0x8842, 0x8C62, 0x8C62, 0x8C42, 0x9083, 0x8C62, 0x8C62, 0xB548, 0xF7BD, 0xF7BD, 0xF7BD, 0xA4C4, 0xF7BD, 0xF7BD, 0xF7BD, 0x9461, 0xDED5, 0xF39C, 0xF39C, 0x8C20, 0xD271, 0xF39C, 0xF39C, 0xEF7B, 0xEF7B, 0xC610, 0x8400, 0xEF7B, 0xEB5A, 0xB9AC, 0x8000, 0xEB5A, 0xEB5A, 0xA528, 0x9CC5, 0xE739, 0xE739, 0x9CC6, 0x98A5, 0x98C5, 0x98C5, 0xA0E6, 0x94A4, 0x94A4, 0x98C5, 0x94A5, 0x9484, 0xA528, 0x98C5, 0x9CE6, 0xA0E7, 0x9CE6, 0xA4E6, 0x98A4, 0xA507, 0x8C62, 0x9083, 0x9484, 0x9083, 0x94A4, 0x94A5, 0x98C5, 0x98C5, 0xA107, 0xA107, 0xA107, 0xB18B, 0xA907, 0x9062, 0x9484, 0x9CE6, 0x8842, 0x94A4, 0x9484, 0x9084, 0x8C62, 0x8C63, 0x9CC5, 0x9CC5, 0x98C6, 0x8C63, 0x9484, 0xA0E6, 0x9CE6, 0x9084, 0x94A4, 0x90A5, 0x8C63, 0x8C42, 0x8C62, 0x8C62, 0x8C63, 0xA108, 0xA94A, 0xA528, 0x94A5, 0x8884, 0x8884, 0x8884, 0xB0A5, 0xBC84, 0xA483, 0xA484, 0x8C63, 0x8C42, 0x8C63, 0x9083, 0xA94A, 0x9083, 0x8C62, 0x94A4, 0x8884, 0x8063, 0x90A5, 0x94A4, 0xA483, 0xBC63, 0xA884, 0x8884, 0x9083, 0x8C63, 0x8C42, 0x8C63, 0x9084, 0x8842, 0x9083, 0x9084, 0x8C42, 0x8C62, 0x98C6, 0xAD6A, 0x9083, 0x8C63, 0x98C5, 0xA107, 0x8400, 0xC1ED, 0xEF7B, 0xEF7B, 0x8400, 0xAD27, 0xEF7B, 0xEF7B, 0x9CE6, 0x9CA4, 0xEB5A, 0xEB5A, 0x9CE6, 0x9062, 0xDAB4, 0xE739, 0xE739, 0xE318, 0x9483, 0x8C63, 0xE318, 0xCE72, 0x9062, 0x9CC5, 0xDEF7, 0xC20F, 0x8C41, 0x9CE6, 0xDAD6, 0xB9AC, 0x8C20, 0x9CC5, 0xA0E6, 0xA528, 0x9CC5, 0xA528, 0xA508, 0x94A5, 0x98C6, 0xA108, 0x9CE6, 0x9CC5, 0xA0E7, 0xA94A, 0xA0E6, 0xA0E7, 0xA507, 0xAD6B, 0xA107, 0x98C6, 0x9CE6, 0x9083, 0x98C6, 0xA108, 0xA107, 0x98C5, 0xB9CD, 0xB18B, 0xA107, 0x9CC6, 0xC210, 0xB9CE, 0xA528, 0x9CC6, 0x98C5, 0x94A5, 0x9084, 0x8884, 0x9CC6, 0x9CE6, 0x9CC6, 0x94A5, 0x9CE6, 0x9CE6, 0x9CE7, 0xA108, 0x98C5, 0x98C5, 0x98C6, 0x98C6, 0xB0C6, 0xD0C6, 0xD0C6, 0xD0C6, 0x90A4, 0x90A4, 0x98A5, 0x9CA4, 0x9CE6, 0x90A4, 0x9084, 0x9084, 0x98C6, 0x98C6, 0x98C6, 0x98C6, 0xD0A5, 0xD0A5, 0xA484, 0x8483, 0x9484, 0x9083, 0x8C83, 0x9084, 0x90A5, 0x94A5, 0x9CE6, 0x9CE6, 0x98C6, 0x98C6, 0x9CE6, 0x98C6, 0x8C63, 0x9084, 0x9484, 0x9083, 0x98C5, 0x98C5, 0x94A4, 0x94A5, 0x98C6, 0x98C6, 0x98C5, 0x98C5, 0x98C6, 0x98C6, 0x98C6, 0x98C6, 0x9084, 0x8821, 0xCE51, 0xE739, 0x94A5, 0x8C20, 0xBDCE, 0xE318, 0x98C5, 0x8821, 0xB18B, 0xE318, 0x98C6, 0x8842, 0xAD49, 0xDEF7, 0xDAD6, 0xAD49, 0x8C41, 0xA508, 0xD6B5, 0xBDCC, 0x8C20, 0x8C41, 0xD6B5, 0xD294, 0xB98A, 0xAD06, 0xD294, 0xCE73, 0xCE73, 0xCA52, 0xA94A, 0xB5AD, 0xB18C, 0xAD6B, 0x9062, 0x9062, 0x9062, 0x9062, 0xAD27, 0xAD06, 0xAD06, 0xAD06, 0xCA52, 0xC631, 0xC631, 0xC210, 0xA94B, 0xB18C, 0xB58D, 0xAD6B, 0x9062, 0x9484, 0x98A4, 0x98A4, 0xA906, 0xA906, 0xA506, 0xA907, 0xC210, 0xC210, 0xB9F0, 0xBDEF, 0xA94B, 0xA94B, 0xA94B, 0xA94B, 0x98A5, 0x98A5, 0x98A4, 0x98A4, 0xA907, 0xA907, 0xA907, 0xA506, 0xBDEF, 0xBDEF, 0xBDEF, 0xB1F2, 0xA94B, 0xA94A, 0xA54A, 0xA529, 0x9484, 0x9484, 0x9483, 0x9483, 0xA4E6, 0xA4E6, 0xA4E6, 0xA4E6, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xA529, 0xA529, 0xA529, 0xA108, 0x9062, 0x8C63, 0x9062, 0x9062, 0xA4E6, 0x9CE6, 0xA0E6, 0xA506, 0xBDEF, 0xC210, 0xC210, 0xC210, 0xA108, 0x9CE7, 0x9CE7, 0x98C6, 0x8C41, 0x8C42, 0x8C41, 0x8C41, 0xA507, 0xA508, 0xAD27, 0xB127, 0xC631, 0xC631, 0xCA52, 0xCA52, 0x98C6, 0x8C63, 0xA0E6, 0xDAD6, 0x8C41, 0x8400, 0xB548, 0xDAD6, 0xB127, 0xB548, 0xD6B5, 0xD6B5, 0xCE73, 0xCE73, 0xD294, 0xD6B5, 0xD294, 0xCA74, 0xBA56, 0xB635, 0x9A3B, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8A1F, 0xA27F, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, 0xB635, 0xB214, 0xB214, 0xBE11, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0xA27F, 0xA27F, 0xA27F, 0x8A1F, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF7F, 0xA1F7, 0x91FA, 0x81FF, 0x95F9, 0x81FF, 0x81FF, 0x8A1F, 0x81FF, 0x81FF, 0xD75F, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, 0xB9CE, 0xB9CE, 0x8DFC, 0x81FF, 0xA9D2, 0xA9D2, 0x81FF, 0x9A5F, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x85FD, 0x95F9, 0xB5CF, 0xB1F1, 0x81FF, 0x81FF, 0x95F9, 0x81FF, 0xEFBF, 0x81FF, 0x85FD, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xA5F5, 0xA5F5, 0xB5F2, 0xB214, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0xB2BF, 0xB2BF, 0x81FF, 0x9A5F, 0xDF7F, 0xDF7F, 0x81FF, 0xE79F, 0xA218, 0xA218, 0xA218, 0xA639, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0xBEFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xF7DF, 0xDF7F, 0xDF7F, 0xDF7F, 0xA639, 0xB657, 0xCA75, 0xD294, 0x81FF, 0x81FF, 0x861E, 0xCA95, 0xBEFF, 0xAA9F, 0x81FF, 0xB658, 0xD75F, 0x8A1F, 0x81FF, 0xCA75, 0x81FF, 0xA27F, 0xFFFF, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, 0x81FF, 0xA27F, 0xFFFF, 0xBADF, 0x81FF, 0xA27F, 0xFFFF, 0xA27F, 0x81FF, 0x81FF, 0xCF3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBADF, 0xA27F, 0xA27F, 0xA27F, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x923F, 0xFFFF, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xCF3F, 0xA27F, 0x81FF, 0xFFFF, 0xFFFF, 0xFFFF, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x81FF, 0x81FF, 0x81FF, 0xBEFF, 0xA27F, 0xA27F, 0x9A5F, 0xBADF, 0xFFFF, 0xFFFF, 0xA27F, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, 0x923F, 0xF7DF, 0xDF7F, 0xDF7F, 0x81FF, 0xAA9F, 0xEFBF, 0xC71F, 0x81FF, 0x9A5F, 0xCF3F, 0x81FF, 0x8A1F, 0xD75F, 0xE79F, 0xBEFF, 0xBEFF, 0xBEFF, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, 0xBEFF, 0x81FF, 0x81FF, 0xB657, 0xFFFF, 0xC71F, 0x81FF, 0xA23A, 0xFFFF, 0xC71F, 0x81FF, 0xA23A, 0xD75F, 0x8A1F, 0x81FF, 0xB658, 0x81FF, 0x9A5F, 0xAA9F, 0x81FF, 0x921D, 0x81FF, 0x81FF, 0x85FE, 0xD294, 0xBE55, 0xB657, 0xC653, 0xD294, 0xD294, 0xCE73, 0xCA52, 0x8A1D, 0xB214, 0xB214, 0x8DFC, 0xBA34, 0xC631, 0xC210, 0xB612, 0xC631, 0xC631, 0xC631, 0xC210, 0xCA52, 0xCA52, 0xC631, 0xC631, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFC, 0x81FF, 0x81FF, 0x81FF, 0xC210, 0xBE10, 0xBDEF, 0xBDEF, 0xC210, 0xC210, 0xC210, 0xBE10, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFB, 0xA5D4, 0xBDEF, 0xB9CE, 0xB9CE, 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x99F8, 0x8DFB, 0x8DFB, 0x8DFB, 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBE10, 0xC210, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x95F9, 0xA5F5, 0xA1F7, 0x91FA, 0xBDEF, 0xBE10, 0xC210, 0xC210, 0xC210, 0xC210, 0xC631, 0xC631, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x921C, 0x921C, 0x921C, 0x921C, 0xC631, 0xC631, 0xCA52, 0xCA52, 0xC631, 0xCA52, 0xCA52, 0xCE73, 0x81FF, 0x81FF, 0x9A3B, 0xD294, 0x961B, 0xAA39, 0xD294, 0xD294, 0xCE73, 0xCE73, 0xD294, 0xD6B5, 0xCE73, 0xD294, 0xD6B5, 0xD6B5, }; gcw0/opk-data/scanlines.png000664 001750 001750 00000001155 12702465756 016747 0ustar00sergiosergio000000 000000 PNG  IHDR% gAMA asRGB cHRMz&u0`:pQ<bKGD̿ pHYs  ~AIDATxA @娒5C t ~tEXtCommentCreated with GIMPW%tEXtdate:create2015-02-15T14:59:17+00:00aB%tEXtdate:modify2015-02-15T14:59:17+00:002oIENDB`gx/images/Frame_s1.png000664 001750 001750 00000015525 12702465756 015756 0ustar00sergiosergio000000 000000 PNG  IHDRtP^ssBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/27/09tYIDATxyxUϹB +[7 UV\j bՂ33;Sg:&MRDR,IaI$?%5Ij w]쐤LI92!y]Y҃".92!,ARLI٠?'Yہ ~ld݆wL˴Dg'ZeB;;x?d>e¾Y`oW2{EozX&ʴre~1+Ce1:düC&Ҕ.tddUfc҄lzX&K$H*R 8_D!&m zLVɳ4KɭsuLsV@O BIe}_/†va켪Q_ 7\:CJNBJtO&"q[[[P{\OzXfb|P@fԒ|75JTzSkkxW3}5ApV^ 3'CRSUUu~?9';gwP/oߩƦ3}pNdeec3>ѣF&|ҕS.WΌ*9kO]ޖٱ9@ ïeL3WJC,V۴~O\mvKmmg/G&G_<С#ƌu̙뢏vu vj3 BISe}bJX&kjb O=vC.{{oժ'y2q8ͿS6lh޽^;v檲Ӟ1nJIFˌXdF+͒׭{0P] ?s*/&҈%7zefFѢ]]g"O{EzK$M4^ffXϮbaQ++lQ{;54Y9*/(koO\pG\HNjJX҇d|̚6I;ެF+VVv4Ot^8Pq {\o---5k%KvЧ. q2<"3\!Æ iժ'jmm;Z K/aiC}Wz)o۶m=I_N6KY$ExssS'8oM>M7\v_\(IͭO&2A>MD-v}sG>Oqw6e$}/|EO{C=!)q2~2>PfETId&)D⌯%Kw|^ٙy>3Aɖޡ9z9VeVع`+W/:x׿qjkҮmb}Җ-ۗ{=U2 ~k;%WVq2WS KjT+PAA ͚sͬ/͟V^Q䝒˘{d@d _f3vgw/*--ה 'zW]}CWNfncjק7~MK̘eU$5ٳ?zɘ#t睷ꡇ~}O~2됹tԖ޽H's)4YM[\]K/+;8/.%͑ t =fdeN$5UTT6O8n!= WhgϾz ҂[7ʌ3egHjn}k]K_ueR2ӂD{{|fmmM6jIdn!k[$uC2?>b߾Ny!"/hW45h„1E2'~&)gbdN(jٲ*--+,MȜH)vVrKKѣ#D"*)%Ӷ2J{H·\QwxZLng)hv!SdB9!PH3E}`O+yv@o_ f2x6D4ts:zuޱn݉}/%-jg0/ix >P~(4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG4tp ACG'Է4tkN}}w,}Iɧ@d(iB)'@Kj 6<3Jz=dwFOtHKj,%`\h4:txΒl_&a0o _QQOkՏlT-ֱF. Lis+W>ؔ/zY 8oUIr-3;e|?_kХF i(?:fݷsަ6sQAs?s/?4D&$UHzGҞct@MtO`ͥoΙ3Gڭ-[yK/_ŋX,V,YR#JetKǕI%m}艾o7nظqcǒ%K+w >{Nfڴɚ;ZkZtQ;2}'lK@/^/YDcwߏ~O_>͛_@)3/y.{x?IT`-%%i?_~T]ŋ{K,񕼩'~Ѣ%~)?3t饗hUx2+Z읈Jz[lmԉ?_SS_F2#f^*i$ygzF٦3f\Q4g}ڴWbu /x]= >OY3oܸjkcv"s2剥j9@:/u uiǬYW}S7~e U^^]oѮ]{TSS"qܟ}UQQLS&iР6o˖UJ ԗ fSJ:,i[g~z$ХPauOfnر?>zF-ȑ29RVUUA87"25|PQ#0_w0㍝=c/ڵӗgyLWˬ3J:tOEz74sL۷6ӕ\czo~JL;`$ ^ף/;Ꚛ#oٳşdlL7kۋm՝i+Ol=53RW2ȥػ_,C1E@/lJtvȄwL!mSFU2uzbNDJS.H6d5Ie㈒;s M ۉBk [TR rW4=ubճlۿvNCR޷ӆ-e¼Y&%5wMkmۣi2-vn/9)$2*RK T,Џ'Xs]rWڒZ}OW'XIENDB`gx/images/Main_cheats.png000664 001750 001750 00000004112 12702465756 016522 0ustar00sergiosergio000000 000000 PNG  IHDR@\}>sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/25/11uE{IDATxiE3;d7D4Ex#~ -DTT ~S< " &1FaEC&F0&fUvtL'{^UwU:G4E;v=@)lVmN/XSٕ } s' c =X[m<`C@HG74ZIjOryClHwqJA?ՖXF1 ]5Sgkp'0xq 00;Y8 <H1=*5F]O&+Va~ҥh\h+'[:< \ JQGkN`f+6|"< x 8:E=|cP@7ԡ4+C֍n$c.rw'1s#ٛ0/K6;Vpa6!i#z4!_S7{@*z9VCqm"0`2}>t0%.ǔY{? |MG8xkBaw[A6t#m;rs=t>Il!bR\/$ ["zJ:΂4(03dxi)!y^Quku$brtIuQH~hԥqf`naߤ*%?`'es+9QP~ WNC /;RJw,e.Db$0 (`S˷aƭs|Oyvlcllя'lb[ŦsQ8s[7 _I݆MrK<L ,w$'`Ո5CS!Q "kEދ(  FDX6Oaϥݺ󰨏$xlD+Hg@v;.er源q! Ё^(۟k)YD$#`'42{j(|03`[ ^hF}.#Hq<D߁Nug: JQ#1R\hYI@ d&Y+5d@hYI@ d&Y+5d@hYI@ d&Y+5d@hYcP1XZD7`ahKURE2UuOf /ȏvUm;X\Nd7{Lfcv>Wj&@Dc]nkU7"_{+ݤ8^~5,6&S~< +/"`q;0Qr\rx]v,Ʀu)mux|_-X~5soJUcѩ ^}p, V9X#\Rx@ x/N.l;"|N_‚`7-> ?QUaf~|XZg:|#"UunST|XXc=ߤPčqP""GdWb ~+C nZ[@јGi3ై[ R g"r.piUu QDvԷ/=Xh}p:Fz'pSտ`' pѤqaX8L=TT׆^ ;jƣ5Q)`ʹ5Ƒw xQ@ee9 n[1rAC\ -n-05`2<z6uD9sY6Ǣެ, sǢ Q=woΊ(^7:  plЉE3ې蠈.Z͈kO.7~s(o)>H*N" 'HJ-OSWIG z#ps9h] | ΌN!RH&S@npk1<`!_`E}HQy!:vBC|#: qa'↪El9ۘn`w*=~}")9 ѦVbƽϘ 0Qjp[[U7y &צQigx\eP ةfvIlA0 x&:0R"Nގt[DF"7T>`[]:GqtE:*%צӆܣ^`̖uQ@Fj8!ڋ81I;ю, ηKD纑hk;FBLwMT;y{ ^98Rܣ|w<N w/L f΄mkݓc~4`fSHFi&%7!D@&ǏABܿq)E/נ63;xf>oA1{*}(N'*@֏? Jŝ@@!st'_/mXJQl8ɝ MP9u(yh|LO :kA }o6ǽU-YLѵGb:@BCk xYo(p]R9>4"U+#; /6T(=-lxi-FY_@.:;.~]dwA{qحQ^+tvfv;U Ɂ)^.x;؄v_ܪFUfO"Y@݅kqxߍp>rD[^x|> 3<K1$ U%%Xգ9&,/I>7g]H?.A3@!1[sf X'Z\e؀bl2.(F/Z t@whmT-E>90EG Uޯ)b88on{WDy4t gmqqaҁmHoΎG*8}WZVChqH D)nyCnw-f֚{6 $cц'P8tׁ t_ ‡ĽQ^Gx݇ܟݔH2 Stfy4cruS\>t;@4\ȌE9\kK};θo2[W!~ ЛIN2;}.0G}}Cw?uxQ3Lr2H)(1Sv=xfw1=;t_uF^ rOTؔw0I#NDfvgMpvLt'#l;>1QMHҢ'ϥ(hmM?Ol9H!Ko")rVO\Ð!t;,ݞz(gc0='@ zQbdoˀ)#@(nF`F{xEA9h:%*PGltrw݇9h*&"-@~d?.襋1hPvۂq8pɑҁp' p;}O[#܁"%C==YUOAQ;Ej! L!P)SӾ#` ${@t_(7P>@ LnW?`f66;@^f8w6d}ࡒ  >Fw2nB8Azr sQHJ99;wHL׃"Ss.4}\r Gh(tT֧Ec{݇_ uAS| yH٠kGYu(B]l[)6_wgj? ÔbNf#}"ۏ F!".2Ɓ>-!Bk'Igc^t>ifw!܋DVmGʽ @(/z'RtTLrǁCtF`c(k^8o$1Gz&FARuPxsaPFtjZ罼,MJL7#?CtQ4~.t`TJ֐<V@Jp*\D% W: p?E~`~A`v#G{3X,y8JpͧD30Q0gрW:_ErK.DWU6T!^3Cu0p.ϨW:G?GIM&uR: `NjX'5IM&uR: `NjX'5IM&uR: `NjX'5IzQ΀ .`1Z :F>}wlϣ@gUT!=#s޺zS&\TފvmAyq5QRd(o"(AKU7nGChw.wvC=PGߋPy( EPh:ю/=!Q*UqEhP‹'J Q8֣KNϢ: Ef3oBy֢`)A=+dfg0=d0W<{ ~E\A3R1ݿmf#8~®B Rd[e)@7g6 fv!Iu1'wRtq^7SdBA`&x^Yq_uu2F-dT`fûg^g\%V3fd-B 0:OK'e^QYf ډ^A<ܘ8=!k`znKя-fvDBF};w?pܢqIENDB`core/input_hw/teamplayer.h000664 001750 001750 00000004762 12702465756 017032 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Team Player support * * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #ifndef _TEAMPLAYER_H_ #define _TEAMPLAYER_H_ /* Function prototypes */ extern void teamplayer_init(int port); extern void teamplayer_reset(int port); extern unsigned char teamplayer_1_read(void); extern unsigned char teamplayer_2_read(void); extern void teamplayer_1_write(unsigned char data, unsigned char mask); extern void teamplayer_2_write(unsigned char data, unsigned char mask); #endif libretro/msvc/msvc-2010.sln000664 001750 001750 00000001552 12702465756 016563 0ustar00sergiosergio000000 000000  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc-2010", "msvc-2010/msvc-2010.vcxproj", "{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Debug|Win32.ActiveCfg = Debug|Win32 {29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Debug|Win32.Build.0 = Debug|Win32 {29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Release|Win32.ActiveCfg = Release|Win32 {29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gx/images/Snap_empty.png000664 001750 001750 00000066027 12702465756 016443 0ustar00sergiosergio000000 000000 PNG  IHDRp{sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/25/11uE{ IDATxl[!l>\BÇ7ar 5ILLͤ %JTn)RmiȺ[{mnzon,ȮEv-jT4"P1*P1*Qb{!8Hs?||McWv ICuE۠:ǯ`2> C8V+#4  Gp#x(JXɯ`2> EQvt8 G( GaSm#XQ*q{( FGB:ƺ4 :' AQ CrOPS)kPf<*=DQl61G2DT|EXyD}~躎t&-cv( <pBu@6J~N`%Q!Gۡ*?bΤL%(,d* ]˵$B:c&TUE.۳n7ҙ4 ߿l.W 2ǯCu8%yȥ%eLNC40jEkK+4Mö'p4p?jT*axdӳx">]؄֖V4Uނaa<*=BTB>* ? k(T*,󣧻Nu:\.l7q{'j\5uvaiy ce7Mp`p\(JX+T*R@uJ% W]O~dj-_ &t%Nm6J%(Zw-`t|" AuXp8 {8cX*l."\VpeUI%Ob }0>>ax ģ#qt0I<Cutźp8(J|]S)<=.!h8YTҙ4:cEP**ڢmP~ԯRu] - -r[ pD>]ĺp3JXd* /T*a̠fUUmn\Y-HLS)[K#l.+c `ڢmwٳ,FG@+%ظT*a2> ۍXn'n(P0H8"y=x?F:F_o@ൿ_AUUqfYx.C\FOwu6BrL%Q܀l:^n|&pM7nG.CRlF>GXD(?Fq].!0cc(˨֡U|>ݎ֖VEzL0X,¢X;Ըjrp?ǯV+6aB0 |fWQd*dI|>/ee^#A:I?t8XR$tE6HئĥDS) סae7*8<D|^&G6E. p8 0EXBV`*1'}>H8X'rFGp8(~_2t`o E;^ǯ# `u8N=t&11FۇX,D"!cp,x _KgQ,1^/ ǯl6C4;8&k\5ةnc%b([UUqeqM07?W@?eոjt8q{t8aaSm(˂?v,%XV  |2v;f3FGQ,7KKhciy GۑdjkN=aa,-/U|˘J+օ֖V~~$n޺X's?;;(nj u:Bߴ´k9{sx=Չ6!úٌhf32^/t]4UFqm6|;EPd|ssu  f3i,-/+օ7d|V  E<oeaQ,XZ^BkK+z[gM\@RDTE퇑eQTPC2nG\5.88\.4SAXn傢(XZ^D4 oC4-q8|^0K2D.W]m6 yVy cc#K#P,#f1fY_njE2DW @ssX+I I.[7a6J#f3zt8<{?}o3-Ei/Bl.+d|R2 z2scp813niyK0ΤaQ,x TFGi^Y$EQp=~]R$I0P`뺌4+ֵ}r C$^/J#H`@>3i\_3ֹ%bapt8Q|-D "H$}~a$kK. ɤjޓ2m6yĕ|x=}]04MC$kpr0:ce$?Ɂ`&^<B4 xÅp,x U\_G.H<+مk1ll6O}~>_?n  0;Iȱr#U"q;q[Ө `*v6ݓvַ16>'m푴V;;e>?. :^lM~9C0Sj TRrtH\TP=cOp"JJ 84T* 9{2fWB S .p8D"!Q1*\HR9}>+SUdћh|>}xdX"z&ZGv3ֹxCOB1Hɾ3Hn4 H$[h4#ڣBA\.r9r9y6ՆSN\.Kdh@RVyK':NʅQ@\@u\.L'Q*P筃ihmiNek5Ga6*uB.eܸuCd*9!yq{qG"IcqqӳӂGv;v*;6=;- nJbd* %M *J7H8x<.D(rqﺮc/Bu  S+1nG6y&q֐d`ZVXĵ eEP,k00Ͱ6t@47]rTr@-0H$HT*0/ljqnjlPͻTvpw.f3N: ٌn`^o?4 * l6#JbѦXh˅h;?mɸWP(؄W d $FGaQ,"th4Ӈ -"u(JE\z{o9*(Z[Ze!X 'ffg03;EQ˅`~FYblnGOwb]6p`[ߖ3qm[-.T4t" +[R>XkW8<׋* \.ܳ^ą7G(llXX\lj6T*ĵڞonK4 h`4+a#eB%fڣԹIsc20d>*=>J[g]v2pZD!Z _&$4 k1lqSU]?I1OJڅ"EUU%-FABKL=-LZtFRC(jF. 7B{81H8 . ɂ$3T"(Np cE@,Ȱ`:8 .zp)YbI`ʍSmB9w].ӮXڢmBCR)79c7?pn%&l6 , ̋_DNLyW{Jۃ&㓂2b'hJTB"R0=:uJ2pPV b^WU. B 7jd|GHl.K#؄Ƌ/!]^^!ˢ`bQ,j+!Ѐ֖VD_TH-ַpnjlIaB ,-/an~ }"bnf3"dpv*;Q C|v!x^Pe,ZJL -"z^|1=;- Sf>K t@9R;c6)v*1%X'7$!ϷP11"wH@fv8uww\.T*!jȯTs`-p\=q|7n@\,tEOwO*0ݗJ%v,,.%.-/afzJ':N`@DY&qlFW X,b<<~~MV---JW`ZelV+2 &M¦ڄ"<3l"j\5(n ƭb*1%.똛ã#bD}>\.WCXٷ"Jںn`aqA)鬦6!i*XZ^(r E47?' |(%HRoWt]Us @>L5=; /*<51**m NSr\-79EiGqi}~#zg2wqOR #47?qɃbnܺnJ%]Lvۃv-$5M+ol6v6 h7RQL?z\NS,&MHeiyIbR˗$$+Uނi$2=)+bVy 6456}"v]oZC-f IDAT)7=6$SIL'UHD zFfW0wKK{\cc~ܼuSJ(I}JLt0ҙ4Rɔ'j)IjY˞FqC GvH H#JV<*H|>@; at|NgΜ@jyH9a@VDW⧺K?2* `t&-r/~wz' ƈ/Zx?t8QC7;vjk@CО'ĨuGۅ6ʨOvⶌ?nW) ]B{}O73C _D@km zv $ #ሸZ ?{HgIIs,PKv) OzPwFd9?oDdfʋN P<2s,p")37Kف'`#lܼA b]{kc  D6z*XxMn~V1eB] qs TbjOz1IW]0k`y6&T1:0&9F<ċW'Θ5aր2"Å\ŏ14MA8L9Hܽڑg#GbEDo'MsGehQ֒ nDNpp0{/swRw@||2vj0C(ja_Ow9ʔv;* jݵ8h=(:J";fhiܼu/a5I?2 q4pˢ6ӳ(n +(?gq'uGTDGl6˓nǩSY^@6lF&(f3Nt@(* ˡ!Ѐx\Q=.߶mĶ|\NXty?#IF_:8>tDNpD~_h> C" 9:x J9'{Os0rOuc1- PT8|jy\Cq/iKo9%n9,Eu:f %vr{]K#ĭv;803âXoj|ył&^X p8 EQpz_l"X#EAOw66Lp:y#N: bo/AiB.Ӓ},FVӡJLv7aIo([(8*ƿlly&n޺@Uf\_jdH8oI(/*RIpB-XZ^R 9I͏86K8a(Jx"~| /K#!n rip}b2>K. bqj ?&MMA4S֧a)qM v'.FKk /HH$l:nwHє^'~؞O7dO@ItrR~'{O5Rt84E.ӇD.="2ֲfiʄ*eοs@{[2dD` >%[Vc#)L3-S)DPƜ=%'3yf's;q[^m6&g-;QOml>D @sy1Eq3,ЁMۣ3vE%6e󾌤0I>U]`T2 @l0UJ9bEN:b5%HB!RIGps,|T+M1t @# ۋx"ۨy脙'~73\Fa 9ӱ10W`Q,"V12e3r2p|OOP] Z;qÌIhpaUUS-͠fc[7n Cd BKopbx샨$01ЪqAyS1*JZGr ƌP0c?/{DQR)\E!i#N eDx\d́k8!yPc-*Qh>O[lEˉu b<6غR5򚇞> {ucYgmzED|@9R^Ȇa;xfpOn|ET*IC@<,.LcWvԿT(/V  ê(a"E'{OJZP*yӑ{U㭌xF |j}r03DɘQ|vg#rȆ09P.Mix"yMS@N!H* hACsW^ؘk4rg:O"ut|T& oΩF(fTR6"Œo֫]yv !vźv1D6>ahQH9ݓP=SR~@zp 0hzCYٌtFd+V[ _L hĪP{H8 aj&1ޏ1/ϦW"2eF{ox;z#r>LzOFsO9%eD­hG齟K7>_/#H$fy1]GғQA`Czc VaAΜ9X`GPN8IK`8Ȅۉ"'Nu< n؞IjNN0:˄I1 ;>'d 8 dbKEQS*, Gy?uW.?⟠>te"xt zYX\65i\@[-ݸuC:.//!Ѐ/|˸qJl ;Iw\.d*)BLVV+淥jbvvV6Fq?sL%0xf5!5yi\vUs/ TUA_ Cbgkmb_4 nGpͩĔ:^44͸;K&+>#DGV*tdIl6EP(؈GaSm2l:^(hX566byyb& Xɱgg Pȅ_@9j@/t|EƔrG( b=JLnmiyTJ:.B׋z%"bK{?}o~[u P\K}>ߞt&-&1{pψXBJc%1>kt/ ։x`X|/U0)i }5L: Z<b?G( (J88\.'=k&)fLr*X+I ܼqSvĵ i؄s; ؄h:og*t^2~bQ& 8q\vJ„|>W g+?Ne퇥"%fe"Bփ(9DzXWuM=M+|~XF&¼όffgQY]TAAtɜZXL f3N\&O, ͎jaHD $< ¦NR_oHx-wZ<6۽gweԟ &fE_$jg0RL}c_TJX'(֮ZR'7r|*2cĬt1>8C ]x?9^4D~d|RvpDDn*PƠc][wKZt̠tNF 1IW}?GG{"h4{{qqxm2ߍ:A{2L\#yM>ۧe^|.~#k0$ge8> 2NX3llaSK"[U]TW Cp86j#jWUcb{zÐ潲kBsY< ?bGfοs^IQLK+Uaοs6Ն!9$r\7u6`_*:01NsG>W z5I˱NeGtljlB{v@0$"փ8}4NDP@6W=DP筃CXaZ;(ڞʉK B )?z(>yJ>KZ-0$ \q6*`Q,o/DMMjJ +TBk58NJPR*p!t]LSpPUϹú.2S.aSmxPű/e}x3:>}/~[ju?>{} nv{U>DPЅ!4D:o$L&#YSt9ƒt&T*n"0FQL 2/ޗ$dI6(.&SIx^J+t&@iMMT*d2*o!H'.}~9[u4eaiU `7o717?UUQ@>t8~}/J7]sW"` Ţ֤Dg{ܼqSN`2x 4D:vM vsPCa^X\2jEcc#ZZZY9gxS ` *c6`  I`@jxd|6zp4oXZ^EHQ,G_0V*׮ q{X)FQTQaa caqAn0(b%5<##ߧi6(ffg_;\.\.,2 E(d.MΜuSc H8"e13;7ADꄓ_ 沨q9^mVTpXX\n<B<53;MӤ B.8WA,Eܝm}[N\_UP$h(JxbHg[3GT*>uZ1Z( 9*3|QvMn.j0:>bbNe`_@xA|D3qmB.EQ^F35ַ!|.}DSctb+^BjkBo_xZ:::P㪩nX "/xC:::`*K>Bps IDAT/?.٨8i4H║%w5{-&髶hDH~bDJ[{T,bZ}}iz_=~Ώt/0;I\ 'r𞩃;Y%&z:"ረߑc~c>Oi? -#~#1s:Ro,d;cc ]Z7Zt ="OYD ؃`<3KuT&3##2lU'_ ͊}0U)=]+FG %#N}WE6hEQ䜒{{{)JۉPE ?KLKO|>/'4QaM|~*[ͯŗQy΍B[*=#؆?8c*7`zvk5R) AwzvZ+"6wwR łCUT{' f0ƣh1RcG푾#PWˆ".YRIx]c֔POȨ4 9,j@$20Pb^hd8s|Vn>>w1(kHg,8"yO ZJ%$RX`#jg>L~16E֏ѱP0BoChF鲒1lLm4xܞ+Id %;0WHLT4]wKw{+3b ZRWGnD0 YyU{f9+*Qĝ2h"Z w`$2fEU#g_'? $ues|2{-!&M`n~Ntj^Wx330Ȥ3RΤTqR1"X,bfvF6ã#L\J~JrY:㫪J"jJtjQ,6biUBgz(<Ɋx|k"'F3GK]Fة_2:d*Bc!91ޓd1 k;RJ OJm)Qhд>PE\ p`;;B]$痚vb##:ywkYN+=%k& ><+3E)PBDi_/u\H8}4';պ CHRT*6gjc@ #5 lV^T( V󫘻;WS~|j1MD NhhW OeXX1e5f,2dRɤt8^ a*:%e](«^f~[-464b)$ȇ~(wށ;kx)KDH$v9[D>Ɖ.eCsl𓆟&\c`vzDj)|I\s#Nֶ6=q*n߾- а"D_K4D"l7Ůl{MTg:>#fVB7Ŭ'.^n~mx^Ǝ(ITQsSL?ceA vA0o5f](j}`]zDP*$z9SH%jUc~6FZNCK6>{~F>am`{z{Cbs ]UZ#3ǎjnjn|5 o^h$bsP(D/cҦX,ﹿ؜%켯OG8t5i*BwO7*F'#d`Q,F[kELN;eL}]=L2a/S"r0=ݘ%33R.Á0׬ș9XĤ1h~IȦ,(}e'C溮/V(u[fH !NNkUJ_GGGR锠Ni P( P!!t׎X4^0$Id2 qGg2oc} ;'E16T͔CPѺ.CڪCAh|-4n ҂qsSO1ޥ:"\ Q:Y8U~Gf'0̙_ h~械zW2+֗߇ lo?0|axXdڋQ+.(߾X+֌ Uw_rނ@3RF3 enwI0ƣ#^h=11úN3Y ״m:RW)ge-@o`CP4d0S)UarxeQ"΋ExCsdI84S#p(1~xhӳFux[ ['C*A} Pn$)Ġo4Z qt:%4MCcC#13;x^ NW_W?)RS:kƆ!vmC7rrK6_Y,%dQ&&'[k!:7 dzCY!!fW1M&78Y}^xlVtBGG675ꕫ¦!T*Q9oibfvF4L_%z :<*6r+ p-R锔<(v;rV2+(WH$ryp,xL ݎ]–xz*"g"FqRk9p8,\}@6EWWqӧ$K|ۚ/`Tqɧ$ 9jׯ]Η># q4J{dV䄨cׯ]Arv6\+:B*bFph=~tǚ_<> U03\9ٱӡ9^CuiH>De6l8Xv2.J]? w}ݙ(8G=҅Mf9_Pf'3jױn"3ډ غ>&X$kװn&´vA',q:r~O&TmNye1u: ue'H ;bf 2a"%T<45uO<%^"Dȴrho>i:a:?ߓ5%Mxh ·Xv.$]IY>U@:+ڵk~ Shg `kkm~_fݿ`?*MEfK*Yn6q7_^@5-2=*Z/ðfSo\^CG$F3WLÚ&ޖpP7‘N:lM{0NBaF(I'-/̀@<Ȑtrd2^x\n|9%puB{<F>:6 lXN.c)yQ#ű1fFɵzK%,ƭTp#:H̍#4$S]]-v4 ÀaXJ,axZz/%k&vz z<a~abZ\N.tC#CB5[!;DHQa1<2;w`|r\ٛSGثQ(D*jPۑ#G8l1FnZ9]E.l6;Y}e2brB󕹭=-Ÿ'ƛC(٬ԁuRb X v[~}}RV*}Et*?U4 V$AQ$LXOSOIThرWT?"YT0bj[YS.y 4hlYf^㖿3+6$D< F|p*6cU Ж*~Qh2|2KA2UlhXORHg<.H qN%j7*sPZX:yA GIDATY9ЪΒAl |ػBP㱺'3Bk:wTV2+frv;w4r^K_‹_y[χ.M03;#R)ZݼuP(Y>UBl.t:u|(+d7rHXbrO9 SGڅ60X,\.^*s9 \.+^L&#Vu?={aeC:(7 W~.o,F@0ӑH&p:8tlVV-_B4l!N;`Ѧؒ>@OXͮ"`J+=&ߩD/iً.s |2^~exEb1,Qd/BײNEQ*iHp( ˸! KwЀ#|lY|dIDb)ccnj.8䢿yvcr|S))4M$'d'7b9i9o:!Cӹ\X c#qfWED ~/ӍccxwD0pύG`6ku(u"NazvLƂr2֞8:{«TT%b% 33ւ*z{a >C\t_avhQ;N1xw1JX5ZabrB"0QF: (-hI4iZ^{A:h5"DFy ?|5MU_٥4ve7FupD/[7jcu]Yl y_T-K8vya]@ 񹫫^}tCL 7n0x,!?9[XjvZaH  t,Na3y 8;l3:,ƦSbrÙv;wT:>y(l,[(B+H.'ۇ4NU躎-Q體y|rZ˼ \<#P0$Jd_Wޞ¼p. 5;i708 e͝wpQmʈʼn'qU`VaK 4T4Lt 'O VLmT2 X8 ўFv'Hv`Ql*RO~ʇ2*31/'wH$r* -ݼuSAU;|Rbu] dTC a{YbHC*'4DL1S?EZւ|O"{*FBU>s^ZqjsөS,Yqi =9%N/Vȉ |aT@4&&'w[-bDi6rfv 2؍sKY.[㥺dk^C>8|͡VN'|MYu<εCxEvwvio~r㓘FsS3l SY_K(K0>9.#Fn[ΣS.CIenkjvUTF'~xϗ-%Ĝr#✇e#Lr]B:mݛ^@RJ\.ѱQLLN /N2Y}]="g"Ȭdՠ}hd Vb t:Ei_(چ*vfcTT*13;#[XN.ˤ5-<4M!!$ \9.E7$iW.4|P0z:.f? %6tk5 fi+WaXd]~B(2sўv\[HD1`lmlhޚhj!"hnjFZh_ ~(5 coii1Q rAWVSjuzvuXͮ0 \ WW+ضmA}55mplafvvy) ܽ#"gltf3ˉgkȾ+NGQ &VH&Rv5Tx+d7FKK ömjvUv5n֗,F@E@g**j> <(Q[p:#Y-qLwPHAC@ Q.QsTuO?"@8}Y -@m2=\ T"ݗj鸜6D'A5Di:Wb#KF[@LF/4t =@/:Cg!zZ]1 cê -q"yH X2F InjtyZgvu pqU_2(%(@MW&D[g' i#2ʱ9KVA8 X} h­i\;zTsĥ`MR{m5W9H,Ĉ:lu^P}# \?\HHv'GE Pj ^;&xA  2`UbXq^#d&=+R"@u>dd !(u!"F8&UA\e!M zQ<="꾐RqXsoԸ_V"b`و#b;,dӈ RxW&ŸΏˡZ̵kzV5j!\nt;4V!^ G̓#7)j#s~\wH@MI!$~0 ިiwےȚmM! ع hP܀e3i5zuk5x.w59Ṕ3;y!C\hq4=JjЖYs2h b.[t'1zQ{ xӤAWշ]zNP{E6g}F->&:#6"]!1;j/Z45y!,ϼNm33pxB$4%?$#eP1+nmtM=;Npk8EEEs=\zTUUYo^j[MP-S"@󁋐>\;p)&&`.V#|s0X,f|>RRRHIIa`` D?~<==w\<ȢE(((z)߉'˲6uf"ѳ6$%4DGu\[BQ8♜f:צtljA; Ŕ)S˙3g+W}h4L2Ůd˖-l߾z-Zw /LGPV'#? lDgno^=A%qd6X,)++++++(..&  dffbYeY ]wž}xYt)tn݊ʒI6!(r!^͆ɁzPF[EEEV{{;{ꫯyhjj?~~(//wߵ300@qq1⋔q[ N]ݙck#*o6?>ki0MluvJJS\\ӭ'2uTkƌj*>kѢErJ~?fb޼yB!"L"D"ƍǂ ظq#w{~vl)emU[ ׇ47Hdb ک9Voo/Pۺk6mF\wu̞=m۶1qDnVꨯX,Fjj*g?322DDA:;;7o^cϞ=o5YړpjRmCHOqz"r"yyyمL63fX۶m_w^-[ơCx2qDrssY~='N ==qa1m4>=X .d̙0i$B4773~xouqUWQTT/Mb˖-lٲK/ 6mԩS)++ò,x饗{3gN^^DD"&MDvv6mSYYɫO<<`X"uL.-@P=0lJi@\⭠W<|ߥp8G}[oŎ;={6aژ2e \s |tvvK]]Nuu5PF|2eKzz:eeeVvv6H۶qRnÇhnnKjo%蓞y*G!i׼xbn`ڵ^#Gό3t.B:;;}RW^n?̴iؼy33g$++p8 )))r-߿jooc۶m\r%׳cJJJ(--1tMMMNKKb۷ihhBPUD#?=TVwXcc}W{n֮]ɓP(waM4cǎ1w\TUUE^^> 7of͚5L:o|lܸǏSPP@YYeee_jvMssqFOќ!+omd9wq#4Thggy|[ߢ> @CqFN.]JMM 7|3mmmՑzӎ;FGGh/_βeXhXGr~_o>6 `yg59r. 5 '0Ўg"aݱ+Vxb{Ivv6\r Wo+VpM7q5o2a,"##?> ZpΝk Z?~'O:*>' z@//^Fl h L|Z\#-veٳǹ瓛Kvv6`~l8[l.ONWWyyy|>z{{ill*233iiiq6lXeDS|&%zh Gd1L#rh'Q1gψm\ymf 顱SZZʌ3xꩧ谞}Y*//qv޽{ill=ml%?Ke>#J{꘷\& 34@)d6999VII tvvb6,X26o{XEWWf֭[ض}}}a'&ys 1MC}dn|T0Ұh"\:[s Շ{Gb1 fib#h$gN3^or8ת…Ik GJ#g*kNf v!FἃHРIF@Ts ܜDՅ\؄؊pWFI,%n#6"kCr |Yh4:V6pI\(qԋL4!^4#녲ÉտR4Z@w"b=h(w,ctt1d44hi $I1@Lc&M2d44hi $I1@Lc&M2d44hɪX|yIR}~-p+2wN/&"넪 i:|Aϫz!`C#A]sosܡh2: pxje|x`ul$M9dYGcSHrQT_>D{?z75d0oBƫ6NVk@ͼz]k,ŸΎ xQU에D_ϫRg{?Vu?: ح:{Pw!d` I]Zeտ׀gyyb17H{Fy5N+#W~a,PT:v;";{+DJU@8d$Ucӑt":v1?F\3nArM: Tץ،p~‰?TP]Sۓ'$x QT=:Uk佖P3/_qG|"!z9b qU?Kq M'/VRS@"ӎ ^ۋy+u '"1oTmC֮FDMNEbU "[R={ݏ> [L@5#\gѝDFwj.Et}HF8dT7~gkrθ J},(9 D8Q5~^ա:ﭿ@ӰYȔ"#J&7醳a`!D!Q7RÎ瘅 2?IENDB`core/input_hw/teamplayer.c000664 001750 001750 00000012715 12702465756 017022 0ustar00sergiosergio000000 000000 /*************************************************************************************** * Genesis Plus * Team Player support * * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: * * - Redistributions may not be sold, nor may they be used in a commercial * product or activity. * * - Redistributions that are modified from the original source must include the * complete source code, including the source code for all components used by a * binary built from the modified sources. However, as a special exception, the * source code distributed need not include anything that is normally distributed * (in either source or binary form) with the major components (compiler, kernel, * and so on) of the operating system on which the executable runs, unless that * component itself accompanies the executable. * * - Redistributions must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************************/ #include "shared.h" static struct { uint8 State; uint8 Counter; uint8 Table[12]; } teamplayer[2]; void teamplayer_init(int port) { int i,padnum; int index = 0; /* this table determines which gamepad input should be returned during acquisition sequence index = teamplayer read table index: 0=1st read, 1=2nd read, ... table = high bits are pad index, low bits are pad input shift: 0=RLDU, 4=SABC, 8=MXYZ */ for (i=0; i<4; i++) { padnum = (4 * port) + i; if (input.dev[padnum] == DEVICE_PAD3B) { padnum = padnum << 4; teamplayer[port].Table[index++] = padnum; teamplayer[port].Table[index++] = padnum | 4; } else { padnum = padnum << 4; teamplayer[port].Table[index++] = padnum; teamplayer[port].Table[index++] = padnum | 4; teamplayer[port].Table[index++] = padnum | 8; } } } void teamplayer_reset(int port) { teamplayer[port].State = 0x60; /* TH = 1, TR = 1 */ teamplayer[port].Counter = 0; } INLINE unsigned int teamplayer_read(int port) { unsigned int counter = teamplayer[port].Counter; /* acquisition sequence */ switch (counter) { case 0: /* initial state: xxx0011 */ { /* TL should match TR */ return ((teamplayer[port].State & 0x20) >> 1) | 0x03; } case 1: /* start request: xxx1111 */ { /* TL should match TR */ return ((teamplayer[port].State & 0x20) >> 1) | 0x0F; } case 2: case 3: /* ack request: xxx0000 */ { /* TL should match TR */ return ((teamplayer[port].State & 0x20) >> 1); } case 4: case 5: case 6: case 7: /* PAD type: xxx0000 (3B), xxx0001 (6B) or xxx1111 (NC)*/ { unsigned int retval = input.dev[(port << 2) + (counter - 4)]; /* TL should match TR */ return (((teamplayer[port].State & 0x20) >> 1) | retval); } default: /* PAD status: xxxRLDU -> xxxSACB -> xxxMXYZ */ { unsigned int retval = 0x0F; /* SEGA teamplayer returns successively PAD1 -> PAD2 -> PAD3 -> PAD4 inputs */ unsigned int padnum = teamplayer[port].Table[counter - 8] >> 4; /* Each PAD inputs is obtained through 2 or 3 sequential reads: RLDU -> SACB -> MXYZ */ retval &= ~(input.pad[padnum] >> (teamplayer[port].Table[counter - 8] & 0x0F)); /* TL should match TR */ return (((teamplayer[port].State & 0x20) >> 1) | retval); } } } INLINE void teamplayer_write(int port, unsigned char data, unsigned char mask) { /* update bits set as output only */ unsigned int state = (teamplayer[port].State & ~mask) | (data & mask); /* check if TH is HIGH */ if (state & 0x40) { /* reset counter */ teamplayer[port].Counter = 0; } /* TH & TR handshaking */ else if ((teamplayer[port].State ^ state) & 0x60) { /* increment counter */ teamplayer[port].Counter++; } /* update internal state */ teamplayer[port].State = state; } unsigned char teamplayer_1_read(void) { return teamplayer_read(0); } unsigned char teamplayer_2_read(void) { return teamplayer_read(1); } void teamplayer_1_write(unsigned char data, unsigned char mask) { teamplayer_write(0, data, mask); } void teamplayer_2_write(unsigned char data, unsigned char mask) { teamplayer_write(1, data, mask); } core/tremor/000700 001750 001750 00000000000 12703321515 014125 5ustar00sergiosergio000000 000000 gx/images/generic_point.png000664 001750 001750 00000004230 12702465756 017135 0ustar00sergiosergio000000 000000 PNG  IHDR``w8tEXtSoftwareAdobe ImageReadyqe<:IDATx\klU>3n *R-@SSM@QQRUÄ$D~hTMh i4~P$h!( DH䑾hwgܹNRw.sN޹w^{{=̝ՄrDg0L 0L 0L 0L 0L 0L 0L 0L 0L 0L ܙ%Mi_"AD -U$Ɇxn{AdЈLqe 77= G9x[@|-`nT>}Z DccRt*&gDF*JQt(,, -Zd c9 M@Ė }YYYv1l& ^ 4M羂 `a& `uLl} M^A@BeIo4DcEj6 R/ljQQŋ~"e; B2=o>8v?~dldH*DFDT)SJ.*Z/^ ۶m;v믭JXf Cz:? ?O!_NbЅlFFp8_z5؛=x &Æ "N6vȩ$eec悖 ؾ};c󥯏^UA8̙33iDhllSO|LV&/((KXpa6pmܸɓDzñd'Y m |hO>(*PYsm14k'bR#a0j$q'e ҡnRw+Z:*u h~&464KU @N1O*G+ZcsLgJK#Hi' 'BmMTzT=~ZE\-vAQTQ3ݞCw] M7tN5~wAvH.İv5ip1dRHt)JMPP\1B@hPpl~ez:􆌾m=tLČ5G|<P 7vhZ *eu:7) Shhw ]XΥ(k ]Wh.Ȋ|oxꝶ(Yww$B5- ط0MW(F?~cѷ:Z]{`oGWW<[ f܍>@dNX4i6IyAy=.]y? 1$}K:le#7~"їHE\zCP hP0>~|]tPOuPb']_CElw7,L8 ܼ%@9Džv<% =IY/Kbmr^u4*17Y0ni_NBiTܷsX97<:6ޥLBotnT׬#rl!Ju"A/ g@ @gg;l n^F .'^J4 RH9Ptoj߸ ? }_omIENDB`gcw0/000700 001750 001750 00000000000 12703321515 012525 5ustar00sergiosergio000000 000000 psp2/unzip.c000664 001750 001750 00000110015 12702465756 014113 0ustar00sergiosergio000000 000000 /* unzip.c -- IO on .zip files using zlib Version 0.15 beta, Mar 19th, 1998, Read unzip.h for more info */ #include #include #include #include #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else #include #endif #ifndef local #define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ !defined(CASESENSITIVITYDEFAULT_NO) #define CASESENSITIVITYDEFAULT_NO #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif const char unz_copyright[] = " unzip 0.15 Copyright 1998 Gilles Vollant "; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ FILE* file; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { FILE* file; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ } unz_s; /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte(fin,pi) FILE *fin; int *pi; { unsigned char c; int err = fread(&c, 1, 1, fin); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ferror(fin)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong (fin,pX) FILE* fin; uLong *pX; { uLong x ; int i = 0; int err; err = unzlocal_getByte(fin,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (fileName1,fileName2) const char* fileName1; const char* fileName2; { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) const char* fileName1; const char* fileName2; int iCaseSensitivity; { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #define BUFREADCOMMENT (0x400) /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir(fin) FILE *fin; { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (fseek(fin,0,SEEK_END) != 0) return 0; uSizeFile = ftell( fin ); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (fseek(fin,uReadPos,SEEK_SET)!=0) break; if (fread(buf,(uInt)uReadSize,1,fin)!=1) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer "zlib/zlib109.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen (path) const char *path; { unz_s us; unz_s *s; uLong central_pos,uL; FILE * fin ; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; fin=fopen(path,"rb"); if (fin==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(fin); if (central_pos==0) err=UNZ_ERRNO; if (fseek(fin,central_pos,SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(fin,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); fclose(s->file); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) unzFile file; unz_global_info *pglobal_info; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) uLong ulDosDate; tm_unz* ptm; { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal (file, pfile_info, pfile_info_internal, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; unz_file_info_internal *pfile_info_internal; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo (file, pfile_info, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (file) unzFile file; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) unzFile file; const char *szFileName; int iCaseSensitivity; { unz_s* s; int err; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; return err; } /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, poffset_local_extrafield, psize_local_extrafield) unz_s* s; uInt* piSizeVar; uLong *poffset_local_extrafield; uInt *psize_local_extrafield; { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (fseek(s->file,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(s->file,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile (file) unzFile file; { int err=UNZ_OK; int Store; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; Store = s->cur_file_info.compression_method==0; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->file=s->file; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if (!Store) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; return UNZ_OK; } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (file, buf, len) unzFile file; voidp buf; unsigned len; { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->read_buffer == NULL)) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if (len>pfile_in_zip_read_info->rest_read_uncompressed) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if (pfile_in_zip_read_info->compression_method==0) { uInt uDoCopy,i ; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) unzFile file; voidp buf; unsigned len; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (fseek(pfile_in_zip_read_info->file, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) return UNZ_ERRNO; if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) unzFile file; char *szComment; uLong uSizeBuf; { /* int err=UNZ_OK; */ unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } gx/images/Button_arrow_over.png000664 001750 001750 00000006475 12702465756 020045 0ustar00sergiosergio000000 000000 PNG  IHDR,,ZsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time05/15/09? IDATxՙ{pU?}><,;fʲu~eZ凔gOKz*`h@?(WVUXKhnZv~V㹄B!GI;($IN6 e]4pk3/>̬ly(ʖt6q|k^O';dpۏ+PoN&0 @u H9g%I 1u灟2,OGh>2 UUG^XU,$“KS3 NSͲ,LLyy:`:6L:d4 eá'{MV}n62jG?s s,}z'x|i@C  lfdgFD6V֡EkTU}@`UUzs4"V\~dY_l ((hzix<z4]au]lڰRV})QS`-J/?>sVB%rMR`5MC4DQeiC eG0a6 H@ǚf̘ )mrssp]bhIcĠugi%Q>[sTԆQ;;wn 0tPx E|>^`Xa\eA`*T<`fnO#O嚲^S,>ef͚$I2 Ç]Aw} ݆a8ж|*]xkv+ޕbR IxG$/ (aًKytt|b7_s)Lހ9_QE϶)IX^{4O}ʒ( 9$,N .YxpYmGZxL. -SՁ.}XU%o.LclBK$adRW>woaŒlؖϿ/fC^l#`]+|U`nڿbumPp( ck?泓z"i݁ }UySS}}(?uŜsɔU-8W} |$t"y Oz>CWFY2IcomVeJloa}]GO|m5sIzy7vV^:\WɅ^+ 4zWKY8ʐL.v^'<ń|&N^2sh W%U俽 \ѺذYhimlfoR6)BTb'^v} # # Defines : # -DLSB_FIRST : for little endian systems. # -DLOGERROR : enable message logging # -DLOGVDP : enable VDP debug messages # -DLOGSOUND : enable AUDIO debug messages # -DLOG_SCD : enable SCD debug messages # -DLOG_CDD : enable CDD debug messages # -DLOG_CDC : enable CDC debug messages # -DLOG_PCM : enable PCM debug messages # -DLOGSOUND : enable AUDIO debug messages # -D8BPP_RENDERING - configure for 8-bit pixels (RGB332) # -D15BPP_RENDERING - configure for 15-bit pixels (RGB555) # -D16BPP_RENDERING - configure for 16-bit pixels (RGB565) # -D32BPP_RENDERING - configure for 32-bit pixels (RGB888) NAME = gen_sdl.exe CC = gcc CFLAGS = `sdl-config --cflags` -march=i686 -O6 -fomit-frame-pointer -Wall -Wno-strict-aliasing -ansi -std=c89 -pedantic-errors #-g -ggdb -pg #-fomit-frame-pointer #LDFLAGS = -pg DEFINES = -DLSB_FIRST -DUSE_16BPP_RENDERING -DUSE_LIBTREMOR SRCDIR = ../core INCLUDES = -I$(SRCDIR) -I$(SRCDIR)/z80 -I$(SRCDIR)/m68k -I$(SRCDIR)/sound -I$(SRCDIR)/input_hw -I$(SRCDIR)/cart_hw -I$(SRCDIR)/cart_hw/svp -I$(SRCDIR)/cd_hw -I$(SRCDIR)/ntsc -I$(SRCDIR)/tremor -I$(SRCDIR)/../sdl LIBS = `sdl-config --libs` -lz -lm OBJDIR = ./build_sdl OBJECTS = $(OBJDIR)/z80.o OBJECTS += $(OBJDIR)/m68kcpu.o \ $(OBJDIR)/s68kcpu.o OBJECTS += $(OBJDIR)/genesis.o \ $(OBJDIR)/vdp_ctrl.o \ $(OBJDIR)/vdp_render.o \ $(OBJDIR)/system.o \ $(OBJDIR)/io_ctrl.o \ $(OBJDIR)/mem68k.o \ $(OBJDIR)/memz80.o \ $(OBJDIR)/membnk.o \ $(OBJDIR)/state.o \ $(OBJDIR)/loadrom.o OBJECTS += $(OBJDIR)/input.o \ $(OBJDIR)/gamepad.o \ $(OBJDIR)/lightgun.o \ $(OBJDIR)/mouse.o \ $(OBJDIR)/activator.o \ $(OBJDIR)/xe_1ap.o \ $(OBJDIR)/teamplayer.o \ $(OBJDIR)/paddle.o \ $(OBJDIR)/sportspad.o \ $(OBJDIR)/terebi_oekaki.o \ $(OBJDIR)/graphic_board.o OBJECTS += $(OBJDIR)/sound.o \ $(OBJDIR)/sn76489.o \ $(OBJDIR)/ym2413.o \ $(OBJDIR)/ym2612.o OBJECTS += $(OBJDIR)/blip_buf.o OBJECTS += $(OBJDIR)/eq.o OBJECTS += $(OBJDIR)/sram.o \ $(OBJDIR)/svp.o \ $(OBJDIR)/ssp16.o \ $(OBJDIR)/ggenie.o \ $(OBJDIR)/areplay.o \ $(OBJDIR)/eeprom_93c.o \ $(OBJDIR)/eeprom_i2c.o \ $(OBJDIR)/eeprom_spi.o \ $(OBJDIR)/md_cart.o \ $(OBJDIR)/sms_cart.o OBJECTS += $(OBJDIR)/scd.o \ $(OBJDIR)/cdd.o \ $(OBJDIR)/cdc.o \ $(OBJDIR)/gfx.o \ $(OBJDIR)/pcm.o \ $(OBJDIR)/cd_cart.o OBJECTS += $(OBJDIR)/sms_ntsc.o \ $(OBJDIR)/md_ntsc.o OBJECTS += $(OBJDIR)/main.o \ $(OBJDIR)/config.o \ $(OBJDIR)/error.o \ $(OBJDIR)/unzip.o \ $(OBJDIR)/fileio.o OBJECTS += $(OBJDIR)/bitwise.o \ $(OBJDIR)/block.o \ $(OBJDIR)/codebook.o \ $(OBJDIR)/floor0.o \ $(OBJDIR)/floor1.o \ $(OBJDIR)/framing.o \ $(OBJDIR)/info.o \ $(OBJDIR)/mapping0.o \ $(OBJDIR)/mdct.o \ $(OBJDIR)/registry.o \ $(OBJDIR)/res012.o \ $(OBJDIR)/sharedbook.o \ $(OBJDIR)/synthesis.o \ $(OBJDIR)/vorbisfile.o \ $(OBJDIR)/window.o OBJECTS += $(OBJDIR)/icon.o all: $(NAME) $(NAME): $(OBJDIR) $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@ $(OBJDIR) : @[ -d $@ ] || mkdir -p $@ $(OBJDIR)/%.o : $(SRCDIR)/%.c $(SRCDIR)/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/sound/%.c $(SRCDIR)/sound/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/input_hw/%.c $(SRCDIR)/input_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/%.c $(SRCDIR)/cart_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(SRCDIR)/cart_hw/svp/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/cd_hw/%.c $(SRCDIR)/cd_hw/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/z80/%.c $(SRCDIR)/z80/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/m68k/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/ntsc/%.c $(SRCDIR)/ntsc/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(SRCDIR)/tremor/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/%.o : $(SRCDIR)/../sdl/%.c $(SRCDIR)/../sdl/%.h $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ $(OBJDIR)/icon.o : windres $(SRCDIR)/../sdl/icon.rc $@ pack : strip $(NAME) upx -9 $(NAME) clean: rm -f $(OBJECTS) $(NAME) gx/images/Ctrl_none.png000664 001750 001750 00000004263 12702465756 016241 0ustar00sergiosergio000000 000000 PNG  IHDR0Hsv+sBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time04/29/09g=IDATx_W?3;fk56-+(Z-fk* ]|.O٠`_$ "" IXlJZ&7mbkd?3>ߝ΄b9p=sm ׁ ꭤt Ч\=ם4 <[ ~ے" 'FscJϾ\yr*f4,K+sRI-'ŽYI@/-`P  %20a!+u:p po"QU*h’5lIvŽ Ú? \Ѳ kv%^9yc%Q9-yiA7dgf\x2pdIo.eԸ$C9%/eWn!-xUgḛt4'*V[}ڡKI <^'/ǢҰڿ(Ck V )w`>*_~ycqwp ph./ ͚s8EMhjy~W9OӖ<d=ݔSִv[ϕ<]N'_ 7p;Ǩ{ F4uʣNScHcHY?Gbn0*n`E &1ML=x,ۚXx2 ?w˫U$;L9yY$%쌍| tl-ylN-Og%y?̓R'&7㹇Owq>B{f/%:;Yl76q_W44;IفuJ81島=4s\Ò6ҵ` xл<,8>,~ (۵5kءPzbgd͆w,Y:6]FvZn~2qq]`hYױm7G(ң| ;;51X:+7x;cX(u#<(d؉e1EXߍxl,bAv,p&9[C`wav6g mPrp߇:2ԥo.WNf'X[Dܪ? uV'_~ |V ^Tq٭ˇh# qs؝*F5KF-2 v^ɞ1`cHHC/Ȼcda(ٵc0ڜ>uUF `C @rc'YxlQuBh));$3oQ}>N|ocIw^c-X<#߁u쐼 V(^$ϯGDW=s:򏛋rۀCڤo5~ B,?.a%\VYIʪ?`;W!?Wǧ^!ϕ\[څ]OMa')XQ{zcL`znkoF,hZ0Bo8(Zzh(Zzh(Zzh(Zzh(ZzMD=40cQOw;1cyD~Ula{ŧLg_3%doގhbI>XQBHBx,x1_|++݌£1u{T1N{c᐀͙ !"31728/~5 !tIEY`r{pae:p5'o!ѡQ: Mڢդb4rcP(x*0y\1b:!|x1#:;Be\bF cޝJ;p/#ΞB1l|-y`? /M` ݇2cLIiQ~[%1SK ,nTIENDB`core/z80/z80.c000664 001750 001750 00000664462 12702465756 014100 0ustar00sergiosergio000000 000000 /***************************************************************************** * * z80.c * Portable Z80 emulator V3.9 * * Copyright Juergen Buchmueller, all rights reserved. * * - This source code is released as freeware for non-commercial purposes. * - You are free to use and redistribute this code in modified or * unmodified form, provided you list me in the credits. * - If you modify this source code, you must add a notice to each modified * source file that it has been changed. If you're a nice person, you * will clearly mark each change too. :) * - If you wish to use this for commercial purposes, please contact me at * pullmoll@t-online.de * - The author of this copywritten work reserves the right to change the * terms of its usage and license at any time, including retroactively * - This entire notice must remain in the source code. * * TODO: * - If LD A,I or LD A,R is interrupted, P/V flag gets reset, even if IFF2 * was set before this instruction * - Ideally, the tiny differences between Z80 types should be supported, * currently known differences: * - LD A,I/R P/V flag reset glitch is fixed on CMOS Z80 * - OUT (C),0 outputs 0 on NMOS Z80, $FF on CMOS Z80 * - SCF/CCF X/Y flags is ((flags | A) & 0x28) on SGS/SHARP/ZiLOG NMOS Z80, * (flags & A & 0x28) on NEC NMOS Z80, other models unknown. * However, people from the Speccy scene mention that SCF/CCF X/Y results * are inconsistant and may be influenced by I and R registers. * This Z80 emulator assumes a ZiLOG NMOS model. * * Additional changes [Eke-Eke]: * - Removed z80_burn function (unused) * - Discarded multi-chip support (unused) * - Fixed cycle counting for FD and DD prefixed instructions * - Fixed behavior of chained FD and DD prefixes (R register should be only incremented by one * - Implemented cycle-accurate INI/IND (needed by SMS emulation) * - Fixed Z80 reset * - Made SZHVC_add & SZHVC_sub tables statically allocated * Changes in 3.9: * - Fixed cycle counts for LD IYL/IXL/IYH/IXH,n [Marshmellow] * - Fixed X/Y flags in CCF/SCF/BIT, ZEXALL is happy now [hap] * - Simplified DAA, renamed MEMPTR (3.8) to WZ, added TODO [hap] * - Fixed IM2 interrupt cycles [eke] * Changes in 3.8 [Miodrag Milanovic]: * - Added MEMPTR register (according to informations provided * by Vladimir Kladov * - BIT n,(HL) now return valid values due to use of MEMPTR * - Fixed BIT 6,(XY+o) undocumented instructions * Changes in 3.7 [Aaron Giles]: * - Changed NMI handling. NMIs are now latched in set_irq_state * but are not taken there. Instead they are taken at the start of the * execute loop. * - Changed IRQ handling. IRQ state is set in set_irq_state but not taken * except during the inner execute loop. * - Removed x86 assembly hacks and obsolete timing loop catchers. * Changes in 3.6: * - Got rid of the code that would inexactly emulate a Z80, i.e. removed * all the #if Z80_EXACT #else branches. * - Removed leading underscores from local register name shortcuts as * this violates the C99 standard. * - Renamed the registers inside the Z80 context to lower case to avoid * ambiguities (shortcuts would have had the same names as the fields * of the structure). * Changes in 3.5: * - Implemented OTIR, INIR, etc. without look-up table for PF flag. * [Ramsoft, Sean Young] * Changes in 3.4: * - Removed Z80-MSX specific code as it's not needed any more. * - Implemented DAA without look-up table [Ramsoft, Sean Young] * Changes in 3.3: * - Fixed undocumented flags XF & YF in the non-asm versions of CP, * and all the 16 bit arithmetic instructions. [Sean Young] * Changes in 3.2: * - Fixed undocumented flags XF & YF of RRCA, and CF and HF of * INI/IND/OUTI/OUTD/INIR/INDR/OTIR/OTDR [Sean Young] * Changes in 3.1: * - removed the REPEAT_AT_ONCE execution of LDIR/CPIR etc. opcodes * for readabilities sake and because the implementation was buggy * (and I was not able to find the difference) * Changes in 3.0: * - 'finished' switch to dynamically overrideable cycle count tables * Changes in 2.9: * - added methods to access and override the cycle count tables * - fixed handling and timing of multiple DD/FD prefixed opcodes * Changes in 2.8: * - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now. * This was wrong because of a bug fix on the wrong side * (astrocade sound driver). * Changes in 2.7: * - removed z80_vm specific code, it's not needed (and never was). * Changes in 2.6: * - BUSY_LOOP_HACKS needed to call change_pc() earlier, before * checking the opcodes at the new address, because otherwise they * might access the old (wrong or even NULL) banked memory region. * Thanks to Sean Young for finding this nasty bug. * Changes in 2.5: * - Burning cycles always adjusts the ICount by a multiple of 4. * - In REPEAT_AT_ONCE cases the R register wasn't incremented twice * per repetition as it should have been. Those repeated opcodes * could also underflow the ICount. * - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL * timing loops. I think those hacks weren't endian safe before too. * Changes in 2.4: * - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and * sets the Z flag. With these changes the Tehkan World Cup driver * _seems_ to work again. * Changes in 2.3: * - External termination of the execution loop calls z80_burn() and * z80_vm_burn() to burn an amount of cycles (R adjustment) * - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS) * now also adjust the R register depending on the skipped opcodes. * Changes in 2.2: * - Fixed bugs in CPL, SCF and CCF instructions flag handling. * - Changed variable EA and ARG16() function to UINT32; this * produces slightly more efficient code. * - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E * are changed to calls to the X6/XE opcodes to reduce object size. * They're hardly ever used so this should not yield a speed penalty. * New in 2.0: * - Optional more exact Z80 emulation (#define Z80_EXACT 1) according * to a detailed description by Sean Young which can be found at: * http://www.msxnet.org/tech/z80-documented.pdf *****************************************************************************/ #include "shared.h" #include "z80.h" /* execute main opcodes inside a big switch statement */ #define BIG_SWITCH 1 #define VERBOSE 0 #if VERBOSE #define LOG(x) logerror x #else #define LOG(x) #endif #define cpu_readop(a) z80_readmap[(a) >> 10][(a) & 0x03FF] #define cpu_readop_arg(a) z80_readmap[(a) >> 10][(a) & 0x03FF] #define CF 0x01 #define NF 0x02 #define PF 0x04 #define VF PF #define XF 0x08 #define HF 0x10 #define YF 0x20 #define ZF 0x40 #define SF 0x80 #define INT_IRQ 0x01 #define NMI_IRQ 0x02 #define PCD Z80.pc.d #define PC Z80.pc.w.l #define SPD Z80.sp.d #define SP Z80.sp.w.l #define AFD Z80.af.d #define AF Z80.af.w.l #define A Z80.af.b.h #define F Z80.af.b.l #define BCD Z80.bc.d #define BC Z80.bc.w.l #define B Z80.bc.b.h #define C Z80.bc.b.l #define DED Z80.de.d #define DE Z80.de.w.l #define D Z80.de.b.h #define E Z80.de.b.l #define HLD Z80.hl.d #define HL Z80.hl.w.l #define H Z80.hl.b.h #define L Z80.hl.b.l #define IXD Z80.ix.d #define IX Z80.ix.w.l #define HX Z80.ix.b.h #define LX Z80.ix.b.l #define IYD Z80.iy.d #define IY Z80.iy.w.l #define HY Z80.iy.b.h #define LY Z80.iy.b.l #define WZ Z80.wz.w.l #define WZ_H Z80.wz.b.h #define WZ_L Z80.wz.b.l #define I Z80.i #define R Z80.r #define R2 Z80.r2 #define IM Z80.im #define IFF1 Z80.iff1 #define IFF2 Z80.iff2 #define HALT Z80.halt Z80_Regs Z80; unsigned char *z80_readmap[64]; unsigned char *z80_writemap[64]; void (*z80_writemem)(unsigned int address, unsigned char data); unsigned char (*z80_readmem)(unsigned int address); void (*z80_writeport)(unsigned int port, unsigned char data); unsigned char (*z80_readport)(unsigned int port); static UINT32 EA; static UINT8 SZ[256]; /* zero and sign flags */ static UINT8 SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */ static UINT8 SZP[256]; /* zero, sign and parity flags */ static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */ static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */ static UINT8 SZHVC_add[2*256*256]; /* flags for ADD opcode */ static UINT8 SZHVC_sub[2*256*256]; /* flags for SUB opcode */ static const UINT16 cc_op[0x100] = { 4*15,10*15, 7*15, 6*15, 4*15, 4*15, 7*15, 4*15, 4*15,11*15, 7*15, 6*15, 4*15, 4*15, 7*15, 4*15, 8*15,10*15, 7*15, 6*15, 4*15, 4*15, 7*15, 4*15,12*15,11*15, 7*15, 6*15, 4*15, 4*15, 7*15, 4*15, 7*15,10*15,16*15, 6*15, 4*15, 4*15, 7*15, 4*15, 7*15,11*15,16*15, 6*15, 4*15, 4*15, 7*15, 4*15, 7*15,10*15,13*15, 6*15,11*15,11*15,10*15, 4*15, 7*15,11*15,13*15, 6*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 7*15, 7*15, 7*15, 7*15, 7*15, 7*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 7*15, 4*15, 5*15,10*15,10*15,10*15,10*15,11*15, 7*15,11*15, 5*15,10*15,10*15, 0*15,10*15,17*15, 7*15,11*15, 5*15,10*15,10*15,11*15,10*15,11*15, 7*15,11*15, 5*15, 4*15,10*15,11*15,10*15, 0*15, 7*15,11*15, 5*15,10*15,10*15,19*15,10*15,11*15, 7*15,11*15, 5*15, 4*15,10*15, 4*15,10*15, 0*15, 7*15,11*15, 5*15,10*15,10*15, 4*15,10*15,11*15, 7*15,11*15, 5*15, 6*15,10*15, 4*15,10*15, 0*15, 7*15,11*15}; static const UINT16 cc_cb[0x100] = { 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,12*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15,15*15, 8*15}; static const UINT16 cc_ed[0x100] = { 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 9*15,12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 9*15, 12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 9*15,12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 9*15, 12*15,12*15,15*15,20*15, 8*15,14*15, 8*15,18*15,12*15,12*15,15*15,20*15, 8*15,14*15, 8*15,18*15, 12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 8*15,12*15,12*15,15*15,20*15, 8*15,14*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 16*15,16*15,16*15,16*15, 8*15, 8*15, 8*15, 8*15,16*15,16*15,16*15,16*15, 8*15, 8*15, 8*15, 8*15, 16*15,16*15,16*15,16*15, 8*15, 8*15, 8*15, 8*15,16*15,16*15,16*15,16*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15, 8*15}; /*static const UINT8 cc_xy[0x100] = { 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15,15*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15,15*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15,14*15,20*15,10*15, 9*15, 9*15,11*15, 4*15, 4*15,15*15,20*15,10*15, 9*15, 9*15,11*15, 4*15, 4*15, 4*15, 4*15, 4*15,23*15,23*15,19*15, 4*15, 4*15,15*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15,19*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15,19*15, 9*15, 19*15,19*15,19*15,19*15,19*15,19*15, 4*15,19*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 9*15, 9*15,19*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 0*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15,14*15, 4*15,23*15, 4*15,15*15, 4*15, 4*15, 4*15, 8*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15,10*15, 4*15, 4*15, 4*15, 4*15, 4*15, 4*15}; */ /* illegal combo should return 4 + cc_op[i] */ static const UINT16 cc_xy[0x100] ={ 8*15,14*15,11*15,10*15, 8*15, 8*15,11*15, 8*15, 8*15,15*15,11*15,10*15, 8*15, 8*15,11*15, 8*15, 12*15,14*15,11*15,10*15, 8*15, 8*15,11*15, 8*15,16*15,15*15,11*15,10*15, 8*15, 8*15,11*15, 8*15, 11*15,14*15,20*15,10*15, 9*15, 9*15,12*15, 8*15,11*15,15*15,20*15,10*15, 9*15, 9*15,12*15, 8*15, 11*15,14*15,17*15,10*15,23*15,23*15,19*15, 8*15,11*15,15*15,17*15,10*15, 8*15, 8*15,11*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15,19*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15, 9*15,19*15, 9*15, 19*15,19*15,19*15,19*15,19*15,19*15, 8*15,19*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 8*15, 8*15, 8*15, 8*15, 9*15, 9*15,19*15, 8*15, 9*15,14*15,14*15,14*15,14*15,15*15,11*15,15*15, 9*15,14*15,14*15, 0*15,14*15,21*15,11*15,15*15, 9*15,14*15,14*15,15*15,14*15,15*15,11*15,15*15, 9*15, 8*15,14*15,15*15,14*15, 4*15,11*15,15*15, 9*15,14*15,14*15,23*15,14*15,15*15,11*15,15*15, 9*15, 8*15,14*15, 8*15,14*15, 4*15,11*15,15*15, 9*15,14*15,14*15, 8*15,14*15,15*15,11*15,15*15, 9*15,10*15,14*15, 8*15,14*15, 4*15,11*15,15*15}; static const UINT16 cc_xycb[0x100] = { 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15, 20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15, 20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15, 20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15,20*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15, 23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15,23*15}; /* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */ static const UINT16 cc_ex[0x100] = { 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 5*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, /* DJNZ */ 5*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 5*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, /* JR NZ/JR Z */ 5*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 5*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, /* JR NC/JR C */ 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 4*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 0*15, 4*15, 0*15, 0*15, 0*15, 0*15, 0*15, /* INI/IND (cycle-accurate I/O port reads) */ 5*15, 5*15, 5*15, 5*15, 0*15, 0*15, 0*15, 0*15, 5*15, 5*15, 5*15, 5*15, 0*15, 0*15, 0*15, 0*15, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */ 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15, 6*15, 0*15, 0*15, 0*15, 7*15, 0*15, 0*15, 2*15}; static const UINT16 *cc[6]; #define Z80_TABLE_dd Z80_TABLE_xy #define Z80_TABLE_fd Z80_TABLE_xy typedef void (*funcptr)(void); #define PROTOTYPES(tablename,prefix) \ INLINE void prefix##_00(void); INLINE void prefix##_01(void); INLINE void prefix##_02(void); INLINE void prefix##_03(void); \ INLINE void prefix##_04(void); INLINE void prefix##_05(void); INLINE void prefix##_06(void); INLINE void prefix##_07(void); \ INLINE void prefix##_08(void); INLINE void prefix##_09(void); INLINE void prefix##_0a(void); INLINE void prefix##_0b(void); \ INLINE void prefix##_0c(void); INLINE void prefix##_0d(void); INLINE void prefix##_0e(void); INLINE void prefix##_0f(void); \ INLINE void prefix##_10(void); INLINE void prefix##_11(void); INLINE void prefix##_12(void); INLINE void prefix##_13(void); \ INLINE void prefix##_14(void); INLINE void prefix##_15(void); INLINE void prefix##_16(void); INLINE void prefix##_17(void); \ INLINE void prefix##_18(void); INLINE void prefix##_19(void); INLINE void prefix##_1a(void); INLINE void prefix##_1b(void); \ INLINE void prefix##_1c(void); INLINE void prefix##_1d(void); INLINE void prefix##_1e(void); INLINE void prefix##_1f(void); \ INLINE void prefix##_20(void); INLINE void prefix##_21(void); INLINE void prefix##_22(void); INLINE void prefix##_23(void); \ INLINE void prefix##_24(void); INLINE void prefix##_25(void); INLINE void prefix##_26(void); INLINE void prefix##_27(void); \ INLINE void prefix##_28(void); INLINE void prefix##_29(void); INLINE void prefix##_2a(void); INLINE void prefix##_2b(void); \ INLINE void prefix##_2c(void); INLINE void prefix##_2d(void); INLINE void prefix##_2e(void); INLINE void prefix##_2f(void); \ INLINE void prefix##_30(void); INLINE void prefix##_31(void); INLINE void prefix##_32(void); INLINE void prefix##_33(void); \ INLINE void prefix##_34(void); INLINE void prefix##_35(void); INLINE void prefix##_36(void); INLINE void prefix##_37(void); \ INLINE void prefix##_38(void); INLINE void prefix##_39(void); INLINE void prefix##_3a(void); INLINE void prefix##_3b(void); \ INLINE void prefix##_3c(void); INLINE void prefix##_3d(void); INLINE void prefix##_3e(void); INLINE void prefix##_3f(void); \ INLINE void prefix##_40(void); INLINE void prefix##_41(void); INLINE void prefix##_42(void); INLINE void prefix##_43(void); \ INLINE void prefix##_44(void); INLINE void prefix##_45(void); INLINE void prefix##_46(void); INLINE void prefix##_47(void); \ INLINE void prefix##_48(void); INLINE void prefix##_49(void); INLINE void prefix##_4a(void); INLINE void prefix##_4b(void); \ INLINE void prefix##_4c(void); INLINE void prefix##_4d(void); INLINE void prefix##_4e(void); INLINE void prefix##_4f(void); \ INLINE void prefix##_50(void); INLINE void prefix##_51(void); INLINE void prefix##_52(void); INLINE void prefix##_53(void); \ INLINE void prefix##_54(void); INLINE void prefix##_55(void); INLINE void prefix##_56(void); INLINE void prefix##_57(void); \ INLINE void prefix##_58(void); INLINE void prefix##_59(void); INLINE void prefix##_5a(void); INLINE void prefix##_5b(void); \ INLINE void prefix##_5c(void); INLINE void prefix##_5d(void); INLINE void prefix##_5e(void); INLINE void prefix##_5f(void); \ INLINE void prefix##_60(void); INLINE void prefix##_61(void); INLINE void prefix##_62(void); INLINE void prefix##_63(void); \ INLINE void prefix##_64(void); INLINE void prefix##_65(void); INLINE void prefix##_66(void); INLINE void prefix##_67(void); \ INLINE void prefix##_68(void); INLINE void prefix##_69(void); INLINE void prefix##_6a(void); INLINE void prefix##_6b(void); \ INLINE void prefix##_6c(void); INLINE void prefix##_6d(void); INLINE void prefix##_6e(void); INLINE void prefix##_6f(void); \ INLINE void prefix##_70(void); INLINE void prefix##_71(void); INLINE void prefix##_72(void); INLINE void prefix##_73(void); \ INLINE void prefix##_74(void); INLINE void prefix##_75(void); INLINE void prefix##_76(void); INLINE void prefix##_77(void); \ INLINE void prefix##_78(void); INLINE void prefix##_79(void); INLINE void prefix##_7a(void); INLINE void prefix##_7b(void); \ INLINE void prefix##_7c(void); INLINE void prefix##_7d(void); INLINE void prefix##_7e(void); INLINE void prefix##_7f(void); \ INLINE void prefix##_80(void); INLINE void prefix##_81(void); INLINE void prefix##_82(void); INLINE void prefix##_83(void); \ INLINE void prefix##_84(void); INLINE void prefix##_85(void); INLINE void prefix##_86(void); INLINE void prefix##_87(void); \ INLINE void prefix##_88(void); INLINE void prefix##_89(void); INLINE void prefix##_8a(void); INLINE void prefix##_8b(void); \ INLINE void prefix##_8c(void); INLINE void prefix##_8d(void); INLINE void prefix##_8e(void); INLINE void prefix##_8f(void); \ INLINE void prefix##_90(void); INLINE void prefix##_91(void); INLINE void prefix##_92(void); INLINE void prefix##_93(void); \ INLINE void prefix##_94(void); INLINE void prefix##_95(void); INLINE void prefix##_96(void); INLINE void prefix##_97(void); \ INLINE void prefix##_98(void); INLINE void prefix##_99(void); INLINE void prefix##_9a(void); INLINE void prefix##_9b(void); \ INLINE void prefix##_9c(void); INLINE void prefix##_9d(void); INLINE void prefix##_9e(void); INLINE void prefix##_9f(void); \ INLINE void prefix##_a0(void); INLINE void prefix##_a1(void); INLINE void prefix##_a2(void); INLINE void prefix##_a3(void); \ INLINE void prefix##_a4(void); INLINE void prefix##_a5(void); INLINE void prefix##_a6(void); INLINE void prefix##_a7(void); \ INLINE void prefix##_a8(void); INLINE void prefix##_a9(void); INLINE void prefix##_aa(void); INLINE void prefix##_ab(void); \ INLINE void prefix##_ac(void); INLINE void prefix##_ad(void); INLINE void prefix##_ae(void); INLINE void prefix##_af(void); \ INLINE void prefix##_b0(void); INLINE void prefix##_b1(void); INLINE void prefix##_b2(void); INLINE void prefix##_b3(void); \ INLINE void prefix##_b4(void); INLINE void prefix##_b5(void); INLINE void prefix##_b6(void); INLINE void prefix##_b7(void); \ INLINE void prefix##_b8(void); INLINE void prefix##_b9(void); INLINE void prefix##_ba(void); INLINE void prefix##_bb(void); \ INLINE void prefix##_bc(void); INLINE void prefix##_bd(void); INLINE void prefix##_be(void); INLINE void prefix##_bf(void); \ INLINE void prefix##_c0(void); INLINE void prefix##_c1(void); INLINE void prefix##_c2(void); INLINE void prefix##_c3(void); \ INLINE void prefix##_c4(void); INLINE void prefix##_c5(void); INLINE void prefix##_c6(void); INLINE void prefix##_c7(void); \ INLINE void prefix##_c8(void); INLINE void prefix##_c9(void); INLINE void prefix##_ca(void); INLINE void prefix##_cb(void); \ INLINE void prefix##_cc(void); INLINE void prefix##_cd(void); INLINE void prefix##_ce(void); INLINE void prefix##_cf(void); \ INLINE void prefix##_d0(void); INLINE void prefix##_d1(void); INLINE void prefix##_d2(void); INLINE void prefix##_d3(void); \ INLINE void prefix##_d4(void); INLINE void prefix##_d5(void); INLINE void prefix##_d6(void); INLINE void prefix##_d7(void); \ INLINE void prefix##_d8(void); INLINE void prefix##_d9(void); INLINE void prefix##_da(void); INLINE void prefix##_db(void); \ INLINE void prefix##_dc(void); INLINE void prefix##_dd(void); INLINE void prefix##_de(void); INLINE void prefix##_df(void); \ INLINE void prefix##_e0(void); INLINE void prefix##_e1(void); INLINE void prefix##_e2(void); INLINE void prefix##_e3(void); \ INLINE void prefix##_e4(void); INLINE void prefix##_e5(void); INLINE void prefix##_e6(void); INLINE void prefix##_e7(void); \ INLINE void prefix##_e8(void); INLINE void prefix##_e9(void); INLINE void prefix##_ea(void); INLINE void prefix##_eb(void); \ INLINE void prefix##_ec(void); INLINE void prefix##_ed(void); INLINE void prefix##_ee(void); INLINE void prefix##_ef(void); \ INLINE void prefix##_f0(void); INLINE void prefix##_f1(void); INLINE void prefix##_f2(void); INLINE void prefix##_f3(void); \ INLINE void prefix##_f4(void); INLINE void prefix##_f5(void); INLINE void prefix##_f6(void); INLINE void prefix##_f7(void); \ INLINE void prefix##_f8(void); INLINE void prefix##_f9(void); INLINE void prefix##_fa(void); INLINE void prefix##_fb(void); \ INLINE void prefix##_fc(void); INLINE void prefix##_fd(void); INLINE void prefix##_fe(void); INLINE void prefix##_ff(void); \ static const funcptr tablename[0x100] = { \ prefix##_00,prefix##_01,prefix##_02,prefix##_03,prefix##_04,prefix##_05,prefix##_06,prefix##_07, \ prefix##_08,prefix##_09,prefix##_0a,prefix##_0b,prefix##_0c,prefix##_0d,prefix##_0e,prefix##_0f, \ prefix##_10,prefix##_11,prefix##_12,prefix##_13,prefix##_14,prefix##_15,prefix##_16,prefix##_17, \ prefix##_18,prefix##_19,prefix##_1a,prefix##_1b,prefix##_1c,prefix##_1d,prefix##_1e,prefix##_1f, \ prefix##_20,prefix##_21,prefix##_22,prefix##_23,prefix##_24,prefix##_25,prefix##_26,prefix##_27, \ prefix##_28,prefix##_29,prefix##_2a,prefix##_2b,prefix##_2c,prefix##_2d,prefix##_2e,prefix##_2f, \ prefix##_30,prefix##_31,prefix##_32,prefix##_33,prefix##_34,prefix##_35,prefix##_36,prefix##_37, \ prefix##_38,prefix##_39,prefix##_3a,prefix##_3b,prefix##_3c,prefix##_3d,prefix##_3e,prefix##_3f, \ prefix##_40,prefix##_41,prefix##_42,prefix##_43,prefix##_44,prefix##_45,prefix##_46,prefix##_47, \ prefix##_48,prefix##_49,prefix##_4a,prefix##_4b,prefix##_4c,prefix##_4d,prefix##_4e,prefix##_4f, \ prefix##_50,prefix##_51,prefix##_52,prefix##_53,prefix##_54,prefix##_55,prefix##_56,prefix##_57, \ prefix##_58,prefix##_59,prefix##_5a,prefix##_5b,prefix##_5c,prefix##_5d,prefix##_5e,prefix##_5f, \ prefix##_60,prefix##_61,prefix##_62,prefix##_63,prefix##_64,prefix##_65,prefix##_66,prefix##_67, \ prefix##_68,prefix##_69,prefix##_6a,prefix##_6b,prefix##_6c,prefix##_6d,prefix##_6e,prefix##_6f, \ prefix##_70,prefix##_71,prefix##_72,prefix##_73,prefix##_74,prefix##_75,prefix##_76,prefix##_77, \ prefix##_78,prefix##_79,prefix##_7a,prefix##_7b,prefix##_7c,prefix##_7d,prefix##_7e,prefix##_7f, \ prefix##_80,prefix##_81,prefix##_82,prefix##_83,prefix##_84,prefix##_85,prefix##_86,prefix##_87, \ prefix##_88,prefix##_89,prefix##_8a,prefix##_8b,prefix##_8c,prefix##_8d,prefix##_8e,prefix##_8f, \ prefix##_90,prefix##_91,prefix##_92,prefix##_93,prefix##_94,prefix##_95,prefix##_96,prefix##_97, \ prefix##_98,prefix##_99,prefix##_9a,prefix##_9b,prefix##_9c,prefix##_9d,prefix##_9e,prefix##_9f, \ prefix##_a0,prefix##_a1,prefix##_a2,prefix##_a3,prefix##_a4,prefix##_a5,prefix##_a6,prefix##_a7, \ prefix##_a8,prefix##_a9,prefix##_aa,prefix##_ab,prefix##_ac,prefix##_ad,prefix##_ae,prefix##_af, \ prefix##_b0,prefix##_b1,prefix##_b2,prefix##_b3,prefix##_b4,prefix##_b5,prefix##_b6,prefix##_b7, \ prefix##_b8,prefix##_b9,prefix##_ba,prefix##_bb,prefix##_bc,prefix##_bd,prefix##_be,prefix##_bf, \ prefix##_c0,prefix##_c1,prefix##_c2,prefix##_c3,prefix##_c4,prefix##_c5,prefix##_c6,prefix##_c7, \ prefix##_c8,prefix##_c9,prefix##_ca,prefix##_cb,prefix##_cc,prefix##_cd,prefix##_ce,prefix##_cf, \ prefix##_d0,prefix##_d1,prefix##_d2,prefix##_d3,prefix##_d4,prefix##_d5,prefix##_d6,prefix##_d7, \ prefix##_d8,prefix##_d9,prefix##_da,prefix##_db,prefix##_dc,prefix##_dd,prefix##_de,prefix##_df, \ prefix##_e0,prefix##_e1,prefix##_e2,prefix##_e3,prefix##_e4,prefix##_e5,prefix##_e6,prefix##_e7, \ prefix##_e8,prefix##_e9,prefix##_ea,prefix##_eb,prefix##_ec,prefix##_ed,prefix##_ee,prefix##_ef, \ prefix##_f0,prefix##_f1,prefix##_f2,prefix##_f3,prefix##_f4,prefix##_f5,prefix##_f6,prefix##_f7, \ prefix##_f8,prefix##_f9,prefix##_fa,prefix##_fb,prefix##_fc,prefix##_fd,prefix##_fe,prefix##_ff \ } PROTOTYPES(Z80op,op); PROTOTYPES(Z80cb,cb); PROTOTYPES(Z80dd,dd); PROTOTYPES(Z80ed,ed); PROTOTYPES(Z80fd,fd); PROTOTYPES(Z80xycb,xycb); /****************************************************************************/ /* Burn an odd amount of cycles, that is instructions taking something */ /* different from 4 T-states per opcode (and R increment) */ /****************************************************************************/ INLINE void BURNODD(int cycles, int opcodes, int cyclesum) { if( cycles > 0 ) { R += (cycles / cyclesum) * opcodes; Z80.cycles += (cycles / cyclesum) * cyclesum * 15; } } /*************************************************************** * define an opcode function ***************************************************************/ #define OP(prefix,opcode) INLINE void prefix##_##opcode(void) /*************************************************************** * adjust cycle count by n T-states ***************************************************************/ #define CC(prefix,opcode) Z80.cycles += cc[Z80_TABLE_##prefix][opcode] /*************************************************************** * execute an opcode ***************************************************************/ #define EXEC(prefix,opcode) \ { \ unsigned op = opcode; \ CC(prefix,op); \ (*Z80##prefix[op])(); \ } #if BIG_SWITCH #define EXEC_INLINE(prefix,opcode) \ { \ unsigned op = opcode; \ CC(prefix,op); \ switch(op) \ { \ case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \ case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \ case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \ case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \ case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \ case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \ case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \ case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \ case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \ case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \ case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \ case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \ case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \ case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \ case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \ case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \ case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \ case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \ case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \ case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \ case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \ case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \ case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \ case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \ case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \ case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \ case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \ case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \ case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \ case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \ case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \ case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \ case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \ case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \ case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \ case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \ case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \ case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \ case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \ case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \ case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \ case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \ case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \ case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \ case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \ case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \ case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \ case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \ case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \ case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \ case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \ case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \ case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \ case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \ case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \ case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \ case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \ case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \ case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \ case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \ case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \ case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \ case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \ case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \ } \ } #else #define EXEC_INLINE EXEC #endif /*************************************************************** * Enter HALT state; write 1 to fake port on first execution ***************************************************************/ #define ENTER_HALT { \ PC--; \ HALT = 1; \ } /*************************************************************** * Leave HALT state; write 0 to fake port ***************************************************************/ #define LEAVE_HALT { \ if( HALT ) \ { \ HALT = 0; \ PC++; \ } \ } /*************************************************************** * Input a byte from given I/O port ***************************************************************/ #define IN(port) z80_readport(port) /*************************************************************** * Output a byte to given I/O port ***************************************************************/ #define OUT(port,value) z80_writeport(port,value) /*************************************************************** * Read a byte from given memory location ***************************************************************/ #define RM(addr) z80_readmem(addr) /*************************************************************** * Write a byte to given memory location ***************************************************************/ #define WM(addr,value) z80_writemem(addr,value) /*************************************************************** * Read a word from given memory location ***************************************************************/ INLINE void RM16( UINT32 addr, PAIR *r ) { r->b.l = RM(addr); r->b.h = RM((addr+1)&0xffff); } /*************************************************************** * Write a word to given memory location ***************************************************************/ INLINE void WM16( UINT32 addr, PAIR *r ) { WM(addr,r->b.l); WM((addr+1)&0xffff,r->b.h); } /*************************************************************** * ROP() is identical to RM() except it is used for * reading opcodes. In case of system with memory mapped I/O, * this function can be used to greatly speed up emulation ***************************************************************/ INLINE UINT8 ROP(void) { unsigned pc = PCD; PC++; return cpu_readop(pc); } /**************************************************************** * ARG() is identical to ROP() except it is used * for reading opcode arguments. This difference can be used to * support systems that use different encoding mechanisms for * opcodes and opcode arguments ***************************************************************/ INLINE UINT8 ARG(void) { unsigned pc = PCD; PC++; return cpu_readop_arg(pc); } INLINE UINT32 ARG16(void) { unsigned pc = PCD; PC += 2; return cpu_readop_arg(pc) | (cpu_readop_arg((pc+1)&0xffff) << 8); } /*************************************************************** * Calculate the effective address EA of an opcode using * IX+offset resp. IY+offset addressing. ***************************************************************/ #define EAX do { EA = (UINT32)(UINT16)(IX + (INT8)ARG()); WZ = EA; } while (0) #define EAY do { EA = (UINT32)(UINT16)(IY + (INT8)ARG()); WZ = EA; } while (0) /*************************************************************** * POP ***************************************************************/ #define POP(DR) do { RM16( SPD, &Z80.DR ); SP += 2; } while (0) /*************************************************************** * PUSH ***************************************************************/ #define PUSH(SR) do { SP -= 2; WM16( SPD, &Z80.SR ); } while (0) /*************************************************************** * JP ***************************************************************/ #define JP { \ PCD = ARG16(); \ WZ = PCD; \ } /*************************************************************** * JP_COND ***************************************************************/ #define JP_COND(cond) { \ if (cond) \ { \ PCD = ARG16(); \ WZ = PCD; \ } \ else \ { \ WZ = ARG16(); /* implicit do PC += 2 */ \ } \ } /*************************************************************** * JR ***************************************************************/ #define JR() { \ INT8 arg = (INT8)ARG(); /* ARG() also increments PC */ \ PC += arg; /* so don't do PC += ARG() */ \ WZ = PC; \ } /*************************************************************** * JR_COND ***************************************************************/ #define JR_COND(cond, opcode) { \ if (cond) \ { \ JR(); \ CC(ex, opcode); \ } \ else PC++; \ } /*************************************************************** * CALL ***************************************************************/ #define CALL() { \ EA = ARG16(); \ WZ = EA; \ PUSH(pc); \ PCD = EA; \ } /*************************************************************** * CALL_COND ***************************************************************/ #define CALL_COND(cond, opcode) { \ if (cond) \ { \ EA = ARG16(); \ WZ = EA; \ PUSH(pc); \ PCD = EA; \ CC(ex, opcode); \ } \ else \ { \ WZ = ARG16(); /* implicit call PC+=2; */ \ } \ } /*************************************************************** * RET_COND ***************************************************************/ #define RET_COND(cond, opcode) do { \ if (cond) \ { \ POP(pc); \ WZ = PC; \ CC(ex, opcode); \ } \ } while (0) /*************************************************************** * RETN ***************************************************************/ #define RETN do { \ LOG(("Z80 #%d RETN IFF1:%d IFF2:%d\n", cpu_getactivecpu(), IFF1, IFF2)); \ POP( pc ); \ WZ = PC; \ IFF1 = IFF2; \ } while (0) /*************************************************************** * RETI ***************************************************************/ #define RETI { \ POP( pc ); \ WZ = PC; \ /* according to http://www.msxnet.org/tech/z80-documented.pdf */ \ IFF1 = IFF2; \ } /*************************************************************** * LD R,A ***************************************************************/ #define LD_R_A { \ R = A; \ R2 = A & 0x80; /* keep bit 7 of R */ \ } /*************************************************************** * LD A,R ***************************************************************/ #define LD_A_R { \ A = (R & 0x7f) | R2; \ F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \ } /*************************************************************** * LD I,A ***************************************************************/ #define LD_I_A { \ I = A; \ } /*************************************************************** * LD A,I ***************************************************************/ #define LD_A_I { \ A = I; \ F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \ } /*************************************************************** * RST ***************************************************************/ #define RST(addr) \ PUSH( pc ); \ PCD = addr; \ WZ = PC; \ /*************************************************************** * INC r8 ***************************************************************/ INLINE UINT8 INC(UINT8 value) { UINT8 res = value + 1; F = (F & CF) | SZHV_inc[res]; return (UINT8)res; } /*************************************************************** * DEC r8 ***************************************************************/ INLINE UINT8 DEC(UINT8 value) { UINT8 res = value - 1; F = (F & CF) | SZHV_dec[res]; return res; } /*************************************************************** * RLCA ***************************************************************/ #define RLCA \ A = (A << 1) | (A >> 7); \ F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF)) /*************************************************************** * RRCA ***************************************************************/ #define RRCA \ F = (F & (SF | ZF | PF)) | (A & CF); \ A = (A >> 1) | (A << 7); \ F |= (A & (YF | XF) ) /*************************************************************** * RLA ***************************************************************/ #define RLA { \ UINT8 res = (A << 1) | (F & CF); \ UINT8 c = (A & 0x80) ? CF : 0; \ F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ A = res; \ } /*************************************************************** * RRA ***************************************************************/ #define RRA { \ UINT8 res = (A >> 1) | (F << 7); \ UINT8 c = (A & 0x01) ? CF : 0; \ F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \ A = res; \ } /*************************************************************** * RRD ***************************************************************/ #define RRD { \ UINT8 n = RM(HL); \ WZ = HL+1; \ WM( HL, (n >> 4) | (A << 4) ); \ A = (A & 0xf0) | (n & 0x0f); \ F = (F & CF) | SZP[A]; \ } /*************************************************************** * RLD ***************************************************************/ #define RLD { \ UINT8 n = RM(HL); \ WZ = HL+1; \ WM( HL, (n << 4) | (A & 0x0f) ); \ A = (A & 0xf0) | (n >> 4); \ F = (F & CF) | SZP[A]; \ } /*************************************************************** * ADD A,n ***************************************************************/ #define ADD(value) \ { \ UINT32 ah = AFD & 0xff00; \ UINT32 res = (UINT8)((ah >> 8) + value); \ F = SZHVC_add[ah | res]; \ A = res; \ } /*************************************************************** * ADC A,n ***************************************************************/ #define ADC(value) \ { \ UINT32 ah = AFD & 0xff00, c = AFD & 1; \ UINT32 res = (UINT8)((ah >> 8) + value + c); \ F = SZHVC_add[(c << 16) | ah | res]; \ A = res; \ } /*************************************************************** * SUB n ***************************************************************/ #define SUB(value) \ { \ UINT32 ah = AFD & 0xff00; \ UINT32 res = (UINT8)((ah >> 8) - value); \ F = SZHVC_sub[ah | res]; \ A = res; \ } /*************************************************************** * SBC A,n ***************************************************************/ #define SBC(value) \ { \ UINT32 ah = AFD & 0xff00, c = AFD & 1; \ UINT32 res = (UINT8)((ah >> 8) - value - c); \ F = SZHVC_sub[(c<<16) | ah | res]; \ A = res; \ } /*************************************************************** * NEG ***************************************************************/ #define NEG { \ UINT8 value = A; \ A = 0; \ SUB(value); \ } /*************************************************************** * DAA ***************************************************************/ #define DAA { \ UINT8 a = A; \ if (F & NF) { \ if ((F&HF) | ((A&0xf)>9)) a-=6; \ if ((F&CF) | (A>0x99)) a-=0x60; \ } \ else { \ if ((F&HF) | ((A&0xf)>9)) a+=6; \ if ((F&CF) | (A>0x99)) a+=0x60; \ } \ \ F = (F&(CF|NF)) | (A>0x99) | ((A^a)&HF) | SZP[a]; \ A = a; \ } /*************************************************************** * AND n ***************************************************************/ #define AND(value) \ A &= value; \ F = SZP[A] | HF /*************************************************************** * OR n ***************************************************************/ #define OR(value) \ A |= value; \ F = SZP[A] /*************************************************************** * XOR n ***************************************************************/ #define XOR(value) \ A ^= value; \ F = SZP[A] /*************************************************************** * CP n ***************************************************************/ #define CP(value) \ { \ unsigned val = value; \ UINT32 ah = AFD & 0xff00; \ UINT32 res = (UINT8)((ah >> 8) - val); \ F = (SZHVC_sub[ah | res] & ~(YF | XF)) | (val & (YF | XF)); \ } /*************************************************************** * EX AF,AF' ***************************************************************/ #define EX_AF \ { \ PAIR tmp; \ tmp = Z80.af; Z80.af = Z80.af2; Z80.af2 = tmp; \ } /*************************************************************** * EX DE,HL ***************************************************************/ #define EX_DE_HL \ { \ PAIR tmp; \ tmp = Z80.de; Z80.de = Z80.hl; Z80.hl = tmp; \ } /*************************************************************** * EXX ***************************************************************/ #define EXX \ { \ PAIR tmp; \ tmp = Z80.bc; Z80.bc = Z80.bc2; Z80.bc2 = tmp; \ tmp = Z80.de; Z80.de = Z80.de2; Z80.de2 = tmp; \ tmp = Z80.hl; Z80.hl = Z80.hl2; Z80.hl2 = tmp; \ } /*************************************************************** * EX (SP),r16 ***************************************************************/ #define EXSP(DR) \ { \ PAIR tmp = { { 0, 0, 0, 0 } }; \ RM16( SPD, &tmp ); \ WM16( SPD, &Z80.DR ); \ Z80.DR = tmp; \ WZ = Z80.DR.d; \ } /*************************************************************** * ADD16 ***************************************************************/ #define ADD16(DR,SR) \ { \ UINT32 res = Z80.DR.d + Z80.SR.d; \ WZ = Z80.DR.d + 1; \ F = (F & (SF | ZF | VF)) | \ (((Z80.DR.d ^ res ^ Z80.SR.d) >> 8) & HF) | \ ((res >> 16) & CF) | ((res >> 8) & (YF | XF)); \ Z80.DR.w.l = (UINT16)res; \ } /*************************************************************** * ADC r16,r16 ***************************************************************/ #define ADC16(Reg) \ { \ UINT32 res = HLD + Z80.Reg.d + (F & CF); \ WZ = HL + 1; \ F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | \ ((res >> 16) & CF) | \ ((res >> 8) & (SF | YF | XF)) | \ ((res & 0xffff) ? 0 : ZF) | \ (((Z80.Reg.d ^ HLD ^ 0x8000) & (Z80.Reg.d ^ res) & 0x8000) >> 13); \ HL = (UINT16)res; \ } /*************************************************************** * SBC r16,r16 ***************************************************************/ #define SBC16(Reg) \ { \ UINT32 res = HLD - Z80.Reg.d - (F & CF); \ WZ = HL + 1; \ F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | NF | \ ((res >> 16) & CF) | \ ((res >> 8) & (SF | YF | XF)) | \ ((res & 0xffff) ? 0 : ZF) | \ (((Z80.Reg.d ^ HLD) & (HLD ^ res) &0x8000) >> 13); \ HL = (UINT16)res; \ } /*************************************************************** * RLC r8 ***************************************************************/ INLINE UINT8 RLC(UINT8 value) { unsigned res = value; unsigned c = (res & 0x80) ? CF : 0; res = ((res << 1) | (res >> 7)) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * RRC r8 ***************************************************************/ INLINE UINT8 RRC(UINT8 value) { unsigned res = value; unsigned c = (res & 0x01) ? CF : 0; res = ((res >> 1) | (res << 7)) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * RL r8 ***************************************************************/ INLINE UINT8 RL(UINT8 value) { unsigned res = value; unsigned c = (res & 0x80) ? CF : 0; res = ((res << 1) | (F & CF)) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * RR r8 ***************************************************************/ INLINE UINT8 RR(UINT8 value) { unsigned res = value; unsigned c = (res & 0x01) ? CF : 0; res = ((res >> 1) | (F << 7)) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * SLA r8 ***************************************************************/ INLINE UINT8 SLA(UINT8 value) { unsigned res = value; unsigned c = (res & 0x80) ? CF : 0; res = (res << 1) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * SRA r8 ***************************************************************/ INLINE UINT8 SRA(UINT8 value) { unsigned res = value; unsigned c = (res & 0x01) ? CF : 0; res = ((res >> 1) | (res & 0x80)) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * SLL r8 ***************************************************************/ INLINE UINT8 SLL(UINT8 value) { unsigned res = value; unsigned c = (res & 0x80) ? CF : 0; res = ((res << 1) | 0x01) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * SRL r8 ***************************************************************/ INLINE UINT8 SRL(UINT8 value) { unsigned res = value; unsigned c = (res & 0x01) ? CF : 0; res = (res >> 1) & 0xff; F = SZP[res] | c; return res; } /*************************************************************** * BIT bit,r8 ***************************************************************/ #undef BIT #define BIT(bit,reg) \ F = (F & CF) | HF | (SZ_BIT[reg & (1<>8) & (YF|XF)) /*************************************************************** * RES bit,r8 ***************************************************************/ INLINE UINT8 RES(UINT8 bit, UINT8 value) { return value & ~(1< flag 5 */ \ if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ HL++; DE++; BC--; \ if( BC ) F |= VF; \ } /*************************************************************** * CPI ***************************************************************/ #define CPI { \ UINT8 val = RM(HL); \ UINT8 res = A - val; \ WZ++; \ HL++; BC--; \ F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \ if( F & HF ) res -= 1; \ if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ if( BC ) F |= VF; \ } /*************************************************************** * INI ***************************************************************/ #define INI { \ unsigned t; \ UINT8 io = IN(BC); \ WZ = BC + 1; \ CC(ex,0xa2); \ B--; \ WM( HL, io ); \ HL++; \ F = SZ[B]; \ t = (unsigned)((C + 1) & 0xff) + (unsigned)io; \ if( io & SF ) F |= NF; \ if( t & 0x100 ) F |= HF | CF; \ F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ } /*************************************************************** * OUTI ***************************************************************/ #define OUTI { \ unsigned t; \ UINT8 io = RM(HL); \ B--; \ WZ = BC + 1; \ OUT( BC, io ); \ HL++; \ F = SZ[B]; \ t = (unsigned)L + (unsigned)io; \ if( io & SF ) F |= NF; \ if( t & 0x100 ) F |= HF | CF; \ F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ } /*************************************************************** * LDD ***************************************************************/ #define LDD { \ UINT8 io = RM(HL); \ WM( DE, io ); \ F &= SF | ZF | CF; \ if( (A + io) & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ HL--; DE--; BC--; \ if( BC ) F |= VF; \ } /*************************************************************** * CPD ***************************************************************/ #define CPD { \ UINT8 val = RM(HL); \ UINT8 res = A - val; \ WZ--; \ HL--; BC--; \ F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \ if( F & HF ) res -= 1; \ if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \ if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \ if( BC ) F |= VF; \ } /*************************************************************** * IND ***************************************************************/ #define IND { \ unsigned t; \ UINT8 io = IN(BC); \ WZ = BC - 1; \ CC(ex,0xaa); \ B--; \ WM( HL, io ); \ HL--; \ F = SZ[B]; \ t = ((unsigned)(C - 1) & 0xff) + (unsigned)io; \ if( io & SF ) F |= NF; \ if( t & 0x100 ) F |= HF | CF; \ F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ } /*************************************************************** * OUTD ***************************************************************/ #define OUTD { \ unsigned t; \ UINT8 io = RM(HL); \ B--; \ WZ = BC - 1; \ OUT( BC, io ); \ HL--; \ F = SZ[B]; \ t = (unsigned)L + (unsigned)io; \ if( io & SF ) F |= NF; \ if( t & 0x100 ) F |= HF | CF; \ F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \ } /*************************************************************** * LDIR ***************************************************************/ #define LDIR \ LDI; \ if( BC ) \ { \ PC -= 2; \ WZ = PC + 1; \ CC(ex,0xb0); \ } /*************************************************************** * CPIR ***************************************************************/ #define CPIR \ CPI; \ if( BC && !(F & ZF) ) \ { \ PC -= 2; \ WZ = PC + 1; \ CC(ex,0xb1); \ } /*************************************************************** * INIR ***************************************************************/ #define INIR \ INI; \ if( B ) \ { \ PC -= 2; \ CC(ex,0xb2); \ } /*************************************************************** * OTIR ***************************************************************/ #define OTIR \ OUTI; \ if( B ) \ { \ PC -= 2; \ CC(ex,0xb3); \ } /*************************************************************** * LDDR ***************************************************************/ #define LDDR \ LDD; \ if( BC ) \ { \ PC -= 2; \ WZ = PC + 1; \ CC(ex,0xb8); \ } /*************************************************************** * CPDR ***************************************************************/ #define CPDR \ CPD; \ if( BC && !(F & ZF) ) \ { \ PC -= 2; \ WZ = PC + 1; \ CC(ex,0xb9); \ } /*************************************************************** * INDR ***************************************************************/ #define INDR \ IND; \ if( B ) \ { \ PC -= 2; \ CC(ex,0xba); \ } /*************************************************************** * OTDR ***************************************************************/ #define OTDR \ OUTD; \ if( B ) \ { \ PC -= 2; \ CC(ex,0xbb); \ } /*************************************************************** * EI ***************************************************************/ #define EI { \ IFF1 = IFF2 = 1; \ Z80.after_ei = TRUE; \ } /********************************************************** * opcodes with CB prefix * rotate, shift and bit operations **********************************************************/ OP(cb,00) { B = RLC(B); } /* RLC B */ OP(cb,01) { C = RLC(C); } /* RLC C */ OP(cb,02) { D = RLC(D); } /* RLC D */ OP(cb,03) { E = RLC(E); } /* RLC E */ OP(cb,04) { H = RLC(H); } /* RLC H */ OP(cb,05) { L = RLC(L); } /* RLC L */ OP(cb,06) { WM( HL, RLC(RM(HL)) ); } /* RLC (HL) */ OP(cb,07) { A = RLC(A); } /* RLC A */ OP(cb,08) { B = RRC(B); } /* RRC B */ OP(cb,09) { C = RRC(C); } /* RRC C */ OP(cb,0a) { D = RRC(D); } /* RRC D */ OP(cb,0b) { E = RRC(E); } /* RRC E */ OP(cb,0c) { H = RRC(H); } /* RRC H */ OP(cb,0d) { L = RRC(L); } /* RRC L */ OP(cb,0e) { WM( HL, RRC(RM(HL)) ); } /* RRC (HL) */ OP(cb,0f) { A = RRC(A); } /* RRC A */ OP(cb,10) { B = RL(B); } /* RL B */ OP(cb,11) { C = RL(C); } /* RL C */ OP(cb,12) { D = RL(D); } /* RL D */ OP(cb,13) { E = RL(E); } /* RL E */ OP(cb,14) { H = RL(H); } /* RL H */ OP(cb,15) { L = RL(L); } /* RL L */ OP(cb,16) { WM( HL, RL(RM(HL)) ); } /* RL (HL) */ OP(cb,17) { A = RL(A); } /* RL A */ OP(cb,18) { B = RR(B); } /* RR B */ OP(cb,19) { C = RR(C); } /* RR C */ OP(cb,1a) { D = RR(D); } /* RR D */ OP(cb,1b) { E = RR(E); } /* RR E */ OP(cb,1c) { H = RR(H); } /* RR H */ OP(cb,1d) { L = RR(L); } /* RR L */ OP(cb,1e) { WM( HL, RR(RM(HL)) ); } /* RR (HL) */ OP(cb,1f) { A = RR(A); } /* RR A */ OP(cb,20) { B = SLA(B); } /* SLA B */ OP(cb,21) { C = SLA(C); } /* SLA C */ OP(cb,22) { D = SLA(D); } /* SLA D */ OP(cb,23) { E = SLA(E); } /* SLA E */ OP(cb,24) { H = SLA(H); } /* SLA H */ OP(cb,25) { L = SLA(L); } /* SLA L */ OP(cb,26) { WM( HL, SLA(RM(HL)) ); } /* SLA (HL) */ OP(cb,27) { A = SLA(A); } /* SLA A */ OP(cb,28) { B = SRA(B); } /* SRA B */ OP(cb,29) { C = SRA(C); } /* SRA C */ OP(cb,2a) { D = SRA(D); } /* SRA D */ OP(cb,2b) { E = SRA(E); } /* SRA E */ OP(cb,2c) { H = SRA(H); } /* SRA H */ OP(cb,2d) { L = SRA(L); } /* SRA L */ OP(cb,2e) { WM( HL, SRA(RM(HL)) ); } /* SRA (HL) */ OP(cb,2f) { A = SRA(A); } /* SRA A */ OP(cb,30) { B = SLL(B); } /* SLL B */ OP(cb,31) { C = SLL(C); } /* SLL C */ OP(cb,32) { D = SLL(D); } /* SLL D */ OP(cb,33) { E = SLL(E); } /* SLL E */ OP(cb,34) { H = SLL(H); } /* SLL H */ OP(cb,35) { L = SLL(L); } /* SLL L */ OP(cb,36) { WM( HL, SLL(RM(HL)) ); } /* SLL (HL) */ OP(cb,37) { A = SLL(A); } /* SLL A */ OP(cb,38) { B = SRL(B); } /* SRL B */ OP(cb,39) { C = SRL(C); } /* SRL C */ OP(cb,3a) { D = SRL(D); } /* SRL D */ OP(cb,3b) { E = SRL(E); } /* SRL E */ OP(cb,3c) { H = SRL(H); } /* SRL H */ OP(cb,3d) { L = SRL(L); } /* SRL L */ OP(cb,3e) { WM( HL, SRL(RM(HL)) ); } /* SRL (HL) */ OP(cb,3f) { A = SRL(A); } /* SRL A */ OP(cb,40) { BIT(0,B); } /* BIT 0,B */ OP(cb,41) { BIT(0,C); } /* BIT 0,C */ OP(cb,42) { BIT(0,D); } /* BIT 0,D */ OP(cb,43) { BIT(0,E); } /* BIT 0,E */ OP(cb,44) { BIT(0,H); } /* BIT 0,H */ OP(cb,45) { BIT(0,L); } /* BIT 0,L */ OP(cb,46) { BIT_HL(0,RM(HL)); } /* BIT 0,(HL) */ OP(cb,47) { BIT(0,A); } /* BIT 0,A */ OP(cb,48) { BIT(1,B); } /* BIT 1,B */ OP(cb,49) { BIT(1,C); } /* BIT 1,C */ OP(cb,4a) { BIT(1,D); } /* BIT 1,D */ OP(cb,4b) { BIT(1,E); } /* BIT 1,E */ OP(cb,4c) { BIT(1,H); } /* BIT 1,H */ OP(cb,4d) { BIT(1,L); } /* BIT 1,L */ OP(cb,4e) { BIT_HL(1,RM(HL)); } /* BIT 1,(HL) */ OP(cb,4f) { BIT(1,A); } /* BIT 1,A */ OP(cb,50) { BIT(2,B); } /* BIT 2,B */ OP(cb,51) { BIT(2,C); } /* BIT 2,C */ OP(cb,52) { BIT(2,D); } /* BIT 2,D */ OP(cb,53) { BIT(2,E); } /* BIT 2,E */ OP(cb,54) { BIT(2,H); } /* BIT 2,H */ OP(cb,55) { BIT(2,L); } /* BIT 2,L */ OP(cb,56) { BIT_HL(2,RM(HL)); } /* BIT 2,(HL) */ OP(cb,57) { BIT(2,A); } /* BIT 2,A */ OP(cb,58) { BIT(3,B); } /* BIT 3,B */ OP(cb,59) { BIT(3,C); } /* BIT 3,C */ OP(cb,5a) { BIT(3,D); } /* BIT 3,D */ OP(cb,5b) { BIT(3,E); } /* BIT 3,E */ OP(cb,5c) { BIT(3,H); } /* BIT 3,H */ OP(cb,5d) { BIT(3,L); } /* BIT 3,L */ OP(cb,5e) { BIT_HL(3,RM(HL)); } /* BIT 3,(HL) */ OP(cb,5f) { BIT(3,A); } /* BIT 3,A */ OP(cb,60) { BIT(4,B); } /* BIT 4,B */ OP(cb,61) { BIT(4,C); } /* BIT 4,C */ OP(cb,62) { BIT(4,D); } /* BIT 4,D */ OP(cb,63) { BIT(4,E); } /* BIT 4,E */ OP(cb,64) { BIT(4,H); } /* BIT 4,H */ OP(cb,65) { BIT(4,L); } /* BIT 4,L */ OP(cb,66) { BIT_HL(4,RM(HL)); } /* BIT 4,(HL) */ OP(cb,67) { BIT(4,A); } /* BIT 4,A */ OP(cb,68) { BIT(5,B); } /* BIT 5,B */ OP(cb,69) { BIT(5,C); } /* BIT 5,C */ OP(cb,6a) { BIT(5,D); } /* BIT 5,D */ OP(cb,6b) { BIT(5,E); } /* BIT 5,E */ OP(cb,6c) { BIT(5,H); } /* BIT 5,H */ OP(cb,6d) { BIT(5,L); } /* BIT 5,L */ OP(cb,6e) { BIT_HL(5,RM(HL)); } /* BIT 5,(HL) */ OP(cb,6f) { BIT(5,A); } /* BIT 5,A */ OP(cb,70) { BIT(6,B); } /* BIT 6,B */ OP(cb,71) { BIT(6,C); } /* BIT 6,C */ OP(cb,72) { BIT(6,D); } /* BIT 6,D */ OP(cb,73) { BIT(6,E); } /* BIT 6,E */ OP(cb,74) { BIT(6,H); } /* BIT 6,H */ OP(cb,75) { BIT(6,L); } /* BIT 6,L */ OP(cb,76) { BIT_HL(6,RM(HL)); } /* BIT 6,(HL) */ OP(cb,77) { BIT(6,A); } /* BIT 6,A */ OP(cb,78) { BIT(7,B); } /* BIT 7,B */ OP(cb,79) { BIT(7,C); } /* BIT 7,C */ OP(cb,7a) { BIT(7,D); } /* BIT 7,D */ OP(cb,7b) { BIT(7,E); } /* BIT 7,E */ OP(cb,7c) { BIT(7,H); } /* BIT 7,H */ OP(cb,7d) { BIT(7,L); } /* BIT 7,L */ OP(cb,7e) { BIT_HL(7,RM(HL)); } /* BIT 7,(HL) */ OP(cb,7f) { BIT(7,A); } /* BIT 7,A */ OP(cb,80) { B = RES(0,B); } /* RES 0,B */ OP(cb,81) { C = RES(0,C); } /* RES 0,C */ OP(cb,82) { D = RES(0,D); } /* RES 0,D */ OP(cb,83) { E = RES(0,E); } /* RES 0,E */ OP(cb,84) { H = RES(0,H); } /* RES 0,H */ OP(cb,85) { L = RES(0,L); } /* RES 0,L */ OP(cb,86) { WM( HL, RES(0,RM(HL)) ); } /* RES 0,(HL) */ OP(cb,87) { A = RES(0,A); } /* RES 0,A */ OP(cb,88) { B = RES(1,B); } /* RES 1,B */ OP(cb,89) { C = RES(1,C); } /* RES 1,C */ OP(cb,8a) { D = RES(1,D); } /* RES 1,D */ OP(cb,8b) { E = RES(1,E); } /* RES 1,E */ OP(cb,8c) { H = RES(1,H); } /* RES 1,H */ OP(cb,8d) { L = RES(1,L); } /* RES 1,L */ OP(cb,8e) { WM( HL, RES(1,RM(HL)) ); } /* RES 1,(HL) */ OP(cb,8f) { A = RES(1,A); } /* RES 1,A */ OP(cb,90) { B = RES(2,B); } /* RES 2,B */ OP(cb,91) { C = RES(2,C); } /* RES 2,C */ OP(cb,92) { D = RES(2,D); } /* RES 2,D */ OP(cb,93) { E = RES(2,E); } /* RES 2,E */ OP(cb,94) { H = RES(2,H); } /* RES 2,H */ OP(cb,95) { L = RES(2,L); } /* RES 2,L */ OP(cb,96) { WM( HL, RES(2,RM(HL)) ); } /* RES 2,(HL) */ OP(cb,97) { A = RES(2,A); } /* RES 2,A */ OP(cb,98) { B = RES(3,B); } /* RES 3,B */ OP(cb,99) { C = RES(3,C); } /* RES 3,C */ OP(cb,9a) { D = RES(3,D); } /* RES 3,D */ OP(cb,9b) { E = RES(3,E); } /* RES 3,E */ OP(cb,9c) { H = RES(3,H); } /* RES 3,H */ OP(cb,9d) { L = RES(3,L); } /* RES 3,L */ OP(cb,9e) { WM( HL, RES(3,RM(HL)) ); } /* RES 3,(HL) */ OP(cb,9f) { A = RES(3,A); } /* RES 3,A */ OP(cb,a0) { B = RES(4,B); } /* RES 4,B */ OP(cb,a1) { C = RES(4,C); } /* RES 4,C */ OP(cb,a2) { D = RES(4,D); } /* RES 4,D */ OP(cb,a3) { E = RES(4,E); } /* RES 4,E */ OP(cb,a4) { H = RES(4,H); } /* RES 4,H */ OP(cb,a5) { L = RES(4,L); } /* RES 4,L */ OP(cb,a6) { WM( HL, RES(4,RM(HL)) ); } /* RES 4,(HL) */ OP(cb,a7) { A = RES(4,A); } /* RES 4,A */ OP(cb,a8) { B = RES(5,B); } /* RES 5,B */ OP(cb,a9) { C = RES(5,C); } /* RES 5,C */ OP(cb,aa) { D = RES(5,D); } /* RES 5,D */ OP(cb,ab) { E = RES(5,E); } /* RES 5,E */ OP(cb,ac) { H = RES(5,H); } /* RES 5,H */ OP(cb,ad) { L = RES(5,L); } /* RES 5,L */ OP(cb,ae) { WM( HL, RES(5,RM(HL)) ); } /* RES 5,(HL) */ OP(cb,af) { A = RES(5,A); } /* RES 5,A */ OP(cb,b0) { B = RES(6,B); } /* RES 6,B */ OP(cb,b1) { C = RES(6,C); } /* RES 6,C */ OP(cb,b2) { D = RES(6,D); } /* RES 6,D */ OP(cb,b3) { E = RES(6,E); } /* RES 6,E */ OP(cb,b4) { H = RES(6,H); } /* RES 6,H */ OP(cb,b5) { L = RES(6,L); } /* RES 6,L */ OP(cb,b6) { WM( HL, RES(6,RM(HL)) ); } /* RES 6,(HL) */ OP(cb,b7) { A = RES(6,A); } /* RES 6,A */ OP(cb,b8) { B = RES(7,B); } /* RES 7,B */ OP(cb,b9) { C = RES(7,C); } /* RES 7,C */ OP(cb,ba) { D = RES(7,D); } /* RES 7,D */ OP(cb,bb) { E = RES(7,E); } /* RES 7,E */ OP(cb,bc) { H = RES(7,H); } /* RES 7,H */ OP(cb,bd) { L = RES(7,L); } /* RES 7,L */ OP(cb,be) { WM( HL, RES(7,RM(HL)) ); } /* RES 7,(HL) */ OP(cb,bf) { A = RES(7,A); } /* RES 7,A */ OP(cb,c0) { B = SET(0,B); } /* SET 0,B */ OP(cb,c1) { C = SET(0,C); } /* SET 0,C */ OP(cb,c2) { D = SET(0,D); } /* SET 0,D */ OP(cb,c3) { E = SET(0,E); } /* SET 0,E */ OP(cb,c4) { H = SET(0,H); } /* SET 0,H */ OP(cb,c5) { L = SET(0,L); } /* SET 0,L */ OP(cb,c6) { WM( HL, SET(0,RM(HL)) ); } /* SET 0,(HL) */ OP(cb,c7) { A = SET(0,A); } /* SET 0,A */ OP(cb,c8) { B = SET(1,B); } /* SET 1,B */ OP(cb,c9) { C = SET(1,C); } /* SET 1,C */ OP(cb,ca) { D = SET(1,D); } /* SET 1,D */ OP(cb,cb) { E = SET(1,E); } /* SET 1,E */ OP(cb,cc) { H = SET(1,H); } /* SET 1,H */ OP(cb,cd) { L = SET(1,L); } /* SET 1,L */ OP(cb,ce) { WM( HL, SET(1,RM(HL)) ); } /* SET 1,(HL) */ OP(cb,cf) { A = SET(1,A); } /* SET 1,A */ OP(cb,d0) { B = SET(2,B); } /* SET 2,B */ OP(cb,d1) { C = SET(2,C); } /* SET 2,C */ OP(cb,d2) { D = SET(2,D); } /* SET 2,D */ OP(cb,d3) { E = SET(2,E); } /* SET 2,E */ OP(cb,d4) { H = SET(2,H); } /* SET 2,H */ OP(cb,d5) { L = SET(2,L); } /* SET 2,L */ OP(cb,d6) { WM( HL, SET(2,RM(HL)) ); } /* SET 2,(HL) */ OP(cb,d7) { A = SET(2,A); } /* SET 2,A */ OP(cb,d8) { B = SET(3,B); } /* SET 3,B */ OP(cb,d9) { C = SET(3,C); } /* SET 3,C */ OP(cb,da) { D = SET(3,D); } /* SET 3,D */ OP(cb,db) { E = SET(3,E); } /* SET 3,E */ OP(cb,dc) { H = SET(3,H); } /* SET 3,H */ OP(cb,dd) { L = SET(3,L); } /* SET 3,L */ OP(cb,de) { WM( HL, SET(3,RM(HL)) ); } /* SET 3,(HL) */ OP(cb,df) { A = SET(3,A); } /* SET 3,A */ OP(cb,e0) { B = SET(4,B); } /* SET 4,B */ OP(cb,e1) { C = SET(4,C); } /* SET 4,C */ OP(cb,e2) { D = SET(4,D); } /* SET 4,D */ OP(cb,e3) { E = SET(4,E); } /* SET 4,E */ OP(cb,e4) { H = SET(4,H); } /* SET 4,H */ OP(cb,e5) { L = SET(4,L); } /* SET 4,L */ OP(cb,e6) { WM( HL, SET(4,RM(HL)) ); } /* SET 4,(HL) */ OP(cb,e7) { A = SET(4,A); } /* SET 4,A */ OP(cb,e8) { B = SET(5,B); } /* SET 5,B */ OP(cb,e9) { C = SET(5,C); } /* SET 5,C */ OP(cb,ea) { D = SET(5,D); } /* SET 5,D */ OP(cb,eb) { E = SET(5,E); } /* SET 5,E */ OP(cb,ec) { H = SET(5,H); } /* SET 5,H */ OP(cb,ed) { L = SET(5,L); } /* SET 5,L */ OP(cb,ee) { WM( HL, SET(5,RM(HL)) ); } /* SET 5,(HL) */ OP(cb,ef) { A = SET(5,A); } /* SET 5,A */ OP(cb,f0) { B = SET(6,B); } /* SET 6,B */ OP(cb,f1) { C = SET(6,C); } /* SET 6,C */ OP(cb,f2) { D = SET(6,D); } /* SET 6,D */ OP(cb,f3) { E = SET(6,E); } /* SET 6,E */ OP(cb,f4) { H = SET(6,H); } /* SET 6,H */ OP(cb,f5) { L = SET(6,L); } /* SET 6,L */ OP(cb,f6) { WM( HL, SET(6,RM(HL)) ); } /* SET 6,(HL) */ OP(cb,f7) { A = SET(6,A); } /* SET 6,A */ OP(cb,f8) { B = SET(7,B); } /* SET 7,B */ OP(cb,f9) { C = SET(7,C); } /* SET 7,C */ OP(cb,fa) { D = SET(7,D); } /* SET 7,D */ OP(cb,fb) { E = SET(7,E); } /* SET 7,E */ OP(cb,fc) { H = SET(7,H); } /* SET 7,H */ OP(cb,fd) { L = SET(7,L); } /* SET 7,L */ OP(cb,fe) { WM( HL, SET(7,RM(HL)) ); } /* SET 7,(HL) */ OP(cb,ff) { A = SET(7,A); } /* SET 7,A */ /********************************************************** * opcodes with DD/FD CB prefix * rotate, shift and bit operations with (IX+o) **********************************************************/ OP(xycb,00) { B = RLC( RM(EA) ); WM( EA,B ); } /* RLC B=(XY+o) */ OP(xycb,01) { C = RLC( RM(EA) ); WM( EA,C ); } /* RLC C=(XY+o) */ OP(xycb,02) { D = RLC( RM(EA) ); WM( EA,D ); } /* RLC D=(XY+o) */ OP(xycb,03) { E = RLC( RM(EA) ); WM( EA,E ); } /* RLC E=(XY+o) */ OP(xycb,04) { H = RLC( RM(EA) ); WM( EA,H ); } /* RLC H=(XY+o) */ OP(xycb,05) { L = RLC( RM(EA) ); WM( EA,L ); } /* RLC L=(XY+o) */ OP(xycb,06) { WM( EA, RLC( RM(EA) ) ); } /* RLC (XY+o) */ OP(xycb,07) { A = RLC( RM(EA) ); WM( EA,A ); } /* RLC A=(XY+o) */ OP(xycb,08) { B = RRC( RM(EA) ); WM( EA,B ); } /* RRC B=(XY+o) */ OP(xycb,09) { C = RRC( RM(EA) ); WM( EA,C ); } /* RRC C=(XY+o) */ OP(xycb,0a) { D = RRC( RM(EA) ); WM( EA,D ); } /* RRC D=(XY+o) */ OP(xycb,0b) { E = RRC( RM(EA) ); WM( EA,E ); } /* RRC E=(XY+o) */ OP(xycb,0c) { H = RRC( RM(EA) ); WM( EA,H ); } /* RRC H=(XY+o) */ OP(xycb,0d) { L = RRC( RM(EA) ); WM( EA,L ); } /* RRC L=(XY+o) */ OP(xycb,0e) { WM( EA,RRC( RM(EA) ) ); } /* RRC (XY+o) */ OP(xycb,0f) { A = RRC( RM(EA) ); WM( EA,A ); } /* RRC A=(XY+o) */ OP(xycb,10) { B = RL( RM(EA) ); WM( EA,B ); } /* RL B=(XY+o) */ OP(xycb,11) { C = RL( RM(EA) ); WM( EA,C ); } /* RL C=(XY+o) */ OP(xycb,12) { D = RL( RM(EA) ); WM( EA,D ); } /* RL D=(XY+o) */ OP(xycb,13) { E = RL( RM(EA) ); WM( EA,E ); } /* RL E=(XY+o) */ OP(xycb,14) { H = RL( RM(EA) ); WM( EA,H ); } /* RL H=(XY+o) */ OP(xycb,15) { L = RL( RM(EA) ); WM( EA,L ); } /* RL L=(XY+o) */ OP(xycb,16) { WM( EA,RL( RM(EA) ) ); } /* RL (XY+o) */ OP(xycb,17) { A = RL( RM(EA) ); WM( EA,A ); } /* RL A=(XY+o) */ OP(xycb,18) { B = RR( RM(EA) ); WM( EA,B ); } /* RR B=(XY+o) */ OP(xycb,19) { C = RR( RM(EA) ); WM( EA,C ); } /* RR C=(XY+o) */ OP(xycb,1a) { D = RR( RM(EA) ); WM( EA,D ); } /* RR D=(XY+o) */ OP(xycb,1b) { E = RR( RM(EA) ); WM( EA,E ); } /* RR E=(XY+o) */ OP(xycb,1c) { H = RR( RM(EA) ); WM( EA,H ); } /* RR H=(XY+o) */ OP(xycb,1d) { L = RR( RM(EA) ); WM( EA,L ); } /* RR L=(XY+o) */ OP(xycb,1e) { WM( EA,RR( RM(EA) ) ); } /* RR (XY+o) */ OP(xycb,1f) { A = RR( RM(EA) ); WM( EA,A ); } /* RR A=(XY+o) */ OP(xycb,20) { B = SLA( RM(EA) ); WM( EA,B ); } /* SLA B=(XY+o) */ OP(xycb,21) { C = SLA( RM(EA) ); WM( EA,C ); } /* SLA C=(XY+o) */ OP(xycb,22) { D = SLA( RM(EA) ); WM( EA,D ); } /* SLA D=(XY+o) */ OP(xycb,23) { E = SLA( RM(EA) ); WM( EA,E ); } /* SLA E=(XY+o) */ OP(xycb,24) { H = SLA( RM(EA) ); WM( EA,H ); } /* SLA H=(XY+o) */ OP(xycb,25) { L = SLA( RM(EA) ); WM( EA,L ); } /* SLA L=(XY+o) */ OP(xycb,26) { WM( EA,SLA( RM(EA) ) ); } /* SLA (XY+o) */ OP(xycb,27) { A = SLA( RM(EA) ); WM( EA,A ); } /* SLA A=(XY+o) */ OP(xycb,28) { B = SRA( RM(EA) ); WM( EA,B ); } /* SRA B=(XY+o) */ OP(xycb,29) { C = SRA( RM(EA) ); WM( EA,C ); } /* SRA C=(XY+o) */ OP(xycb,2a) { D = SRA( RM(EA) ); WM( EA,D ); } /* SRA D=(XY+o) */ OP(xycb,2b) { E = SRA( RM(EA) ); WM( EA,E ); } /* SRA E=(XY+o) */ OP(xycb,2c) { H = SRA( RM(EA) ); WM( EA,H ); } /* SRA H=(XY+o) */ OP(xycb,2d) { L = SRA( RM(EA) ); WM( EA,L ); } /* SRA L=(XY+o) */ OP(xycb,2e) { WM( EA,SRA( RM(EA) ) ); } /* SRA (XY+o) */ OP(xycb,2f) { A = SRA( RM(EA) ); WM( EA,A ); } /* SRA A=(XY+o) */ OP(xycb,30) { B = SLL( RM(EA) ); WM( EA,B ); } /* SLL B=(XY+o) */ OP(xycb,31) { C = SLL( RM(EA) ); WM( EA,C ); } /* SLL C=(XY+o) */ OP(xycb,32) { D = SLL( RM(EA) ); WM( EA,D ); } /* SLL D=(XY+o) */ OP(xycb,33) { E = SLL( RM(EA) ); WM( EA,E ); } /* SLL E=(XY+o) */ OP(xycb,34) { H = SLL( RM(EA) ); WM( EA,H ); } /* SLL H=(XY+o) */ OP(xycb,35) { L = SLL( RM(EA) ); WM( EA,L ); } /* SLL L=(XY+o) */ OP(xycb,36) { WM( EA,SLL( RM(EA) ) ); } /* SLL (XY+o) */ OP(xycb,37) { A = SLL( RM(EA) ); WM( EA,A ); } /* SLL A=(XY+o) */ OP(xycb,38) { B = SRL( RM(EA) ); WM( EA,B ); } /* SRL B=(XY+o) */ OP(xycb,39) { C = SRL( RM(EA) ); WM( EA,C ); } /* SRL C=(XY+o) */ OP(xycb,3a) { D = SRL( RM(EA) ); WM( EA,D ); } /* SRL D=(XY+o) */ OP(xycb,3b) { E = SRL( RM(EA) ); WM( EA,E ); } /* SRL E=(XY+o) */ OP(xycb,3c) { H = SRL( RM(EA) ); WM( EA,H ); } /* SRL H=(XY+o) */ OP(xycb,3d) { L = SRL( RM(EA) ); WM( EA,L ); } /* SRL L=(XY+o) */ OP(xycb,3e) { WM( EA,SRL( RM(EA) ) ); } /* SRL (XY+o) */ OP(xycb,3f) { A = SRL( RM(EA) ); WM( EA,A ); } /* SRL A=(XY+o) */ OP(xycb,40) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,41) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,42) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,43) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,44) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,45) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,46) { BIT_XY(0,RM(EA)); } /* BIT 0,(XY+o) */ OP(xycb,47) { xycb_46(); } /* BIT 0,(XY+o) */ OP(xycb,48) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,49) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,4a) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,4b) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,4c) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,4d) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,4e) { BIT_XY(1,RM(EA)); } /* BIT 1,(XY+o) */ OP(xycb,4f) { xycb_4e(); } /* BIT 1,(XY+o) */ OP(xycb,50) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,51) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,52) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,53) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,54) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,55) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,56) { BIT_XY(2,RM(EA)); } /* BIT 2,(XY+o) */ OP(xycb,57) { xycb_56(); } /* BIT 2,(XY+o) */ OP(xycb,58) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,59) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,5a) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,5b) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,5c) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,5d) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,5e) { BIT_XY(3,RM(EA)); } /* BIT 3,(XY+o) */ OP(xycb,5f) { xycb_5e(); } /* BIT 3,(XY+o) */ OP(xycb,60) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,61) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,62) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,63) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,64) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,65) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,66) { BIT_XY(4,RM(EA)); } /* BIT 4,(XY+o) */ OP(xycb,67) { xycb_66(); } /* BIT 4,(XY+o) */ OP(xycb,68) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,69) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,6a) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,6b) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,6c) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,6d) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,6e) { BIT_XY(5,RM(EA)); } /* BIT 5,(XY+o) */ OP(xycb,6f) { xycb_6e(); } /* BIT 5,(XY+o) */ OP(xycb,70) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,71) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,72) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,73) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,74) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,75) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,76) { BIT_XY(6,RM(EA)); } /* BIT 6,(XY+o) */ OP(xycb,77) { xycb_76(); } /* BIT 6,(XY+o) */ OP(xycb,78) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,79) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,7a) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,7b) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,7c) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,7d) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,7e) { BIT_XY(7,RM(EA)); } /* BIT 7,(XY+o) */ OP(xycb,7f) { xycb_7e(); } /* BIT 7,(XY+o) */ OP(xycb,80) { B = RES(0, RM(EA) ); WM( EA,B ); } /* RES 0,B=(XY+o) */ OP(xycb,81) { C = RES(0, RM(EA) ); WM( EA,C ); } /* RES 0,C=(XY+o) */ OP(xycb,82) { D = RES(0, RM(EA) ); WM( EA,D ); } /* RES 0,D=(XY+o) */ OP(xycb,83) { E = RES(0, RM(EA) ); WM( EA,E ); } /* RES 0,E=(XY+o) */ OP(xycb,84) { H = RES(0, RM(EA) ); WM( EA,H ); } /* RES 0,H=(XY+o) */ OP(xycb,85) { L = RES(0, RM(EA) ); WM( EA,L ); } /* RES 0,L=(XY+o) */ OP(xycb,86) { WM( EA, RES(0,RM(EA)) ); } /* RES 0,(XY+o) */ OP(xycb,87) { A = RES(0, RM(EA) ); WM( EA,A ); } /* RES 0,A=(XY+o) */ OP(xycb,88) { B = RES(1, RM(EA) ); WM( EA,B ); } /* RES 1,B=(XY+o) */ OP(xycb,89) { C = RES(1, RM(EA) ); WM( EA,C ); } /* RES 1,C=(XY+o) */ OP(xycb,8a) { D = RES(1, RM(EA) ); WM( EA,D ); } /* RES 1,D=(XY+o) */ OP(xycb,8b) { E = RES(1, RM(EA) ); WM( EA,E ); } /* RES 1,E=(XY+o) */ OP(xycb,8c) { H = RES(1, RM(EA) ); WM( EA,H ); } /* RES 1,H=(XY+o) */ OP(xycb,8d) { L = RES(1, RM(EA) ); WM( EA,L ); } /* RES 1,L=(XY+o) */ OP(xycb,8e) { WM( EA, RES(1,RM(EA)) ); } /* RES 1,(XY+o) */ OP(xycb,8f) { A = RES(1, RM(EA) ); WM( EA,A ); } /* RES 1,A=(XY+o) */ OP(xycb,90) { B = RES(2, RM(EA) ); WM( EA,B ); } /* RES 2,B=(XY+o) */ OP(xycb,91) { C = RES(2, RM(EA) ); WM( EA,C ); } /* RES 2,C=(XY+o) */ OP(xycb,92) { D = RES(2, RM(EA) ); WM( EA,D ); } /* RES 2,D=(XY+o) */ OP(xycb,93) { E = RES(2, RM(EA) ); WM( EA,E ); } /* RES 2,E=(XY+o) */ OP(xycb,94) { H = RES(2, RM(EA) ); WM( EA,H ); } /* RES 2,H=(XY+o) */ OP(xycb,95) { L = RES(2, RM(EA) ); WM( EA,L ); } /* RES 2,L=(XY+o) */ OP(xycb,96) { WM( EA, RES(2,RM(EA)) ); } /* RES 2,(XY+o) */ OP(xycb,97) { A = RES(2, RM(EA) ); WM( EA,A ); } /* RES 2,A=(XY+o) */ OP(xycb,98) { B = RES(3, RM(EA) ); WM( EA,B ); } /* RES 3,B=(XY+o) */ OP(xycb,99) { C = RES(3, RM(EA) ); WM( EA,C ); } /* RES 3,C=(XY+o) */ OP(xycb,9a) { D = RES(3, RM(EA) ); WM( EA,D ); } /* RES 3,D=(XY+o) */ OP(xycb,9b) { E = RES(3, RM(EA) ); WM( EA,E ); } /* RES 3,E=(XY+o) */ OP(xycb,9c) { H = RES(3, RM(EA) ); WM( EA,H ); } /* RES 3,H=(XY+o) */ OP(xycb,9d) { L = RES(3, RM(EA) ); WM( EA,L ); } /* RES 3,L=(XY+o) */ OP(xycb,9e) { WM( EA, RES(3,RM(EA)) ); } /* RES 3,(XY+o) */ OP(xycb,9f) { A = RES(3, RM(EA) ); WM( EA,A ); } /* RES 3,A=(XY+o) */ OP(xycb,a0) { B = RES(4, RM(EA) ); WM( EA,B ); } /* RES 4,B=(XY+o) */ OP(xycb,a1) { C = RES(4, RM(EA) ); WM( EA,C ); } /* RES 4,C=(XY+o) */ OP(xycb,a2) { D = RES(4, RM(EA) ); WM( EA,D ); } /* RES 4,D=(XY+o) */ OP(xycb,a3) { E = RES(4, RM(EA) ); WM( EA,E ); } /* RES 4,E=(XY+o) */ OP(xycb,a4) { H = RES(4, RM(EA) ); WM( EA,H ); } /* RES 4,H=(XY+o) */ OP(xycb,a5) { L = RES(4, RM(EA) ); WM( EA,L ); } /* RES 4,L=(XY+o) */ OP(xycb,a6) { WM( EA, RES(4,RM(EA)) ); } /* RES 4,(XY+o) */ OP(xycb,a7) { A = RES(4, RM(EA) ); WM( EA,A ); } /* RES 4,A=(XY+o) */ OP(xycb,a8) { B = RES(5, RM(EA) ); WM( EA,B ); } /* RES 5,B=(XY+o) */ OP(xycb,a9) { C = RES(5, RM(EA) ); WM( EA,C ); } /* RES 5,C=(XY+o) */ OP(xycb,aa) { D = RES(5, RM(EA) ); WM( EA,D ); } /* RES 5,D=(XY+o) */ OP(xycb,ab) { E = RES(5, RM(EA) ); WM( EA,E ); } /* RES 5,E=(XY+o) */ OP(xycb,ac) { H = RES(5, RM(EA) ); WM( EA,H ); } /* RES 5,H=(XY+o) */ OP(xycb,ad) { L = RES(5, RM(EA) ); WM( EA,L ); } /* RES 5,L=(XY+o) */ OP(xycb,ae) { WM( EA, RES(5,RM(EA)) ); } /* RES 5,(XY+o) */ OP(xycb,af) { A = RES(5, RM(EA) ); WM( EA,A ); } /* RES 5,A=(XY+o) */ OP(xycb,b0) { B = RES(6, RM(EA) ); WM( EA,B ); } /* RES 6,B=(XY+o) */ OP(xycb,b1) { C = RES(6, RM(EA) ); WM( EA,C ); } /* RES 6,C=(XY+o) */ OP(xycb,b2) { D = RES(6, RM(EA) ); WM( EA,D ); } /* RES 6,D=(XY+o) */ OP(xycb,b3) { E = RES(6, RM(EA) ); WM( EA,E ); } /* RES 6,E=(XY+o) */ OP(xycb,b4) { H = RES(6, RM(EA) ); WM( EA,H ); } /* RES 6,H=(XY+o) */ OP(xycb,b5) { L = RES(6, RM(EA) ); WM( EA,L ); } /* RES 6,L=(XY+o) */ OP(xycb,b6) { WM( EA, RES(6,RM(EA)) ); } /* RES 6,(XY+o) */ OP(xycb,b7) { A = RES(6, RM(EA) ); WM( EA,A ); } /* RES 6,A=(XY+o) */ OP(xycb,b8) { B = RES(7, RM(EA) ); WM( EA,B ); } /* RES 7,B=(XY+o) */ OP(xycb,b9) { C = RES(7, RM(EA) ); WM( EA,C ); } /* RES 7,C=(XY+o) */ OP(xycb,ba) { D = RES(7, RM(EA) ); WM( EA,D ); } /* RES 7,D=(XY+o) */ OP(xycb,bb) { E = RES(7, RM(EA) ); WM( EA,E ); } /* RES 7,E=(XY+o) */ OP(xycb,bc) { H = RES(7, RM(EA) ); WM( EA,H ); } /* RES 7,H=(XY+o) */ OP(xycb,bd) { L = RES(7, RM(EA) ); WM( EA,L ); } /* RES 7,L=(XY+o) */ OP(xycb,be) { WM( EA, RES(7,RM(EA)) ); } /* RES 7,(XY+o) */ OP(xycb,bf) { A = RES(7, RM(EA) ); WM( EA,A ); } /* RES 7,A=(XY+o) */ OP(xycb,c0) { B = SET(0, RM(EA) ); WM( EA,B ); } /* SET 0,B=(XY+o) */ OP(xycb,c1) { C = SET(0, RM(EA) ); WM( EA,C ); } /* SET 0,C=(XY+o) */ OP(xycb,c2) { D = SET(0, RM(EA) ); WM( EA,D ); } /* SET 0,D=(XY+o) */ OP(xycb,c3) { E = SET(0, RM(EA) ); WM( EA,E ); } /* SET 0,E=(XY+o) */ OP(xycb,c4) { H = SET(0, RM(EA) ); WM( EA,H ); } /* SET 0,H=(XY+o) */ OP(xycb,c5) { L = SET(0, RM(EA) ); WM( EA,L ); } /* SET 0,L=(XY+o) */ OP(xycb,c6) { WM( EA, SET(0,RM(EA)) ); } /* SET 0,(XY+o) */ OP(xycb,c7) { A = SET(0, RM(EA) ); WM( EA,A ); } /* SET 0,A=(XY+o) */ OP(xycb,c8) { B = SET(1, RM(EA) ); WM( EA,B ); } /* SET 1,B=(XY+o) */ OP(xycb,c9) { C = SET(1, RM(EA) ); WM( EA,C ); } /* SET 1,C=(XY+o) */ OP(xycb,ca) { D = SET(1, RM(EA) ); WM( EA,D ); } /* SET 1,D=(XY+o) */ OP(xycb,cb) { E = SET(1, RM(EA) ); WM( EA,E ); } /* SET 1,E=(XY+o) */ OP(xycb,cc) { H = SET(1, RM(EA) ); WM( EA,H ); } /* SET 1,H=(XY+o) */ OP(xycb,cd) { L = SET(1, RM(EA) ); WM( EA,L ); } /* SET 1,L=(XY+o) */ OP(xycb,ce) { WM( EA, SET(1,RM(EA)) ); } /* SET 1,(XY+o) */ OP(xycb,cf) { A = SET(1, RM(EA) ); WM( EA,A ); } /* SET 1,A=(XY+o) */ OP(xycb,d0) { B = SET(2, RM(EA) ); WM( EA,B ); } /* SET 2,B=(XY+o) */ OP(xycb,d1) { C = SET(2, RM(EA) ); WM( EA,C ); } /* SET 2,C=(XY+o) */ OP(xycb,d2) { D = SET(2, RM(EA) ); WM( EA,D ); } /* SET 2,D=(XY+o) */ OP(xycb,d3) { E = SET(2, RM(EA) ); WM( EA,E ); } /* SET 2,E=(XY+o) */ OP(xycb,d4) { H = SET(2, RM(EA) ); WM( EA,H ); } /* SET 2,H=(XY+o) */ OP(xycb,d5) { L = SET(2, RM(EA) ); WM( EA,L ); } /* SET 2,L=(XY+o) */ OP(xycb,d6) { WM( EA, SET(2,RM(EA)) ); } /* SET 2,(XY+o) */ OP(xycb,d7) { A = SET(2, RM(EA) ); WM( EA,A ); } /* SET 2,A=(XY+o) */ OP(xycb,d8) { B = SET(3, RM(EA) ); WM( EA,B ); } /* SET 3,B=(XY+o) */ OP(xycb,d9) { C = SET(3, RM(EA) ); WM( EA,C ); } /* SET 3,C=(XY+o) */ OP(xycb,da) { D = SET(3, RM(EA) ); WM( EA,D ); } /* SET 3,D=(XY+o) */ OP(xycb,db) { E = SET(3, RM(EA) ); WM( EA,E ); } /* SET 3,E=(XY+o) */ OP(xycb,dc) { H = SET(3, RM(EA) ); WM( EA,H ); } /* SET 3,H=(XY+o) */ OP(xycb,dd) { L = SET(3, RM(EA) ); WM( EA,L ); } /* SET 3,L=(XY+o) */ OP(xycb,de) { WM( EA, SET(3,RM(EA)) ); } /* SET 3,(XY+o) */ OP(xycb,df) { A = SET(3, RM(EA) ); WM( EA,A ); } /* SET 3,A=(XY+o) */ OP(xycb,e0) { B = SET(4, RM(EA) ); WM( EA,B ); } /* SET 4,B=(XY+o) */ OP(xycb,e1) { C = SET(4, RM(EA) ); WM( EA,C ); } /* SET 4,C=(XY+o) */ OP(xycb,e2) { D = SET(4, RM(EA) ); WM( EA,D ); } /* SET 4,D=(XY+o) */ OP(xycb,e3) { E = SET(4, RM(EA) ); WM( EA,E ); } /* SET 4,E=(XY+o) */ OP(xycb,e4) { H = SET(4, RM(EA) ); WM( EA,H ); } /* SET 4,H=(XY+o) */ OP(xycb,e5) { L = SET(4, RM(EA) ); WM( EA,L ); } /* SET 4,L=(XY+o) */ OP(xycb,e6) { WM( EA, SET(4,RM(EA)) ); } /* SET 4,(XY+o) */ OP(xycb,e7) { A = SET(4, RM(EA) ); WM( EA,A ); } /* SET 4,A=(XY+o) */ OP(xycb,e8) { B = SET(5, RM(EA) ); WM( EA,B ); } /* SET 5,B=(XY+o) */ OP(xycb,e9) { C = SET(5, RM(EA) ); WM( EA,C ); } /* SET 5,C=(XY+o) */ OP(xycb,ea) { D = SET(5, RM(EA) ); WM( EA,D ); } /* SET 5,D=(XY+o) */ OP(xycb,eb) { E = SET(5, RM(EA) ); WM( EA,E ); } /* SET 5,E=(XY+o) */ OP(xycb,ec) { H = SET(5, RM(EA) ); WM( EA,H ); } /* SET 5,H=(XY+o) */ OP(xycb,ed) { L = SET(5, RM(EA) ); WM( EA,L ); } /* SET 5,L=(XY+o) */ OP(xycb,ee) { WM( EA, SET(5,RM(EA)) ); } /* SET 5,(XY+o) */ OP(xycb,ef) { A = SET(5, RM(EA) ); WM( EA,A ); } /* SET 5,A=(XY+o) */ OP(xycb,f0) { B = SET(6, RM(EA) ); WM( EA,B ); } /* SET 6,B=(XY+o) */ OP(xycb,f1) { C = SET(6, RM(EA) ); WM( EA,C ); } /* SET 6,C=(XY+o) */ OP(xycb,f2) { D = SET(6, RM(EA) ); WM( EA,D ); } /* SET 6,D=(XY+o) */ OP(xycb,f3) { E = SET(6, RM(EA) ); WM( EA,E ); } /* SET 6,E=(XY+o) */ OP(xycb,f4) { H = SET(6, RM(EA) ); WM( EA,H ); } /* SET 6,H=(XY+o) */ OP(xycb,f5) { L = SET(6, RM(EA) ); WM( EA,L ); } /* SET 6,L=(XY+o) */ OP(xycb,f6) { WM( EA, SET(6,RM(EA)) ); } /* SET 6,(XY+o) */ OP(xycb,f7) { A = SET(6, RM(EA) ); WM( EA,A ); } /* SET 6,A=(XY+o) */ OP(xycb,f8) { B = SET(7, RM(EA) ); WM( EA,B ); } /* SET 7,B=(XY+o) */ OP(xycb,f9) { C = SET(7, RM(EA) ); WM( EA,C ); } /* SET 7,C=(XY+o) */ OP(xycb,fa) { D = SET(7, RM(EA) ); WM( EA,D ); } /* SET 7,D=(XY+o) */ OP(xycb,fb) { E = SET(7, RM(EA) ); WM( EA,E ); } /* SET 7,E=(XY+o) */ OP(xycb,fc) { H = SET(7, RM(EA) ); WM( EA,H ); } /* SET 7,H=(XY+o) */ OP(xycb,fd) { L = SET(7, RM(EA) ); WM( EA,L ); } /* SET 7,L=(XY+o) */ OP(xycb,fe) { WM( EA, SET(7,RM(EA)) ); } /* SET 7,(XY+o) */ OP(xycb,ff) { A = SET(7, RM(EA) ); WM( EA,A ); } /* SET 7,A=(XY+o) */ OP(illegal,1) { #if VERBOSE logerror("Z80 #%d ill. opcode $%02x $%02x\n", cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff), cpu_readop(PCD)); #endif } /********************************************************** * IX register related opcodes (DD prefix) **********************************************************/ OP(dd,00) { illegal_1(); op_00(); } /* DB DD */ OP(dd,01) { illegal_1(); op_01(); } /* DB DD */ OP(dd,02) { illegal_1(); op_02(); } /* DB DD */ OP(dd,03) { illegal_1(); op_03(); } /* DB DD */ OP(dd,04) { illegal_1(); op_04(); } /* DB DD */ OP(dd,05) { illegal_1(); op_05(); } /* DB DD */ OP(dd,06) { illegal_1(); op_06(); } /* DB DD */ OP(dd,07) { illegal_1(); op_07(); } /* DB DD */ OP(dd,08) { illegal_1(); op_08(); } /* DB DD */ OP(dd,09) { ADD16(ix,bc); } /* ADD IX,BC */ OP(dd,0a) { illegal_1(); op_0a(); } /* DB DD */ OP(dd,0b) { illegal_1(); op_0b(); } /* DB DD */ OP(dd,0c) { illegal_1(); op_0c(); } /* DB DD */ OP(dd,0d) { illegal_1(); op_0d(); } /* DB DD */ OP(dd,0e) { illegal_1(); op_0e(); } /* DB DD */ OP(dd,0f) { illegal_1(); op_0f(); } /* DB DD */ OP(dd,10) { illegal_1(); op_10(); } /* DB DD */ OP(dd,11) { illegal_1(); op_11(); } /* DB DD */ OP(dd,12) { illegal_1(); op_12(); } /* DB DD */ OP(dd,13) { illegal_1(); op_13(); } /* DB DD */ OP(dd,14) { illegal_1(); op_14(); } /* DB DD */ OP(dd,15) { illegal_1(); op_15(); } /* DB DD */ OP(dd,16) { illegal_1(); op_16(); } /* DB DD */ OP(dd,17) { illegal_1(); op_17(); } /* DB DD */ OP(dd,18) { illegal_1(); op_18(); } /* DB DD */ OP(dd,19) { ADD16(ix,de); } /* ADD IX,DE */ OP(dd,1a) { illegal_1(); op_1a(); } /* DB DD */ OP(dd,1b) { illegal_1(); op_1b(); } /* DB DD */ OP(dd,1c) { illegal_1(); op_1c(); } /* DB DD */ OP(dd,1d) { illegal_1(); op_1d(); } /* DB DD */ OP(dd,1e) { illegal_1(); op_1e(); } /* DB DD */ OP(dd,1f) { illegal_1(); op_1f(); } /* DB DD */ OP(dd,20) { illegal_1(); op_20(); } /* DB DD */ OP(dd,21) { IX = ARG16(); } /* LD IX,w */ OP(dd,22) { EA = ARG16(); WM16( EA, &Z80.ix ); WZ = EA+1; } /* LD (w),IX */ OP(dd,23) { IX++; } /* INC IX */ OP(dd,24) { HX = INC(HX); } /* INC HX */ OP(dd,25) { HX = DEC(HX); } /* DEC HX */ OP(dd,26) { HX = ARG(); } /* LD HX,n */ OP(dd,27) { illegal_1(); op_27(); } /* DB DD */ OP(dd,28) { illegal_1(); op_28(); } /* DB DD */ OP(dd,29) { ADD16(ix,ix); } /* ADD IX,IX */ OP(dd,2a) { EA = ARG16(); RM16( EA, &Z80.ix ); WZ = EA+1; } /* LD IX,(w) */ OP(dd,2b) { IX--; } /* DEC IX */ OP(dd,2c) { LX = INC(LX); } /* INC LX */ OP(dd,2d) { LX = DEC(LX); } /* DEC LX */ OP(dd,2e) { LX = ARG(); } /* LD LX,n */ OP(dd,2f) { illegal_1(); op_2f(); } /* DB DD */ OP(dd,30) { illegal_1(); op_30(); } /* DB DD */ OP(dd,31) { illegal_1(); op_31(); } /* DB DD */ OP(dd,32) { illegal_1(); op_32(); } /* DB DD */ OP(dd,33) { illegal_1(); op_33(); } /* DB DD */ OP(dd,34) { EAX; WM( EA, INC(RM(EA)) ); } /* INC (IX+o) */ OP(dd,35) { EAX; WM( EA, DEC(RM(EA)) ); } /* DEC (IX+o) */ OP(dd,36) { EAX; WM( EA, ARG() ); } /* LD (IX+o),n */ OP(dd,37) { illegal_1(); op_37(); } /* DB DD */ OP(dd,38) { illegal_1(); op_38(); } /* DB DD */ OP(dd,39) { ADD16(ix,sp); } /* ADD IX,SP */ OP(dd,3a) { illegal_1(); op_3a(); } /* DB DD */ OP(dd,3b) { illegal_1(); op_3b(); } /* DB DD */ OP(dd,3c) { illegal_1(); op_3c(); } /* DB DD */ OP(dd,3d) { illegal_1(); op_3d(); } /* DB DD */ OP(dd,3e) { illegal_1(); op_3e(); } /* DB DD */ OP(dd,3f) { illegal_1(); op_3f(); } /* DB DD */ OP(dd,40) { illegal_1(); op_40(); } /* DB DD */ OP(dd,41) { illegal_1(); op_41(); } /* DB DD */ OP(dd,42) { illegal_1(); op_42(); } /* DB DD */ OP(dd,43) { illegal_1(); op_43(); } /* DB DD */ OP(dd,44) { B = HX; } /* LD B,HX */ OP(dd,45) { B = LX; } /* LD B,LX */ OP(dd,46) { EAX; B = RM(EA); } /* LD B,(IX+o) */ OP(dd,47) { illegal_1(); op_47(); } /* DB DD */ OP(dd,48) { illegal_1(); op_48(); } /* DB DD */ OP(dd,49) { illegal_1(); op_49(); } /* DB DD */ OP(dd,4a) { illegal_1(); op_4a(); } /* DB DD */ OP(dd,4b) { illegal_1(); op_4b(); } /* DB DD */ OP(dd,4c) { C = HX; } /* LD C,HX */ OP(dd,4d) { C = LX; } /* LD C,LX */ OP(dd,4e) { EAX; C = RM(EA); } /* LD C,(IX+o) */ OP(dd,4f) { illegal_1(); op_4f(); } /* DB DD */ OP(dd,50) { illegal_1(); op_50(); } /* DB DD */ OP(dd,51) { illegal_1(); op_51(); } /* DB DD */ OP(dd,52) { illegal_1(); op_52(); } /* DB DD */ OP(dd,53) { illegal_1(); op_53(); } /* DB DD */ OP(dd,54) { D = HX; } /* LD D,HX */ OP(dd,55) { D = LX; } /* LD D,LX */ OP(dd,56) { EAX; D = RM(EA); } /* LD D,(IX+o) */ OP(dd,57) { illegal_1(); op_57(); } /* DB DD */ OP(dd,58) { illegal_1(); op_58(); } /* DB DD */ OP(dd,59) { illegal_1(); op_59(); } /* DB DD */ OP(dd,5a) { illegal_1(); op_5a(); } /* DB DD */ OP(dd,5b) { illegal_1(); op_5b(); } /* DB DD */ OP(dd,5c) { E = HX; } /* LD E,HX */ OP(dd,5d) { E = LX; } /* LD E,LX */ OP(dd,5e) { EAX; E = RM(EA); } /* LD E,(IX+o) */ OP(dd,5f) { illegal_1(); op_5f(); } /* DB DD */ OP(dd,60) { HX = B; } /* LD HX,B */ OP(dd,61) { HX = C; } /* LD HX,C */ OP(dd,62) { HX = D; } /* LD HX,D */ OP(dd,63) { HX = E; } /* LD HX,E */ OP(dd,64) { } /* LD HX,HX */ OP(dd,65) { HX = LX; } /* LD HX,LX */ OP(dd,66) { EAX; H = RM(EA); } /* LD H,(IX+o) */ OP(dd,67) { HX = A; } /* LD HX,A */ OP(dd,68) { LX = B; } /* LD LX,B */ OP(dd,69) { LX = C; } /* LD LX,C */ OP(dd,6a) { LX = D; } /* LD LX,D */ OP(dd,6b) { LX = E; } /* LD LX,E */ OP(dd,6c) { LX = HX; } /* LD LX,HX */ OP(dd,6d) { } /* LD LX,LX */ OP(dd,6e) { EAX; L = RM(EA); } /* LD L,(IX+o) */ OP(dd,6f) { LX = A; } /* LD LX,A */ OP(dd,70) { EAX; WM( EA, B ); } /* LD (IX+o),B */ OP(dd,71) { EAX; WM( EA, C ); } /* LD (IX+o),C */ OP(dd,72) { EAX; WM( EA, D ); } /* LD (IX+o),D */ OP(dd,73) { EAX; WM( EA, E ); } /* LD (IX+o),E */ OP(dd,74) { EAX; WM( EA, H ); } /* LD (IX+o),H */ OP(dd,75) { EAX; WM( EA, L ); } /* LD (IX+o),L */ OP(dd,76) { illegal_1(); op_76(); } /* DB DD */ OP(dd,77) { EAX; WM( EA, A ); } /* LD (IX+o),A */ OP(dd,78) { illegal_1(); op_78(); } /* DB DD */ OP(dd,79) { illegal_1(); op_79(); } /* DB DD */ OP(dd,7a) { illegal_1(); op_7a(); } /* DB DD */ OP(dd,7b) { illegal_1(); op_7b(); } /* DB DD */ OP(dd,7c) { A = HX; } /* LD A,HX */ OP(dd,7d) { A = LX; } /* LD A,LX */ OP(dd,7e) { EAX; A = RM(EA); } /* LD A,(IX+o) */ OP(dd,7f) { illegal_1(); op_7f(); } /* DB DD */ OP(dd,80) { illegal_1(); op_80(); } /* DB DD */ OP(dd,81) { illegal_1(); op_81(); } /* DB DD */ OP(dd,82) { illegal_1(); op_82(); } /* DB DD */ OP(dd,83) { illegal_1(); op_83(); } /* DB DD */ OP(dd,84) { ADD(HX); } /* ADD A,HX */ OP(dd,85) { ADD(LX); } /* ADD A,LX */ OP(dd,86) { EAX; ADD(RM(EA)); } /* ADD A,(IX+o) */ OP(dd,87) { illegal_1(); op_87(); } /* DB DD */ OP(dd,88) { illegal_1(); op_88(); } /* DB DD */ OP(dd,89) { illegal_1(); op_89(); } /* DB DD */ OP(dd,8a) { illegal_1(); op_8a(); } /* DB DD */ OP(dd,8b) { illegal_1(); op_8b(); } /* DB DD */ OP(dd,8c) { ADC(HX); } /* ADC A,HX */ OP(dd,8d) { ADC(LX); } /* ADC A,LX */ OP(dd,8e) { EAX; ADC(RM(EA)); } /* ADC A,(IX+o) */ OP(dd,8f) { illegal_1(); op_8f(); } /* DB DD */ OP(dd,90) { illegal_1(); op_90(); } /* DB DD */ OP(dd,91) { illegal_1(); op_91(); } /* DB DD */ OP(dd,92) { illegal_1(); op_92(); } /* DB DD */ OP(dd,93) { illegal_1(); op_93(); } /* DB DD */ OP(dd,94) { SUB(HX); } /* SUB HX */ OP(dd,95) { SUB(LX); } /* SUB LX */ OP(dd,96) { EAX; SUB(RM(EA)); } /* SUB (IX+o) */ OP(dd,97) { illegal_1(); op_97(); } /* DB DD */ OP(dd,98) { illegal_1(); op_98(); } /* DB DD */ OP(dd,99) { illegal_1(); op_99(); } /* DB DD */ OP(dd,9a) { illegal_1(); op_9a(); } /* DB DD */ OP(dd,9b) { illegal_1(); op_9b(); } /* DB DD */ OP(dd,9c) { SBC(HX); } /* SBC A,HX */ OP(dd,9d) { SBC(LX); } /* SBC A,LX */ OP(dd,9e) { EAX; SBC(RM(EA)); } /* SBC A,(IX+o) */ OP(dd,9f) { illegal_1(); op_9f(); } /* DB DD */ OP(dd,a0) { illegal_1(); op_a0(); } /* DB DD */ OP(dd,a1) { illegal_1(); op_a1(); } /* DB DD */ OP(dd,a2) { illegal_1(); op_a2(); } /* DB DD */ OP(dd,a3) { illegal_1(); op_a3(); } /* DB DD */ OP(dd,a4) { AND(HX); } /* AND HX */ OP(dd,a5) { AND(LX); } /* AND LX */ OP(dd,a6) { EAX; AND(RM(EA)); } /* AND (IX+o) */ OP(dd,a7) { illegal_1(); op_a7(); } /* DB DD */ OP(dd,a8) { illegal_1(); op_a8(); } /* DB DD */ OP(dd,a9) { illegal_1(); op_a9(); } /* DB DD */ OP(dd,aa) { illegal_1(); op_aa(); } /* DB DD */ OP(dd,ab) { illegal_1(); op_ab(); } /* DB DD */ OP(dd,ac) { XOR(HX); } /* XOR HX */ OP(dd,ad) { XOR(LX); } /* XOR LX */ OP(dd,ae) { EAX; XOR(RM(EA)); } /* XOR (IX+o) */ OP(dd,af) { illegal_1(); op_af(); } /* DB DD */ OP(dd,b0) { illegal_1(); op_b0(); } /* DB DD */ OP(dd,b1) { illegal_1(); op_b1(); } /* DB DD */ OP(dd,b2) { illegal_1(); op_b2(); } /* DB DD */ OP(dd,b3) { illegal_1(); op_b3(); } /* DB DD */ OP(dd,b4) { OR(HX); } /* OR HX */ OP(dd,b5) { OR(LX); } /* OR LX */ OP(dd,b6) { EAX; OR(RM(EA)); } /* OR (IX+o) */ OP(dd,b7) { illegal_1(); op_b7(); } /* DB DD */ OP(dd,b8) { illegal_1(); op_b8(); } /* DB DD */ OP(dd,b9) { illegal_1(); op_b9(); } /* DB DD */ OP(dd,ba) { illegal_1(); op_ba(); } /* DB DD */ OP(dd,bb) { illegal_1(); op_bb(); } /* DB DD */ OP(dd,bc) { CP(HX); } /* CP HX */ OP(dd,bd) { CP(LX); } /* CP LX */ OP(dd,be) { EAX; CP(RM(EA)); } /* CP (IX+o) */ OP(dd,bf) { illegal_1(); op_bf(); } /* DB DD */ OP(dd,c0) { illegal_1(); op_c0(); } /* DB DD */ OP(dd,c1) { illegal_1(); op_c1(); } /* DB DD */ OP(dd,c2) { illegal_1(); op_c2(); } /* DB DD */ OP(dd,c3) { illegal_1(); op_c3(); } /* DB DD */ OP(dd,c4) { illegal_1(); op_c4(); } /* DB DD */ OP(dd,c5) { illegal_1(); op_c5(); } /* DB DD */ OP(dd,c6) { illegal_1(); op_c6(); } /* DB DD */ OP(dd,c7) { illegal_1(); op_c7(); } /* DB DD */ OP(dd,c8) { illegal_1(); op_c8(); } /* DB DD */ OP(dd,c9) { illegal_1(); op_c9(); } /* DB DD */ OP(dd,ca) { illegal_1(); op_ca(); } /* DB DD */ OP(dd,cb) { EAX; EXEC(xycb,ARG()); } /* **** DD CB xx */ OP(dd,cc) { illegal_1(); op_cc(); } /* DB DD */ OP(dd,cd) { illegal_1(); op_cd(); } /* DB DD */ OP(dd,ce) { illegal_1(); op_ce(); } /* DB DD */ OP(dd,cf) { illegal_1(); op_cf(); } /* DB DD */ OP(dd,d0) { illegal_1(); op_d0(); } /* DB DD */ OP(dd,d1) { illegal_1(); op_d1(); } /* DB DD */ OP(dd,d2) { illegal_1(); op_d2(); } /* DB DD */ OP(dd,d3) { illegal_1(); op_d3(); } /* DB DD */ OP(dd,d4) { illegal_1(); op_d4(); } /* DB DD */ OP(dd,d5) { illegal_1(); op_d5(); } /* DB DD */ OP(dd,d6) { illegal_1(); op_d6(); } /* DB DD */ OP(dd,d7) { illegal_1(); op_d7(); } /* DB DD */ OP(dd,d8) { illegal_1(); op_d8(); } /* DB DD */ OP(dd,d9) { illegal_1(); op_d9(); } /* DB DD */ OP(dd,da) { illegal_1(); op_da(); } /* DB DD */ OP(dd,db) { illegal_1(); op_db(); } /* DB DD */ OP(dd,dc) { illegal_1(); op_dc(); } /* DB DD */ OP(dd,dd) { EXEC(dd,ROP()); } /* **** DD DD xx */ OP(dd,de) { illegal_1(); op_de(); } /* DB DD */ OP(dd,df) { illegal_1(); op_df(); } /* DB DD */ OP(dd,e0) { illegal_1(); op_e0(); } /* DB DD */ OP(dd,e1) { POP( ix ); } /* POP IX */ OP(dd,e2) { illegal_1(); op_e2(); } /* DB DD */ OP(dd,e3) { EXSP( ix ); } /* EX (SP),IX */ OP(dd,e4) { illegal_1(); op_e4(); } /* DB DD */ OP(dd,e5) { PUSH( ix ); } /* PUSH IX */ OP(dd,e6) { illegal_1(); op_e6(); } /* DB DD */ OP(dd,e7) { illegal_1(); op_e7(); } /* DB DD */ OP(dd,e8) { illegal_1(); op_e8(); } /* DB DD */ OP(dd,e9) { PC = IX; } /* JP (IX) */ OP(dd,ea) { illegal_1(); op_ea(); } /* DB DD */ OP(dd,eb) { illegal_1(); op_eb(); } /* DB DD */ OP(dd,ec) { illegal_1(); op_ec(); } /* DB DD */ OP(dd,ed) { illegal_1(); op_ed(); } /* DB DD */ OP(dd,ee) { illegal_1(); op_ee(); } /* DB DD */ OP(dd,ef) { illegal_1(); op_ef(); } /* DB DD */ OP(dd,f0) { illegal_1(); op_f0(); } /* DB DD */ OP(dd,f1) { illegal_1(); op_f1(); } /* DB DD */ OP(dd,f2) { illegal_1(); op_f2(); } /* DB DD */ OP(dd,f3) { illegal_1(); op_f3(); } /* DB DD */ OP(dd,f4) { illegal_1(); op_f4(); } /* DB DD */ OP(dd,f5) { illegal_1(); op_f5(); } /* DB DD */ OP(dd,f6) { illegal_1(); op_f6(); } /* DB DD */ OP(dd,f7) { illegal_1(); op_f7(); } /* DB DD */ OP(dd,f8) { illegal_1(); op_f8(); } /* DB DD */ OP(dd,f9) { SP = IX; } /* LD SP,IX */ OP(dd,fa) { illegal_1(); op_fa(); } /* DB DD */ OP(dd,fb) { illegal_1(); op_fb(); } /* DB DD */ OP(dd,fc) { illegal_1(); op_fc(); } /* DB DD */ OP(dd,fd) { EXEC(fd,ROP()); } /* **** DD FD xx */ OP(dd,fe) { illegal_1(); op_fe(); } /* DB DD */ OP(dd,ff) { illegal_1(); op_ff(); } /* DB DD */ /********************************************************** * IY register related opcodes (FD prefix) **********************************************************/ OP(fd,00) { illegal_1(); op_00(); } /* DB FD */ OP(fd,01) { illegal_1(); op_01(); } /* DB FD */ OP(fd,02) { illegal_1(); op_02(); } /* DB FD */ OP(fd,03) { illegal_1(); op_03(); } /* DB FD */ OP(fd,04) { illegal_1(); op_04(); } /* DB FD */ OP(fd,05) { illegal_1(); op_05(); } /* DB FD */ OP(fd,06) { illegal_1(); op_06(); } /* DB FD */ OP(fd,07) { illegal_1(); op_07(); } /* DB FD */ OP(fd,08) { illegal_1(); op_08(); } /* DB FD */ OP(fd,09) { ADD16(iy,bc); } /* ADD IY,BC */ OP(fd,0a) { illegal_1(); op_0a(); } /* DB FD */ OP(fd,0b) { illegal_1(); op_0b(); } /* DB FD */ OP(fd,0c) { illegal_1(); op_0c(); } /* DB FD */ OP(fd,0d) { illegal_1(); op_0d(); } /* DB FD */ OP(fd,0e) { illegal_1(); op_0e(); } /* DB FD */ OP(fd,0f) { illegal_1(); op_0f(); } /* DB FD */ OP(fd,10) { illegal_1(); op_10(); } /* DB FD */ OP(fd,11) { illegal_1(); op_11(); } /* DB FD */ OP(fd,12) { illegal_1(); op_12(); } /* DB FD */ OP(fd,13) { illegal_1(); op_13(); } /* DB FD */ OP(fd,14) { illegal_1(); op_14(); } /* DB FD */ OP(fd,15) { illegal_1(); op_15(); } /* DB FD */ OP(fd,16) { illegal_1(); op_16(); } /* DB FD */ OP(fd,17) { illegal_1(); op_17(); } /* DB FD */ OP(fd,18) { illegal_1(); op_18(); } /* DB FD */ OP(fd,19) { ADD16(iy,de); } /* ADD IY,DE */ OP(fd,1a) { illegal_1(); op_1a(); } /* DB FD */ OP(fd,1b) { illegal_1(); op_1b(); } /* DB FD */ OP(fd,1c) { illegal_1(); op_1c(); } /* DB FD */ OP(fd,1d) { illegal_1(); op_1d(); } /* DB FD */ OP(fd,1e) { illegal_1(); op_1e(); } /* DB FD */ OP(fd,1f) { illegal_1(); op_1f(); } /* DB FD */ OP(fd,20) { illegal_1(); op_20(); } /* DB FD */ OP(fd,21) { IY = ARG16(); } /* LD IY,w */ OP(fd,22) { EA = ARG16(); WM16( EA, &Z80.iy ); WZ = EA+1; } /* LD (w),IY */ OP(fd,23) { IY++; } /* INC IY */ OP(fd,24) { HY = INC(HY); } /* INC HY */ OP(fd,25) { HY = DEC(HY); } /* DEC HY */ OP(fd,26) { HY = ARG(); } /* LD HY,n */ OP(fd,27) { illegal_1(); op_27(); } /* DB FD */ OP(fd,28) { illegal_1(); op_28(); } /* DB FD */ OP(fd,29) { ADD16(iy,iy); } /* ADD IY,IY */ OP(fd,2a) { EA = ARG16(); RM16( EA, &Z80.iy ); WZ = EA+1; } /* LD IY,(w) */ OP(fd,2b) { IY--; } /* DEC IY */ OP(fd,2c) { LY = INC(LY); } /* INC LY */ OP(fd,2d) { LY = DEC(LY); } /* DEC LY */ OP(fd,2e) { LY = ARG(); } /* LD LY,n */ OP(fd,2f) { illegal_1(); op_2f(); } /* DB FD */ OP(fd,30) { illegal_1(); op_30(); } /* DB FD */ OP(fd,31) { illegal_1(); op_31(); } /* DB FD */ OP(fd,32) { illegal_1(); op_32(); } /* DB FD */ OP(fd,33) { illegal_1(); op_33(); } /* DB FD */ OP(fd,34) { EAY; WM( EA, INC(RM(EA)) ); } /* INC (IY+o) */ OP(fd,35) { EAY; WM( EA, DEC(RM(EA)) ); } /* DEC (IY+o) */ OP(fd,36) { EAY; WM( EA, ARG() ); } /* LD (IY+o),n */ OP(fd,37) { illegal_1(); op_37(); } /* DB FD */ OP(fd,38) { illegal_1(); op_38(); } /* DB FD */ OP(fd,39) { ADD16(iy,sp); } /* ADD IY,SP */ OP(fd,3a) { illegal_1(); op_3a(); } /* DB FD */ OP(fd,3b) { illegal_1(); op_3b(); } /* DB FD */ OP(fd,3c) { illegal_1(); op_3c(); } /* DB FD */ OP(fd,3d) { illegal_1(); op_3d(); } /* DB FD */ OP(fd,3e) { illegal_1(); op_3e(); } /* DB FD */ OP(fd,3f) { illegal_1(); op_3f(); } /* DB FD */ OP(fd,40) { illegal_1(); op_40(); } /* DB FD */ OP(fd,41) { illegal_1(); op_41(); } /* DB FD */ OP(fd,42) { illegal_1(); op_42(); } /* DB FD */ OP(fd,43) { illegal_1(); op_43(); } /* DB FD */ OP(fd,44) { B = HY; } /* LD B,HY */ OP(fd,45) { B = LY; } /* LD B,LY */ OP(fd,46) { EAY; B = RM(EA); } /* LD B,(IY+o) */ OP(fd,47) { illegal_1(); op_47(); } /* DB FD */ OP(fd,48) { illegal_1(); op_48(); } /* DB FD */ OP(fd,49) { illegal_1(); op_49(); } /* DB FD */ OP(fd,4a) { illegal_1(); op_4a(); } /* DB FD */ OP(fd,4b) { illegal_1(); op_4b(); } /* DB FD */ OP(fd,4c) { C = HY; } /* LD C,HY */ OP(fd,4d) { C = LY; } /* LD C,LY */ OP(fd,4e) { EAY; C = RM(EA); } /* LD C,(IY+o) */ OP(fd,4f) { illegal_1(); op_4f(); } /* DB FD */ OP(fd,50) { illegal_1(); op_50(); } /* DB FD */ OP(fd,51) { illegal_1(); op_51(); } /* DB FD */ OP(fd,52) { illegal_1(); op_52(); } /* DB FD */ OP(fd,53) { illegal_1(); op_53(); } /* DB FD */ OP(fd,54) { D = HY; } /* LD D,HY */ OP(fd,55) { D = LY; } /* LD D,LY */ OP(fd,56) { EAY; D = RM(EA); } /* LD D,(IY+o) */ OP(fd,57) { illegal_1(); op_57(); } /* DB FD */ OP(fd,58) { illegal_1(); op_58(); } /* DB FD */ OP(fd,59) { illegal_1(); op_59(); } /* DB FD */ OP(fd,5a) { illegal_1(); op_5a(); } /* DB FD */ OP(fd,5b) { illegal_1(); op_5b(); } /* DB FD */ OP(fd,5c) { E = HY; } /* LD E,HY */ OP(fd,5d) { E = LY; } /* LD E,LY */ OP(fd,5e) { EAY; E = RM(EA); } /* LD E,(IY+o) */ OP(fd,5f) { illegal_1(); op_5f(); } /* DB FD */ OP(fd,60) { HY = B; } /* LD HY,B */ OP(fd,61) { HY = C; } /* LD HY,C */ OP(fd,62) { HY = D; } /* LD HY,D */ OP(fd,63) { HY = E; } /* LD HY,E */ OP(fd,64) { } /* LD HY,HY */ OP(fd,65) { HY = LY; } /* LD HY,LY */ OP(fd,66) { EAY; H = RM(EA); } /* LD H,(IY+o) */ OP(fd,67) { HY = A; } /* LD HY,A */ OP(fd,68) { LY = B; } /* LD LY,B */ OP(fd,69) { LY = C; } /* LD LY,C */ OP(fd,6a) { LY = D; } /* LD LY,D */ OP(fd,6b) { LY = E; } /* LD LY,E */ OP(fd,6c) { LY = HY; } /* LD LY,HY */ OP(fd,6d) { } /* LD LY,LY */ OP(fd,6e) { EAY; L = RM(EA); } /* LD L,(IY+o) */ OP(fd,6f) { LY = A; } /* LD LY,A */ OP(fd,70) { EAY; WM( EA, B ); } /* LD (IY+o),B */ OP(fd,71) { EAY; WM( EA, C ); } /* LD (IY+o),C */ OP(fd,72) { EAY; WM( EA, D ); } /* LD (IY+o),D */ OP(fd,73) { EAY; WM( EA, E ); } /* LD (IY+o),E */ OP(fd,74) { EAY; WM( EA, H ); } /* LD (IY+o),H */ OP(fd,75) { EAY; WM( EA, L ); } /* LD (IY+o),L */ OP(fd,76) { illegal_1(); op_76(); } /* DB FD */ OP(fd,77) { EAY; WM( EA, A ); } /* LD (IY+o),A */ OP(fd,78) { illegal_1(); op_78(); } /* DB FD */ OP(fd,79) { illegal_1(); op_79(); } /* DB FD */ OP(fd,7a) { illegal_1(); op_7a(); } /* DB FD */ OP(fd,7b) { illegal_1(); op_7b(); } /* DB FD */ OP(fd,7c) { A = HY; } /* LD A,HY */ OP(fd,7d) { A = LY; } /* LD A,LY */ OP(fd,7e) { EAY; A = RM(EA); } /* LD A,(IY+o) */ OP(fd,7f) { illegal_1(); op_7f(); } /* DB FD */ OP(fd,80) { illegal_1(); op_80(); } /* DB FD */ OP(fd,81) { illegal_1(); op_81(); } /* DB FD */ OP(fd,82) { illegal_1(); op_82(); } /* DB FD */ OP(fd,83) { illegal_1(); op_83(); } /* DB FD */ OP(fd,84) { ADD(HY); } /* ADD A,HY */ OP(fd,85) { ADD(LY); } /* ADD A,LY */ OP(fd,86) { EAY; ADD(RM(EA)); } /* ADD A,(IY+o) */ OP(fd,87) { illegal_1(); op_87(); } /* DB FD */ OP(fd,88) { illegal_1(); op_88(); } /* DB FD */ OP(fd,89) { illegal_1(); op_89(); } /* DB FD */ OP(fd,8a) { illegal_1(); op_8a(); } /* DB FD */ OP(fd,8b) { illegal_1(); op_8b(); } /* DB FD */ OP(fd,8c) { ADC(HY); } /* ADC A,HY */ OP(fd,8d) { ADC(LY); } /* ADC A,LY */ OP(fd,8e) { EAY; ADC(RM(EA)); } /* ADC A,(IY+o) */ OP(fd,8f) { illegal_1(); op_8f(); } /* DB FD */ OP(fd,90) { illegal_1(); op_90(); } /* DB FD */ OP(fd,91) { illegal_1(); op_91(); } /* DB FD */ OP(fd,92) { illegal_1(); op_92(); } /* DB FD */ OP(fd,93) { illegal_1(); op_93(); } /* DB FD */ OP(fd,94) { SUB(HY); } /* SUB HY */ OP(fd,95) { SUB(LY); } /* SUB LY */ OP(fd,96) { EAY; SUB(RM(EA)); } /* SUB (IY+o) */ OP(fd,97) { illegal_1(); op_97(); } /* DB FD */ OP(fd,98) { illegal_1(); op_98(); } /* DB FD */ OP(fd,99) { illegal_1(); op_99(); } /* DB FD */ OP(fd,9a) { illegal_1(); op_9a(); } /* DB FD */ OP(fd,9b) { illegal_1(); op_9b(); } /* DB FD */ OP(fd,9c) { SBC(HY); } /* SBC A,HY */ OP(fd,9d) { SBC(LY); } /* SBC A,LY */ OP(fd,9e) { EAY; SBC(RM(EA)); } /* SBC A,(IY+o) */ OP(fd,9f) { illegal_1(); op_9f(); } /* DB FD */ OP(fd,a0) { illegal_1(); op_a0(); } /* DB FD */ OP(fd,a1) { illegal_1(); op_a1(); } /* DB FD */ OP(fd,a2) { illegal_1(); op_a2(); } /* DB FD */ OP(fd,a3) { illegal_1(); op_a3(); } /* DB FD */ OP(fd,a4) { AND(HY); } /* AND HY */ OP(fd,a5) { AND(LY); } /* AND LY */ OP(fd,a6) { EAY; AND(RM(EA)); } /* AND (IY+o) */ OP(fd,a7) { illegal_1(); op_a7(); } /* DB FD */ OP(fd,a8) { illegal_1(); op_a8(); } /* DB FD */ OP(fd,a9) { illegal_1(); op_a9(); } /* DB FD */ OP(fd,aa) { illegal_1(); op_aa(); } /* DB FD */ OP(fd,ab) { illegal_1(); op_ab(); } /* DB FD */ OP(fd,ac) { XOR(HY); } /* XOR HY */ OP(fd,ad) { XOR(LY); } /* XOR LY */ OP(fd,ae) { EAY; XOR(RM(EA)); } /* XOR (IY+o) */ OP(fd,af) { illegal_1(); op_af(); } /* DB FD */ OP(fd,b0) { illegal_1(); op_b0(); } /* DB FD */ OP(fd,b1) { illegal_1(); op_b1(); } /* DB FD */ OP(fd,b2) { illegal_1(); op_b2(); } /* DB FD */ OP(fd,b3) { illegal_1(); op_b3(); } /* DB FD */ OP(fd,b4) { OR(HY); } /* OR HY */ OP(fd,b5) { OR(LY); } /* OR LY */ OP(fd,b6) { EAY; OR(RM(EA)); } /* OR (IY+o) */ OP(fd,b7) { illegal_1(); op_b7(); } /* DB FD */ OP(fd,b8) { illegal_1(); op_b8(); } /* DB FD */ OP(fd,b9) { illegal_1(); op_b9(); } /* DB FD */ OP(fd,ba) { illegal_1(); op_ba(); } /* DB FD */ OP(fd,bb) { illegal_1(); op_bb(); } /* DB FD */ OP(fd,bc) { CP(HY); } /* CP HY */ OP(fd,bd) { CP(LY); } /* CP LY */ OP(fd,be) { EAY; CP(RM(EA)); } /* CP (IY+o) */ OP(fd,bf) { illegal_1(); op_bf(); } /* DB FD */ OP(fd,c0) { illegal_1(); op_c0(); } /* DB FD */ OP(fd,c1) { illegal_1(); op_c1(); } /* DB FD */ OP(fd,c2) { illegal_1(); op_c2(); } /* DB FD */ OP(fd,c3) { illegal_1(); op_c3(); } /* DB FD */ OP(fd,c4) { illegal_1(); op_c4(); } /* DB FD */ OP(fd,c5) { illegal_1(); op_c5(); } /* DB FD */ OP(fd,c6) { illegal_1(); op_c6(); } /* DB FD */ OP(fd,c7) { illegal_1(); op_c7(); } /* DB FD */ OP(fd,c8) { illegal_1(); op_c8(); } /* DB FD */ OP(fd,c9) { illegal_1(); op_c9(); } /* DB FD */ OP(fd,ca) { illegal_1(); op_ca(); } /* DB FD */ OP(fd,cb) { EAY; EXEC(xycb,ARG()); } /* **** FD CB xx */ OP(fd,cc) { illegal_1(); op_cc(); } /* DB FD */ OP(fd,cd) { illegal_1(); op_cd(); } /* DB FD */ OP(fd,ce) { illegal_1(); op_ce(); } /* DB FD */ OP(fd,cf) { illegal_1(); op_cf(); } /* DB FD */ OP(fd,d0) { illegal_1(); op_d0(); } /* DB FD */ OP(fd,d1) { illegal_1(); op_d1(); } /* DB FD */ OP(fd,d2) { illegal_1(); op_d2(); } /* DB FD */ OP(fd,d3) { illegal_1(); op_d3(); } /* DB FD */ OP(fd,d4) { illegal_1(); op_d4(); } /* DB FD */ OP(fd,d5) { illegal_1(); op_d5(); } /* DB FD */ OP(fd,d6) { illegal_1(); op_d6(); } /* DB FD */ OP(fd,d7) { illegal_1(); op_d7(); } /* DB FD */ OP(fd,d8) { illegal_1(); op_d8(); } /* DB FD */ OP(fd,d9) { illegal_1(); op_d9(); } /* DB FD */ OP(fd,da) { illegal_1(); op_da(); } /* DB FD */ OP(fd,db) { illegal_1(); op_db(); } /* DB FD */ OP(fd,dc) { illegal_1(); op_dc(); } /* DB FD */ OP(fd,dd) { EXEC(dd,ROP()); } /* **** FD DD xx */ OP(fd,de) { illegal_1(); op_de(); } /* DB FD */ OP(fd,df) { illegal_1(); op_df(); } /* DB FD */ OP(fd,e0) { illegal_1(); op_e0(); } /* DB FD */ OP(fd,e1) { POP( iy ); } /* POP IY */ OP(fd,e2) { illegal_1(); op_e2(); } /* DB FD */ OP(fd,e3) { EXSP( iy ); } /* EX (SP),IY */ OP(fd,e4) { illegal_1(); op_e4(); } /* DB FD */ OP(fd,e5) { PUSH( iy ); } /* PUSH IY */ OP(fd,e6) { illegal_1(); op_e6(); } /* DB FD */ OP(fd,e7) { illegal_1(); op_e7(); } /* DB FD */ OP(fd,e8) { illegal_1(); op_e8(); } /* DB FD */ OP(fd,e9) { PC = IY; } /* JP (IY) */ OP(fd,ea) { illegal_1(); op_ea(); } /* DB FD */ OP(fd,eb) { illegal_1(); op_eb(); } /* DB FD */ OP(fd,ec) { illegal_1(); op_ec(); } /* DB FD */ OP(fd,ed) { illegal_1(); op_ed(); } /* DB FD */ OP(fd,ee) { illegal_1(); op_ee(); } /* DB FD */ OP(fd,ef) { illegal_1(); op_ef(); } /* DB FD */ OP(fd,f0) { illegal_1(); op_f0(); } /* DB FD */ OP(fd,f1) { illegal_1(); op_f1(); } /* DB FD */ OP(fd,f2) { illegal_1(); op_f2(); } /* DB FD */ OP(fd,f3) { illegal_1(); op_f3(); } /* DB FD */ OP(fd,f4) { illegal_1(); op_f4(); } /* DB FD */ OP(fd,f5) { illegal_1(); op_f5(); } /* DB FD */ OP(fd,f6) { illegal_1(); op_f6(); } /* DB FD */ OP(fd,f7) { illegal_1(); op_f7(); } /* DB FD */ OP(fd,f8) { illegal_1(); op_f8(); } /* DB FD */ OP(fd,f9) { SP = IY; } /* LD SP,IY */ OP(fd,fa) { illegal_1(); op_fa(); } /* DB FD */ OP(fd,fb) { illegal_1(); op_fb(); } /* DB FD */ OP(fd,fc) { illegal_1(); op_fc(); } /* DB FD */ OP(fd,fd) { EXEC(fd,ROP()); } /* **** FD FD xx */ OP(fd,fe) { illegal_1(); op_fe(); } /* DB FD */ OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD */ OP(illegal,2) { #if VERBOSE logerror("Z80 #%d ill. opcode $ed $%02x\n", cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff)); #endif } /********************************************************** * special opcodes (ED prefix) **********************************************************/ OP(ed,00) { illegal_2(); } /* DB ED */ OP(ed,01) { illegal_2(); } /* DB ED */ OP(ed,02) { illegal_2(); } /* DB ED */ OP(ed,03) { illegal_2(); } /* DB ED */ OP(ed,04) { illegal_2(); } /* DB ED */ OP(ed,05) { illegal_2(); } /* DB ED */ OP(ed,06) { illegal_2(); } /* DB ED */ OP(ed,07) { illegal_2(); } /* DB ED */ OP(ed,08) { illegal_2(); } /* DB ED */ OP(ed,09) { illegal_2(); } /* DB ED */ OP(ed,0a) { illegal_2(); } /* DB ED */ OP(ed,0b) { illegal_2(); } /* DB ED */ OP(ed,0c) { illegal_2(); } /* DB ED */ OP(ed,0d) { illegal_2(); } /* DB ED */ OP(ed,0e) { illegal_2(); } /* DB ED */ OP(ed,0f) { illegal_2(); } /* DB ED */ OP(ed,10) { illegal_2(); } /* DB ED */ OP(ed,11) { illegal_2(); } /* DB ED */ OP(ed,12) { illegal_2(); } /* DB ED */ OP(ed,13) { illegal_2(); } /* DB ED */ OP(ed,14) { illegal_2(); } /* DB ED */ OP(ed,15) { illegal_2(); } /* DB ED */ OP(ed,16) { illegal_2(); } /* DB ED */ OP(ed,17) { illegal_2(); } /* DB ED */ OP(ed,18) { illegal_2(); } /* DB ED */ OP(ed,19) { illegal_2(); } /* DB ED */ OP(ed,1a) { illegal_2(); } /* DB ED */ OP(ed,1b) { illegal_2(); } /* DB ED */ OP(ed,1c) { illegal_2(); } /* DB ED */ OP(ed,1d) { illegal_2(); } /* DB ED */ OP(ed,1e) { illegal_2(); } /* DB ED */ OP(ed,1f) { illegal_2(); } /* DB ED */ OP(ed,20) { illegal_2(); } /* DB ED */ OP(ed,21) { illegal_2(); } /* DB ED */ OP(ed,22) { illegal_2(); } /* DB ED */ OP(ed,23) { illegal_2(); } /* DB ED */ OP(ed,24) { illegal_2(); } /* DB ED */ OP(ed,25) { illegal_2(); } /* DB ED */ OP(ed,26) { illegal_2(); } /* DB ED */ OP(ed,27) { illegal_2(); } /* DB ED */ OP(ed,28) { illegal_2(); } /* DB ED */ OP(ed,29) { illegal_2(); } /* DB ED */ OP(ed,2a) { illegal_2(); } /* DB ED */ OP(ed,2b) { illegal_2(); } /* DB ED */ OP(ed,2c) { illegal_2(); } /* DB ED */ OP(ed,2d) { illegal_2(); } /* DB ED */ OP(ed,2e) { illegal_2(); } /* DB ED */ OP(ed,2f) { illegal_2(); } /* DB ED */ OP(ed,30) { illegal_2(); } /* DB ED */ OP(ed,31) { illegal_2(); } /* DB ED */ OP(ed,32) { illegal_2(); } /* DB ED */ OP(ed,33) { illegal_2(); } /* DB ED */ OP(ed,34) { illegal_2(); } /* DB ED */ OP(ed,35) { illegal_2(); } /* DB ED */ OP(ed,36) { illegal_2(); } /* DB ED */ OP(ed,37) { illegal_2(); } /* DB ED */ OP(ed,38) { illegal_2(); } /* DB ED */ OP(ed,39) { illegal_2(); } /* DB ED */ OP(ed,3a) { illegal_2(); } /* DB ED */ OP(ed,3b) { illegal_2(); } /* DB ED */ OP(ed,3c) { illegal_2(); } /* DB ED */ OP(ed,3d) { illegal_2(); } /* DB ED */ OP(ed,3e) { illegal_2(); } /* DB ED */ OP(ed,3f) { illegal_2(); } /* DB ED */ OP(ed,40) { B = IN(BC); F = (F & CF) | SZP[B]; } /* IN B,(C) */ OP(ed,41) { OUT(BC, B); } /* OUT (C),B */ OP(ed,42) { SBC16( bc ); } /* SBC HL,BC */ OP(ed,43) { EA = ARG16(); WM16( EA, &Z80.bc ); WZ = EA+1; } /* LD (w),BC */ OP(ed,44) { NEG; } /* NEG */ OP(ed,45) { RETN; } /* RETN; */ OP(ed,46) { IM = 0; } /* IM 0 */ OP(ed,47) { LD_I_A; } /* LD I,A */ OP(ed,48) { C = IN(BC); F = (F & CF) | SZP[C]; } /* IN C,(C) */ OP(ed,49) { OUT(BC, C); } /* OUT (C),C */ OP(ed,4a) { ADC16( bc ); } /* ADC HL,BC */ OP(ed,4b) { EA = ARG16(); RM16( EA, &Z80.bc ); WZ = EA+1; } /* LD BC,(w) */ OP(ed,4c) { NEG; } /* NEG */ OP(ed,4d) { RETI; } /* RETI */ OP(ed,4e) { IM = 0; } /* IM 0 */ OP(ed,4f) { LD_R_A; } /* LD R,A */ OP(ed,50) { D = IN(BC); F = (F & CF) | SZP[D]; } /* IN D,(C) */ OP(ed,51) { OUT(BC, D); } /* OUT (C),D */ OP(ed,52) { SBC16( de ); } /* SBC HL,DE */ OP(ed,53) { EA = ARG16(); WM16( EA, &Z80.de ); WZ = EA+1; } /* LD (w),DE */ OP(ed,54) { NEG; } /* NEG */ OP(ed,55) { RETN; } /* RETN; */ OP(ed,56) { IM = 1; } /* IM 1 */ OP(ed,57) { LD_A_I; } /* LD A,I */ OP(ed,58) { E = IN(BC); F = (F & CF) | SZP[E]; } /* IN E,(C) */ OP(ed,59) { OUT(BC, E); } /* OUT (C),E */ OP(ed,5a) { ADC16( de ); } /* ADC HL,DE */ OP(ed,5b) { EA = ARG16(); RM16( EA, &Z80.de ); WZ = EA+1; } /* LD DE,(w) */ OP(ed,5c) { NEG; } /* NEG */ OP(ed,5d) { RETI; } /* RETI */ OP(ed,5e) { IM = 2; } /* IM 2 */ OP(ed,5f) { LD_A_R; } /* LD A,R */ OP(ed,60) { H = IN(BC); F = (F & CF) | SZP[H]; } /* IN H,(C) */ OP(ed,61) { OUT(BC, H); } /* OUT (C),H */ OP(ed,62) { SBC16( hl ); } /* SBC HL,HL */ OP(ed,63) { EA = ARG16(); WM16( EA, &Z80.hl ); WZ = EA+1; } /* LD (w),HL */ OP(ed,64) { NEG; } /* NEG */ OP(ed,65) { RETN; } /* RETN; */ OP(ed,66) { IM = 0; } /* IM 0 */ OP(ed,67) { RRD; } /* RRD (HL) */ OP(ed,68) { L = IN(BC); F = (F & CF) | SZP[L]; } /* IN L,(C) */ OP(ed,69) { OUT(BC, L); } /* OUT (C),L */ OP(ed,6a) { ADC16( hl ); } /* ADC HL,HL */ OP(ed,6b) { EA = ARG16(); RM16( EA, &Z80.hl ); WZ = EA+1; } /* LD HL,(w) */ OP(ed,6c) { NEG; } /* NEG */ OP(ed,6d) { RETI; } /* RETI */ OP(ed,6e) { IM = 0; } /* IM 0 */ OP(ed,6f) { RLD; } /* RLD (HL) */ OP(ed,70) { UINT8 res = IN(BC); F = (F & CF) | SZP[res]; } /* IN 0,(C) */ OP(ed,71) { OUT(BC, 0); } /* OUT (C),0 */ OP(ed,72) { SBC16( sp ); } /* SBC HL,SP */ OP(ed,73) { EA = ARG16(); WM16( EA, &Z80.sp ); WZ = EA+1; } /* LD (w),SP */ OP(ed,74) { NEG; } /* NEG */ OP(ed,75) { RETN; } /* RETN; */ OP(ed,76) { IM = 1; } /* IM 1 */ OP(ed,77) { illegal_2(); } /* DB ED,77 */ OP(ed,78) { A = IN(BC); F = (F & CF) | SZP[A]; WZ = BC+1; } /* IN E,(C) */ OP(ed,79) { OUT(BC, A); WZ = BC + 1; } /* OUT (C),A */ OP(ed,7a) { ADC16( sp ); } /* ADC HL,SP */ OP(ed,7b) { EA = ARG16(); RM16( EA, &Z80.sp ); WZ = EA+1; } /* LD SP,(w) */ OP(ed,7c) { NEG; } /* NEG */ OP(ed,7d) { RETI; } /* RETI */ OP(ed,7e) { IM = 2; } /* IM 2 */ OP(ed,7f) { illegal_2(); } /* DB ED,7F */ OP(ed,80) { illegal_2(); } /* DB ED */ OP(ed,81) { illegal_2(); } /* DB ED */ OP(ed,82) { illegal_2(); } /* DB ED */ OP(ed,83) { illegal_2(); } /* DB ED */ OP(ed,84) { illegal_2(); } /* DB ED */ OP(ed,85) { illegal_2(); } /* DB ED */ OP(ed,86) { illegal_2(); } /* DB ED */ OP(ed,87) { illegal_2(); } /* DB ED */ OP(ed,88) { illegal_2(); } /* DB ED */ OP(ed,89) { illegal_2(); } /* DB ED */ OP(ed,8a) { illegal_2(); } /* DB ED */ OP(ed,8b) { illegal_2(); } /* DB ED */ OP(ed,8c) { illegal_2(); } /* DB ED */ OP(ed,8d) { illegal_2(); } /* DB ED */ OP(ed,8e) { illegal_2(); } /* DB ED */ OP(ed,8f) { illegal_2(); } /* DB ED */ OP(ed,90) { illegal_2(); } /* DB ED */ OP(ed,91) { illegal_2(); } /* DB ED */ OP(ed,92) { illegal_2(); } /* DB ED */ OP(ed,93) { illegal_2(); } /* DB ED */ OP(ed,94) { illegal_2(); } /* DB ED */ OP(ed,95) { illegal_2(); } /* DB ED */ OP(ed,96) { illegal_2(); } /* DB ED */ OP(ed,97) { illegal_2(); } /* DB ED */ OP(ed,98) { illegal_2(); } /* DB ED */ OP(ed,99) { illegal_2(); } /* DB ED */ OP(ed,9a) { illegal_2(); } /* DB ED */ OP(ed,9b) { illegal_2(); } /* DB ED */ OP(ed,9c) { illegal_2(); } /* DB ED */ OP(ed,9d) { illegal_2(); } /* DB ED */ OP(ed,9e) { illegal_2(); } /* DB ED */ OP(ed,9f) { illegal_2(); } /* DB ED */ OP(ed,a0) { LDI; } /* LDI */ OP(ed,a1) { CPI; } /* CPI */ OP(ed,a2) { INI; } /* INI */ OP(ed,a3) { OUTI; } /* OUTI */ OP(ed,a4) { illegal_2(); } /* DB ED */ OP(ed,a5) { illegal_2(); } /* DB ED */ OP(ed,a6) { illegal_2(); } /* DB ED */ OP(ed,a7) { illegal_2(); } /* DB ED */ OP(ed,a8) { LDD; } /* LDD */ OP(ed,a9) { CPD; } /* CPD */ OP(ed,aa) { IND; } /* IND */ OP(ed,ab) { OUTD; } /* OUTD */ OP(ed,ac) { illegal_2(); } /* DB ED */ OP(ed,ad) { illegal_2(); } /* DB ED */ OP(ed,ae) { illegal_2(); } /* DB ED */ OP(ed,af) { illegal_2(); } /* DB ED */ OP(ed,b0) { LDIR; } /* LDIR */ OP(ed,b1) { CPIR; } /* CPIR */ OP(ed,b2) { INIR; } /* INIR */ OP(ed,b3) { OTIR; } /* OTIR */ OP(ed,b4) { illegal_2(); } /* DB ED */ OP(ed,b5) { illegal_2(); } /* DB ED */ OP(ed,b6) { illegal_2(); } /* DB ED */ OP(ed,b7) { illegal_2(); } /* DB ED */ OP(ed,b8) { LDDR; } /* LDDR */ OP(ed,b9) { CPDR; } /* CPDR */ OP(ed,ba) { INDR; } /* INDR */ OP(ed,bb) { OTDR; } /* OTDR */ OP(ed,bc) { illegal_2(); } /* DB ED */ OP(ed,bd) { illegal_2(); } /* DB ED */ OP(ed,be) { illegal_2(); } /* DB ED */ OP(ed,bf) { illegal_2(); } /* DB ED */ OP(ed,c0) { illegal_2(); } /* DB ED */ OP(ed,c1) { illegal_2(); } /* DB ED */ OP(ed,c2) { illegal_2(); } /* DB ED */ OP(ed,c3) { illegal_2(); } /* DB ED */ OP(ed,c4) { illegal_2(); } /* DB ED */ OP(ed,c5) { illegal_2(); } /* DB ED */ OP(ed,c6) { illegal_2(); } /* DB ED */ OP(ed,c7) { illegal_2(); } /* DB ED */ OP(ed,c8) { illegal_2(); } /* DB ED */ OP(ed,c9) { illegal_2(); } /* DB ED */ OP(ed,ca) { illegal_2(); } /* DB ED */ OP(ed,cb) { illegal_2(); } /* DB ED */ OP(ed,cc) { illegal_2(); } /* DB ED */ OP(ed,cd) { illegal_2(); } /* DB ED */ OP(ed,ce) { illegal_2(); } /* DB ED */ OP(ed,cf) { illegal_2(); } /* DB ED */ OP(ed,d0) { illegal_2(); } /* DB ED */ OP(ed,d1) { illegal_2(); } /* DB ED */ OP(ed,d2) { illegal_2(); } /* DB ED */ OP(ed,d3) { illegal_2(); } /* DB ED */ OP(ed,d4) { illegal_2(); } /* DB ED */ OP(ed,d5) { illegal_2(); } /* DB ED */ OP(ed,d6) { illegal_2(); } /* DB ED */ OP(ed,d7) { illegal_2(); } /* DB ED */ OP(ed,d8) { illegal_2(); } /* DB ED */ OP(ed,d9) { illegal_2(); } /* DB ED */ OP(ed,da) { illegal_2(); } /* DB ED */ OP(ed,db) { illegal_2(); } /* DB ED */ OP(ed,dc) { illegal_2(); } /* DB ED */ OP(ed,dd) { illegal_2(); } /* DB ED */ OP(ed,de) { illegal_2(); } /* DB ED */ OP(ed,df) { illegal_2(); } /* DB ED */ OP(ed,e0) { illegal_2(); } /* DB ED */ OP(ed,e1) { illegal_2(); } /* DB ED */ OP(ed,e2) { illegal_2(); } /* DB ED */ OP(ed,e3) { illegal_2(); } /* DB ED */ OP(ed,e4) { illegal_2(); } /* DB ED */ OP(ed,e5) { illegal_2(); } /* DB ED */ OP(ed,e6) { illegal_2(); } /* DB ED */ OP(ed,e7) { illegal_2(); } /* DB ED */ OP(ed,e8) { illegal_2(); } /* DB ED */ OP(ed,e9) { illegal_2(); } /* DB ED */ OP(ed,ea) { illegal_2(); } /* DB ED */ OP(ed,eb) { illegal_2(); } /* DB ED */ OP(ed,ec) { illegal_2(); } /* DB ED */ OP(ed,ed) { illegal_2(); } /* DB ED */ OP(ed,ee) { illegal_2(); } /* DB ED */ OP(ed,ef) { illegal_2(); } /* DB ED */ OP(ed,f0) { illegal_2(); } /* DB ED */ OP(ed,f1) { illegal_2(); } /* DB ED */ OP(ed,f2) { illegal_2(); } /* DB ED */ OP(ed,f3) { illegal_2(); } /* DB ED */ OP(ed,f4) { illegal_2(); } /* DB ED */ OP(ed,f5) { illegal_2(); } /* DB ED */ OP(ed,f6) { illegal_2(); } /* DB ED */ OP(ed,f7) { illegal_2(); } /* DB ED */ OP(ed,f8) { illegal_2(); } /* DB ED */ OP(ed,f9) { illegal_2(); } /* DB ED */ OP(ed,fa) { illegal_2(); } /* DB ED */ OP(ed,fb) { illegal_2(); } /* DB ED */ OP(ed,fc) { illegal_2(); } /* DB ED */ OP(ed,fd) { illegal_2(); } /* DB ED */ OP(ed,fe) { illegal_2(); } /* DB ED */ OP(ed,ff) { illegal_2(); } /* DB ED */ /********************************************************** * main opcodes **********************************************************/ OP(op,00) { } /* NOP */ OP(op,01) { BC = ARG16(); } /* LD BC,w */ OP(op,02) { WM( BC, A ); WZ_L = (BC + 1) & 0xFF; WZ_H = A; } /* LD (BC),A */ OP(op,03) { BC++; } /* INC BC */ OP(op,04) { B = INC(B); } /* INC B */ OP(op,05) { B = DEC(B); } /* DEC B */ OP(op,06) { B = ARG(); } /* LD B,n */ OP(op,07) { RLCA; } /* RLCA */ OP(op,08) { EX_AF; } /* EX AF,AF' */ OP(op,09) { ADD16(hl, bc); } /* ADD HL,BC */ OP(op,0a) { A = RM( BC ); WZ=BC+1; } /* LD A,(BC) */ OP(op,0b) { BC--; } /* DEC BC */ OP(op,0c) { C = INC(C); } /* INC C */ OP(op,0d) { C = DEC(C); } /* DEC C */ OP(op,0e) { C = ARG(); } /* LD C,n */ OP(op,0f) { RRCA; } /* RRCA */ OP(op,10) { B--; JR_COND( B, 0x10 ); } /* DJNZ o */ OP(op,11) { DE = ARG16(); } /* LD DE,w */ OP(op,12) { WM( DE, A ); WZ_L = (DE + 1) & 0xFF; WZ_H = A; } /* LD (DE),A */ OP(op,13) { DE++; } /* INC DE */ OP(op,14) { D = INC(D); } /* INC D */ OP(op,15) { D = DEC(D); } /* DEC D */ OP(op,16) { D = ARG(); } /* LD D,n */ OP(op,17) { RLA; } /* RLA */ OP(op,18) { JR(); } /* JR o */ OP(op,19) { ADD16(hl, de); } /* ADD HL,DE */ OP(op,1a) { A = RM( DE ); WZ=DE+1; } /* LD A,(DE) */ OP(op,1b) { DE--; } /* DEC DE */ OP(op,1c) { E = INC(E); } /* INC E */ OP(op,1d) { E = DEC(E); } /* DEC E */ OP(op,1e) { E = ARG(); } /* LD E,n */ OP(op,1f) { RRA; } /* RRA */ OP(op,20) { JR_COND( !(F & ZF), 0x20 ); } /* JR NZ,o */ OP(op,21) { HL = ARG16(); } /* LD HL,w */ OP(op,22) { EA = ARG16(); WM16( EA, &Z80.hl ); WZ = EA+1; } /* LD (w),HL */ OP(op,23) { HL++; } /* INC HL */ OP(op,24) { H = INC(H); } /* INC H */ OP(op,25) { H = DEC(H); } /* DEC H */ OP(op,26) { H = ARG(); } /* LD H,n */ OP(op,27) { DAA; } /* DAA */ OP(op,28) { JR_COND( F & ZF, 0x28 ); } /* JR Z,o */ OP(op,29) { ADD16(hl, hl); } /* ADD HL,HL */ OP(op,2a) { EA = ARG16(); RM16( EA, &Z80.hl ); WZ = EA+1; } /* LD HL,(w) */ OP(op,2b) { HL--; } /* DEC HL */ OP(op,2c) { L = INC(L); } /* INC L */ OP(op,2d) { L = DEC(L); } /* DEC L */ OP(op,2e) { L = ARG(); } /* LD L,n */ OP(op,2f) { A ^= 0xff; F = (F&(SF|ZF|PF|CF))|HF|NF|(A&(YF|XF)); } /* CPL */ OP(op,30) { JR_COND( !(F & CF), 0x30 ); } /* JR NC,o */ OP(op,31) { SP = ARG16(); } /* LD SP,w */ OP(op,32) { EA = ARG16(); WM( EA, A ); WZ_L=(EA+1)&0xFF;WZ_H=A; } /* LD (w),A */ OP(op,33) { SP++; } /* INC SP */ OP(op,34) { WM( HL, INC(RM(HL)) ); } /* INC (HL) */ OP(op,35) { WM( HL, DEC(RM(HL)) ); } /* DEC (HL) */ OP(op,36) { WM( HL, ARG() ); } /* LD (HL),n */ OP(op,37) { F = (F & (SF|ZF|YF|XF|PF)) | CF | (A & (YF|XF)); } /* SCF */ OP(op,38) { JR_COND( F & CF, 0x38 ); } /* JR C,o */ OP(op,39) { ADD16(hl, sp); } /* ADD HL,SP */ OP(op,3a) { EA = ARG16(); A = RM( EA ); WZ = EA+1; } /* LD A,(w) */ OP(op,3b) { SP--; } /* DEC SP */ OP(op,3c) { A = INC(A); } /* INC A */ OP(op,3d) { A = DEC(A); } /* DEC A */ OP(op,3e) { A = ARG(); } /* LD A,n */ OP(op,3f) { F = ((F&(SF|ZF|YF|XF|PF|CF))|((F&CF)<<4)|(A&(YF|XF)))^CF; } /* CCF */ OP(op,40) { } /* LD B,B */ OP(op,41) { B = C; } /* LD B,C */ OP(op,42) { B = D; } /* LD B,D */ OP(op,43) { B = E; } /* LD B,E */ OP(op,44) { B = H; } /* LD B,H */ OP(op,45) { B = L; } /* LD B,L */ OP(op,46) { B = RM(HL); } /* LD B,(HL) */ OP(op,47) { B = A; } /* LD B,A */ OP(op,48) { C = B; } /* LD C,B */ OP(op,49) { } /* LD C,C */ OP(op,4a) { C = D; } /* LD C,D */ OP(op,4b) { C = E; } /* LD C,E */ OP(op,4c) { C = H; } /* LD C,H */ OP(op,4d) { C = L; } /* LD C,L */ OP(op,4e) { C = RM(HL); } /* LD C,(HL) */ OP(op,4f) { C = A; } /* LD C,A */ OP(op,50) { D = B; } /* LD D,B */ OP(op,51) { D = C; } /* LD D,C */ OP(op,52) { } /* LD D,D */ OP(op,53) { D = E; } /* LD D,E */ OP(op,54) { D = H; } /* LD D,H */ OP(op,55) { D = L; } /* LD D,L */ OP(op,56) { D = RM(HL); } /* LD D,(HL) */ OP(op,57) { D = A; } /* LD D,A */ OP(op,58) { E = B; } /* LD E,B */ OP(op,59) { E = C; } /* LD E,C */ OP(op,5a) { E = D; } /* LD E,D */ OP(op,5b) { } /* LD E,E */ OP(op,5c) { E = H; } /* LD E,H */ OP(op,5d) { E = L; } /* LD E,L */ OP(op,5e) { E = RM(HL); } /* LD E,(HL) */ OP(op,5f) { E = A; } /* LD E,A */ OP(op,60) { H = B; } /* LD H,B */ OP(op,61) { H = C; } /* LD H,C */ OP(op,62) { H = D; } /* LD H,D */ OP(op,63) { H = E; } /* LD H,E */ OP(op,64) { } /* LD H,H */ OP(op,65) { H = L; } /* LD H,L */ OP(op,66) { H = RM(HL); } /* LD H,(HL) */ OP(op,67) { H = A; } /* LD H,A */ OP(op,68) { L = B; } /* LD L,B */ OP(op,69) { L = C; } /* LD L,C */ OP(op,6a) { L = D; } /* LD L,D */ OP(op,6b) { L = E; } /* LD L,E */ OP(op,6c) { L = H; } /* LD L,H */ OP(op,6d) { } /* LD L,L */ OP(op,6e) { L = RM(HL); } /* LD L,(HL) */ OP(op,6f) { L = A; } /* LD L,A */ OP(op,70) { WM( HL, B ); } /* LD (HL),B */ OP(op,71) { WM( HL, C ); } /* LD (HL),C */ OP(op,72) { WM( HL, D ); } /* LD (HL),D */ OP(op,73) { WM( HL, E ); } /* LD (HL),E */ OP(op,74) { WM( HL, H ); } /* LD (HL),H */ OP(op,75) { WM( HL, L ); } /* LD (HL),L */ OP(op,76) { ENTER_HALT; } /* HALT */ OP(op,77) { WM( HL, A ); } /* LD (HL),A */ OP(op,78) { A = B; } /* LD A,B */ OP(op,79) { A = C; } /* LD A,C */ OP(op,7a) { A = D; } /* LD A,D */ OP(op,7b) { A = E; } /* LD A,E */ OP(op,7c) { A = H; } /* LD A,H */ OP(op,7d) { A = L; } /* LD A,L */ OP(op,7e) { A = RM(HL); } /* LD A,(HL) */ OP(op,7f) { } /* LD A,A */ OP(op,80) { ADD(B); } /* ADD A,B */ OP(op,81) { ADD(C); } /* ADD A,C */ OP(op,82) { ADD(D); } /* ADD A,D */ OP(op,83) { ADD(E); } /* ADD A,E */ OP(op,84) { ADD(H); } /* ADD A,H */ OP(op,85) { ADD(L); } /* ADD A,L */ OP(op,86) { ADD(RM(HL)); } /* ADD A,(HL) */ OP(op,87) { ADD(A); } /* ADD A,A */ OP(op,88) { ADC(B); } /* ADC A,B */ OP(op,89) { ADC(C); } /* ADC A,C */ OP(op,8a) { ADC(D); } /* ADC A,D */ OP(op,8b) { ADC(E); } /* ADC A,E */ OP(op,8c) { ADC(H); } /* ADC A,H */ OP(op,8d) { ADC(L); } /* ADC A,L */ OP(op,8e) { ADC(RM(HL)); } /* ADC A,(HL) */ OP(op,8f) { ADC(A); } /* ADC A,A */ OP(op,90) { SUB(B); } /* SUB B */ OP(op,91) { SUB(C); } /* SUB C */ OP(op,92) { SUB(D); } /* SUB D */ OP(op,93) { SUB(E); } /* SUB E */ OP(op,94) { SUB(H); } /* SUB H */ OP(op,95) { SUB(L); } /* SUB L */ OP(op,96) { SUB(RM(HL)); } /* SUB (HL) */ OP(op,97) { SUB(A); } /* SUB A */ OP(op,98) { SBC(B); } /* SBC A,B */ OP(op,99) { SBC(C); } /* SBC A,C */ OP(op,9a) { SBC(D); } /* SBC A,D */ OP(op,9b) { SBC(E); } /* SBC A,E */ OP(op,9c) { SBC(H); } /* SBC A,H */ OP(op,9d) { SBC(L); } /* SBC A,L */ OP(op,9e) { SBC(RM(HL)); } /* SBC A,(HL) */ OP(op,9f) { SBC(A); } /* SBC A,A */ OP(op,a0) { AND(B); } /* AND B */ OP(op,a1) { AND(C); } /* AND C */ OP(op,a2) { AND(D); } /* AND D */ OP(op,a3) { AND(E); } /* AND E */ OP(op,a4) { AND(H); } /* AND H */ OP(op,a5) { AND(L); } /* AND L */ OP(op,a6) { AND(RM(HL)); } /* AND (HL) */ OP(op,a7) { AND(A); } /* AND A */ OP(op,a8) { XOR(B); } /* XOR B */ OP(op,a9) { XOR(C); } /* XOR C */ OP(op,aa) { XOR(D); } /* XOR D */ OP(op,ab) { XOR(E); } /* XOR E */ OP(op,ac) { XOR(H); } /* XOR H */ OP(op,ad) { XOR(L); } /* XOR L */ OP(op,ae) { XOR(RM(HL)); } /* XOR (HL) */ OP(op,af) { XOR(A); } /* XOR A */ OP(op,b0) { OR(B); } /* OR B */ OP(op,b1) { OR(C); } /* OR C */ OP(op,b2) { OR(D); } /* OR D */ OP(op,b3) { OR(E); } /* OR E */ OP(op,b4) { OR(H); } /* OR H */ OP(op,b5) { OR(L); } /* OR L */ OP(op,b6) { OR(RM(HL)); } /* OR (HL) */ OP(op,b7) { OR(A); } /* OR A */ OP(op,b8) { CP(B); } /* CP B */ OP(op,b9) { CP(C); } /* CP C */ OP(op,ba) { CP(D); } /* CP D */ OP(op,bb) { CP(E); } /* CP E */ OP(op,bc) { CP(H); } /* CP H */ OP(op,bd) { CP(L); } /* CP L */ OP(op,be) { CP(RM(HL)); } /* CP (HL) */ OP(op,bf) { CP(A); } /* CP A */ OP(op,c0) { RET_COND( !(F & ZF), 0xc0 ); } /* RET NZ */ OP(op,c1) { POP( bc ); } /* POP BC */ OP(op,c2) { JP_COND( !(F & ZF) ); } /* JP NZ,a */ OP(op,c3) { JP; } /* JP a */ OP(op,c4) { CALL_COND( !(F & ZF), 0xc4 ); } /* CALL NZ,a */ OP(op,c5) { PUSH( bc ); } /* PUSH BC */ OP(op,c6) { ADD(ARG()); } /* ADD A,n */ OP(op,c7) { RST(0x00); } /* RST 0 */ OP(op,c8) { RET_COND( F & ZF, 0xc8 ); } /* RET Z */ OP(op,c9) { POP( pc ); WZ=PCD; } /* RET */ OP(op,ca) { JP_COND( F & ZF ); } /* JP Z,a */ OP(op,cb) { R++; EXEC(cb,ROP()); } /* **** CB xx */ OP(op,cc) { CALL_COND( F & ZF, 0xcc ); } /* CALL Z,a */ OP(op,cd) { CALL(); } /* CALL a */ OP(op,ce) { ADC(ARG()); } /* ADC A,n */ OP(op,cf) { RST(0x08); } /* RST 1 */ OP(op,d0) { RET_COND( !(F & CF), 0xd0 ); } /* RET NC */ OP(op,d1) { POP( de ); } /* POP DE */ OP(op,d2) { JP_COND( !(F & CF) ); } /* JP NC,a */ OP(op,d3) { unsigned n = ARG() | (A << 8); OUT( n, A ); WZ_L = ((n & 0xff) + 1) & 0xff; WZ_H = A; } /* OUT (n),A */ OP(op,d4) { CALL_COND( !(F & CF), 0xd4 ); } /* CALL NC,a */ OP(op,d5) { PUSH( de ); } /* PUSH DE */ OP(op,d6) { SUB(ARG()); } /* SUB n */ OP(op,d7) { RST(0x10); } /* RST 2 */ OP(op,d8) { RET_COND( F & CF, 0xd8 ); } /* RET C */ OP(op,d9) { EXX; } /* EXX */ OP(op,da) { JP_COND( F & CF ); } /* JP C,a */ OP(op,db) { unsigned n = ARG() | (A << 8); A = IN( n ); WZ = n + 1; } /* IN A,(n) */ OP(op,dc) { CALL_COND( F & CF, 0xdc ); } /* CALL C,a */ OP(op,dd) { R++; EXEC(dd,ROP()); } /* **** DD xx */ OP(op,de) { SBC(ARG()); } /* SBC A,n */ OP(op,df) { RST(0x18); } /* RST 3 */ OP(op,e0) { RET_COND( !(F & PF), 0xe0 ); } /* RET PO */ OP(op,e1) { POP( hl ); } /* POP HL */ OP(op,e2) { JP_COND( !(F & PF) ); } /* JP PO,a */ OP(op,e3) { EXSP( hl ); } /* EX HL,(SP) */ OP(op,e4) { CALL_COND( !(F & PF), 0xe4 ); } /* CALL PO,a */ OP(op,e5) { PUSH( hl ); } /* PUSH HL */ OP(op,e6) { AND(ARG()); } /* AND n */ OP(op,e7) { RST(0x20); } /* RST 4 */ OP(op,e8) { RET_COND( F & PF, 0xe8 ); } /* RET PE */ OP(op,e9) { PC = HL; } /* JP (HL) */ OP(op,ea) { JP_COND( F & PF ); } /* JP PE,a */ OP(op,eb) { EX_DE_HL; } /* EX DE,HL */ OP(op,ec) { CALL_COND( F & PF, 0xec ); } /* CALL PE,a */ OP(op,ed) { R++; EXEC(ed,ROP()); } /* **** ED xx */ OP(op,ee) { XOR(ARG()); } /* XOR n */ OP(op,ef) { RST(0x28); } /* RST 5 */ OP(op,f0) { RET_COND( !(F & SF), 0xf0 ); } /* RET P */ OP(op,f1) { POP( af ); } /* POP AF */ OP(op,f2) { JP_COND( !(F & SF) ); } /* JP P,a */ OP(op,f3) { IFF1 = IFF2 = 0; } /* DI */ OP(op,f4) { CALL_COND( !(F & SF), 0xf4 ); } /* CALL P,a */ OP(op,f5) { PUSH( af ); } /* PUSH AF */ OP(op,f6) { OR(ARG()); } /* OR n */ OP(op,f7) { RST(0x30); } /* RST 6 */ OP(op,f8) { RET_COND( F & SF, 0xf8 ); } /* RET M */ OP(op,f9) { SP = HL; } /* LD SP,HL */ OP(op,fa) { JP_COND(F & SF); } /* JP M,a */ OP(op,fb) { EI; } /* EI */ OP(op,fc) { CALL_COND( F & SF, 0xfc ); } /* CALL M,a */ OP(op,fd) { R++; EXEC(fd,ROP()); } /* **** FD xx */ OP(op,fe) { CP(ARG()); } /* CP n */ OP(op,ff) { RST(0x38); } /* RST 7 */ static void take_interrupt(void) { /* Check if processor was halted */ LEAVE_HALT; /* Clear both interrupt flip flops */ IFF1 = IFF2 = 0; LOG(("Z80 #%d single int. irq_vector $%02x\n", cpu_getactivecpu(), irq_vector)); /* Interrupt mode 1. RST 38h */ if( IM == 1 ) { LOG(("Z80 #%d IM1 $0038\n",cpu_getactivecpu() )); PUSH( pc ); PCD = 0x0038; /* RST $38 + 'interrupt latency' cycles */ Z80.cycles += cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff]; } else { /* call back the cpu interface to retrieve the vector */ int irq_vector = (*Z80.irq_callback)(0); /* Interrupt mode 2. Call [Z80.i:databyte] */ if( IM == 2 ) { irq_vector = (irq_vector & 0xff) | (I << 8); PUSH( pc ); RM16( irq_vector, &Z80.pc ); LOG(("Z80 #%d IM2 [$%04x] = $%04x\n",cpu_getactivecpu() , irq_vector, PCD)); /* CALL $xxxx + 'interrupt latency' cycles */ Z80.cycles += cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff]; } else { /* Interrupt mode 0. We check for CALL and JP instructions, */ /* if neither of these were found we assume a 1 byte opcode */ /* was placed on the databus */ LOG(("Z80 #%d IM0 $%04x\n",cpu_getactivecpu() , irq_vector)); switch (irq_vector & 0xff0000) { case 0xcd0000: /* call */ PUSH( pc ); PCD = irq_vector & 0xffff; /* CALL $xxxx + 'interrupt latency' cycles */ Z80.cycles += cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff]; break; case 0xc30000: /* jump */ PCD = irq_vector & 0xffff; /* JP $xxxx + 2 cycles */ Z80.cycles += cc[Z80_TABLE_op][0xc3] + cc[Z80_TABLE_ex][0xff]; break; default: /* rst (or other opcodes?) */ PUSH( pc ); PCD = irq_vector & 0x0038; /* RST $xx + 2 cycles */ Z80.cycles += cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff]; break; } } } WZ=PCD; } /**************************************************************************** * Processor initialization ****************************************************************************/ void z80_init(const void *config, int (*irqcallback)(int)) { int i, p; int oldval, newval, val; UINT8 *padd = &SZHVC_add[ 0*256]; UINT8 *padc = &SZHVC_add[256*256]; UINT8 *psub = &SZHVC_sub[ 0*256]; UINT8 *psbc = &SZHVC_sub[256*256]; for (oldval = 0; oldval < 256; oldval++) { for (newval = 0; newval < 256; newval++) { /* add or adc w/o carry set */ val = newval - oldval; *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; *padd |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF; if( newval < oldval ) *padd |= CF; if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF; padd++; /* adc with carry set */ val = newval - oldval - 1; *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; *padc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF; if( newval <= oldval ) *padc |= CF; if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF; padc++; /* cp, sub or sbc w/o carry set */ val = oldval - newval; *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); *psub |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF; if( newval > oldval ) *psub |= CF; if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF; psub++; /* sbc with carry set */ val = oldval - newval - 1; *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); *psbc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF; if( newval >= oldval ) *psbc |= CF; if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF; psbc++; } } for (i = 0; i < 256; i++) { p = 0; if( i&0x01 ) ++p; if( i&0x02 ) ++p; if( i&0x04 ) ++p; if( i&0x08 ) ++p; if( i&0x10 ) ++p; if( i&0x20 ) ++p; if( i&0x40 ) ++p; if( i&0x80 ) ++p; SZ[i] = i ? i & SF : ZF; SZ[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ SZ_BIT[i] = i ? i & SF : ZF | PF; SZ_BIT[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ SZP[i] = SZ[i] | ((p & 1) ? 0 : PF); SZHV_inc[i] = SZ[i]; if( i == 0x80 ) SZHV_inc[i] |= VF; if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF; SZHV_dec[i] = SZ[i] | NF; if( i == 0x7f ) SZHV_dec[i] |= VF; if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF; } /* Initialize Z80 */ memset(&Z80, 0, sizeof(Z80)); Z80.daisy = config; Z80.irq_callback = irqcallback; /* Clear registers values (NB: should be random on real hardware ?) */ AF = BC = DE = HL = SP = IX = IY =0; F = ZF; /* Zero flag is set */ /* setup cycle tables */ cc[Z80_TABLE_op] = cc_op; cc[Z80_TABLE_cb] = cc_cb; cc[Z80_TABLE_ed] = cc_ed; cc[Z80_TABLE_xy] = cc_xy; cc[Z80_TABLE_xycb] = cc_xycb; cc[Z80_TABLE_ex] = cc_ex; } /**************************************************************************** * Do a reset ****************************************************************************/ void z80_reset(void) { PC = 0x0000; I = 0; R = 0; R2 = 0; IM = 0; IFF1 = IFF2 = 0; HALT = 0; Z80.after_ei = FALSE; WZ=PCD; } /**************************************************************************** * Run until given cycle count ****************************************************************************/ void z80_run(unsigned int cycles) { while( Z80.cycles < cycles ) { /* check for IRQs before each instruction */ if (Z80.irq_state && IFF1 && !Z80.after_ei) { take_interrupt(); if (Z80.cycles >= cycles) return; } Z80.after_ei = FALSE; R++; EXEC_INLINE(op,ROP()); } } /**************************************************************************** * Get all registers in given buffer ****************************************************************************/ void z80_get_context (void *dst) { if( dst ) *(Z80_Regs*)dst = Z80; } /**************************************************************************** * Set all registers to given values ****************************************************************************/ void z80_set_context (void *src) { if( src ) Z80 = *(Z80_Regs*)src; } /**************************************************************************** * Set IRQ lines ****************************************************************************/ void z80_set_irq_line(unsigned int state) { Z80.irq_state = state; } void z80_set_nmi_line(unsigned int state) { /* mark an NMI pending on the rising edge */ if (Z80.nmi_state == CLEAR_LINE && state != CLEAR_LINE) { LOG(("Z80 #%d take NMI\n", cpu_getactivecpu())); LEAVE_HALT; /* Check if processor was halted */ IFF1 = 0; PUSH( pc ); PCD = 0x0066; WZ=PCD; Z80.cycles += 11*15; } Z80.nmi_state = state; } core/ntsc/000700 001750 001750 00000000000 12703321515 013564 5ustar00sergiosergio000000 000000 core/tremor/lsp_lookup.h000664 001750 001750 00000011577 12702465756 016533 0ustar00sergiosergio000000 000000 /******************************************************************** * * * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * * * ******************************************************************** function: lookup data ********************************************************************/ #ifndef _V_LOOKUP_DATA_H_ #define _V_LOOKUP_DATA_H_ #include "os_types.h" #define FROMdB_LOOKUP_SZ 35 #define FROMdB2_LOOKUP_SZ 32 #define FROMdB_SHIFT 5 #define FROMdB2_SHIFT 3 #define FROMdB2_MASK 31 static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ 0x003fffff, 0x0028619b, 0x00197a96, 0x0010137a, 0x000a24b0, 0x00066666, 0x000409c3, 0x00028c42, 0x00019b8c, 0x000103ab, 0x0000a3d7, 0x00006760, 0x0000413a, 0x00002928, 0x000019f8, 0x00001062, 0x00000a56, 0x00000686, 0x0000041e, 0x00000299, 0x000001a3, 0x00000109, 0x000000a7, 0x00000069, 0x00000042, 0x0000002a, 0x0000001a, 0x00000011, 0x0000000b, 0x00000007, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000001}; static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ 0x000001fc, 0x000001f5, 0x000001ee, 0x000001e7, 0x000001e0, 0x000001d9, 0x000001d2, 0x000001cc, 0x000001c5, 0x000001bf, 0x000001b8, 0x000001b2, 0x000001ac, 0x000001a6, 0x000001a0, 0x0000019a, 0x00000194, 0x0000018e, 0x00000188, 0x00000183, 0x0000017d, 0x00000178, 0x00000172, 0x0000016d, 0x00000168, 0x00000163, 0x0000015e, 0x00000159, 0x00000154, 0x0000014f, 0x0000014a, 0x00000145, }; #define INVSQ_LOOKUP_I_SHIFT 10 #define INVSQ_LOOKUP_I_MASK 1023 static const long INVSQ_LOOKUP_I[64+1]={ 92682, 91966, 91267, 90583, 89915, 89261, 88621, 87995, 87381, 86781, 86192, 85616, 85051, 84497, 83953, 83420, 82897, 82384, 81880, 81385, 80899, 80422, 79953, 79492, 79039, 78594, 78156, 77726, 77302, 76885, 76475, 76072, 75674, 75283, 74898, 74519, 74146, 73778, 73415, 73058, 72706, 72359, 72016, 71679, 71347, 71019, 70695, 70376, 70061, 69750, 69444, 69141, 68842, 68548, 68256, 67969, 67685, 67405, 67128, 66855, 66585, 66318, 66054, 65794, 65536, }; static const long INVSQ_LOOKUP_IDel[64]={ 716, 699, 684, 668, 654, 640, 626, 614, 600, 589, 576, 565, 554, 544, 533, 523, 513, 504, 495, 486, 477, 469, 461, 453, 445, 438, 430, 424, 417, 410, 403, 398, 391, 385, 379, 373, 368, 363, 357, 352, 347, 343, 337, 332, 328, 324, 319, 315, 311, 306, 303, 299, 294, 292, 287, 284, 280, 277, 273, 270, 267, 264, 260, 258, }; #define COS_LOOKUP_I_SHIFT 9 #define COS_LOOKUP_I_MASK 511 #define COS_LOOKUP_I_SZ 128 static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ 16384, 16379, 16364, 16340, 16305, 16261, 16207, 16143, 16069, 15986, 15893, 15791, 15679, 15557, 15426, 15286, 15137, 14978, 14811, 14635, 14449, 14256, 14053, 13842, 13623, 13395, 13160, 12916, 12665, 12406, 12140, 11866, 11585, 11297, 11003, 10702, 10394, 10080, 9760, 9434, 9102, 8765, 8423, 8076, 7723, 7366, 7005, 6639, 6270, 5897, 5520, 5139, 4756, 4370, 3981, 3590, 3196, 2801, 2404, 2006, 1606, 1205, 804, 402, 0, -401, -803, -1204, -1605, -2005, -2403, -2800, -3195, -3589, -3980, -4369, -4755, -5138, -5519, -5896, -6269, -6638, -7004, -7365, -7722, -8075, -8422, -8764, -9101, -9433, -9759, -10079, -10393, -10701, -11002, -11296, -11584, -11865, -12139, -12405, -12664, -12915, -13159, -13394, -13622, -13841, -14052, -14255, -14448, -14634, -14810, -14977, -15136, -15285, -15425, -15556, -15678, -15790, -15892, -15985, -16068, -16142, -16206, -16260, -16304, -16339, -16363, -16378, -16383, }; #endif sdl/icon.rc000664 001750 001750 00000000030 12702465756 013751 0ustar00sergiosergio000000 000000 MAINICON ICON "md.ico" core/m68k/m68kconf.h000664 001750 001750 00000007263 12702465756 015251 0ustar00sergiosergio000000 000000 #ifndef M68KCONF__HEADER #define M68KCONF__HEADER /* ======================================================================== */ /* ======================== MAIN 68K CONFIGURATION ======================== */ /* ======================================================================== */ /* Configuration switches. * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks. * OPT_SPECIFY_HANDLER causes the core to link directly to the function * or macro you specify, rather than using callback functions whose pointer * must be passed in using m68k_set_xxx_callback(). */ #define OPT_OFF 0 #define OPT_ON 1 #define OPT_SPECIFY_HANDLER 2 /* If ON, the CPU will call m68k_write_32_pd() when it executes move.l with a * predecrement destination EA mode instead of m68k_write_32(). * To simulate real 68k behavior, m68k_write_32_pd() must first write the high * word to [address+2], and then write the low word to [address]. */ #define M68K_SIMULATE_PD_WRITES OPT_OFF /* If ON, CPU will call the interrupt acknowledge callback when it services an * interrupt. * If off, all interrupts will be autovectored and all interrupt requests will * auto-clear when the interrupt is serviced. */ #define M68K_EMULATE_INT_ACK OPT_SPECIFY_HANDLER #define M68K_INT_ACK_CALLBACK(A) vdp_68k_irq_ack(A) /* If ON, CPU will call the output reset callback when it encounters a reset * instruction. */ #define M68K_EMULATE_RESET OPT_OFF #define M68K_RESET_CALLBACK() your_reset_handler_function() /* If ON, CPU will call the callback when it encounters a tas * instruction. */ #define M68K_TAS_HAS_CALLBACK OPT_OFF #define M68K_TAS_CALLBACK() your_tas_handler_function() /* If ON, CPU will call the set fc callback on every memory access to * differentiate between user/supervisor, program/data access like a real * 68000 would. This should be enabled and the callback should be set if you * want to properly emulate the m68010 or higher. (moves uses function codes * to read/write data from different address spaces) */ #define M68K_EMULATE_FC OPT_OFF #define M68K_SET_FC_CALLBACK(A) your_set_fc_handler_function(A) /* If ON, the CPU will monitor the trace flags and take trace exceptions */ #define M68K_EMULATE_TRACE OPT_OFF /* If ON, the CPU will emulate the 4-byte prefetch queue of a real 68000 */ #define M68K_EMULATE_PREFETCH OPT_OFF /* If ON, the CPU will generate address error exceptions if it tries to * access a word or longword at an odd address. * NOTE: This is only emulated properly for 68000 mode. */ #define M68K_EMULATE_ADDRESS_ERROR OPT_ON /* If ON and previous option is also ON, address error exceptions will also be checked when fetching instructions. Disabling this can help speeding up emulation while still emulating address error exceptions on other memory access if needed. * NOTE: This is only emulated properly for 68000 mode. */ #define M68K_CHECK_PC_ADDRESS_ERROR OPT_OFF /* ----------------------------- COMPATIBILITY ---------------------------- */ /* The following options set optimizations that violate the current ANSI * standard, but will be compliant under the forthcoming C9X standard. */ /* If ON, the enulation core will use 64-bit integers to speed up some * operations. */ #define M68K_USE_64_BIT OPT_OFF /* ======================================================================== */ /* ============================== END OF FILE ============================= */ /* ======================================================================== */ #endif /* M68KCONF__HEADER */