int main (int argc, char *argv[]) { FILE *fp = fopen ("bitmaps.asm", "rt"); if (!fp) exit (0); FILE *fpR = fopen ("cs_r.asm", "wt"); if (!fpR) exit (0); FILE *fpE = fopen ("cs_e.asm", "wt"); if (!fpE) exit (0); char buf[1024]; fgets (buf, 1024, fp); while (!feof (fp)) { //printf ("%s", buf); if (isalpha (buf[0]) && strchr (buf, ':')) { char name[1024]; strcpy (name, buf); fprintf (fpR, "%s", name); fprintf (fpE, "%s", name); long fpos = ftell (fp); uint16_t offs_tbl[256]; int n_offs; for (unsigned i=1; i<16; i++) { fseek (fp, fpos, SEEK_SET); fgets (buf, 1024, fp); uint16_t value = 0; if (i&(1<<3)) value |= 0xF000; if (i&(1<<2)) value |= 0x0F00; if (i&(1<<1)) value |= 0x00F0; if (i&(1<<0)) value |= 0x000F; uint16_t addr = 0; n_offs = 0; while (1) { if (!strstr (buf, ".BYTE") && !strstr (buf, ".byte")) break; //fprintf (fpR, ";%s", buf+1); //fprintf (fpE, ";%s", buf+1); char *p; uint16_t offset = 0; for (p=buf; (p = strchr (p, '$')); offset+=2) { uint16_t data; p++; data = ahextoi (p); p = strchr (p, '$'); if (!p) break; p++; data |= (ahextoi (p) << 8); if (data != value) continue; offs_tbl[n_offs++] = addr+offset; } addr += 160; fgets (buf, 1024, fp); } // now output if (n_offs > 3) fprintf (fpR, " ldy #$%04X\n", value); for (unsigned i=0; i<n_offs; i++) { if (n_offs > 3) fprintf (fpR, " tya\n"); else fprintf (fpR, " lda #$%04X\n", value); if (value != 0xFFFF) fprintf (fpR, " ora SHRMEM+$%03X,x\n", offs_tbl[i]); fprintf (fpR, " sta SHRMEM+$%03X,x\n", offs_tbl[i]); fprintf (fpE, " sta SHRMEM+$%03X,x\n", offs_tbl[i]); } } // value } // isalpha fgets (buf, 1024, fp); } unsigned thrust_x_off_tbl[] = { 0, 0, 1, 1, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 5, 5, 4, 3, 3, 3, 2, 1, 1, 0 }; unsigned thrust_y_off_tbl[] = { 3, 3, 4, 5, 5, 6, 6, 6, 5, 5, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0, 1, 1, 2, 3 }; for (unsigned s=0; s<2; s++) { for (unsigned i=0; i<24; i++) { unsigned x = thrust_x_off_tbl[i]; unsigned y = thrust_y_off_tbl[i]; unsigned offset = y * 160 + (x+s)/2; unsigned value = ((x+s)%2 == 0 ? 0x00F0 : 0x000F); fprintf (fpR, "\n%sship_%d:\n", (s==0 ? "" : "shifted_"), i); fprintf (fpR, " thrust $%03X, $%04X\n", offset, value); } } fclose (fp); fclose (fpR); fclose (fpE); }
bool CScriptObj::r_WriteVal( LPCTSTR pszKey, CGString &sVal, CTextConsole * pSrc ) { EXC_TRY(("r_WriteVal('%s',,%x)", pszKey, pSrc)); CScriptObj * pRef; if ( r_GetRef( pszKey, pRef )) { if ( pRef == NULL ) // good command but bad link. { sVal = "0"; return true; } if ( pszKey[0] == '\0' ) // we where just testing the ref. { CObjBase * pObj = dynamic_cast <CObjBase *> (pRef); if ( pObj ) sVal.FormatHex( (DWORD) pObj->GetUID() ); else sVal.FormatVal( 1 ); return( true ); } return pRef->r_WriteVal( pszKey, sVal, pSrc ); } int i = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); if ( i < 0 ) { // <dSOMEVAL> same as <eval <SOMEVAL>> to get dec from the val if (( *pszKey == 'd' ) || ( *pszKey == 'D' )) { LPCTSTR arg = pszKey + 1; if ( r_WriteVal(arg, sVal, pSrc) ) { if ( !IsStrNumericDec(sVal) ) // dValue dec -> hex fix { sVal.FormatVal(ahextoi(sVal)); } return true; } } // <r>, <r15>, <r3,15> are shortcuts to rand(), rand(15) and rand(3,15) else if (( *pszKey == 'r' ) || ( *pszKey == 'R' )) { char *zTemp = Str_GetTemp(); strcpy(zTemp, pszKey+1); if (( *zTemp ) && (( *zTemp < '0' ) || ( *zTemp > '9' )) ) goto badcmd; TCHAR *ppCmd[2]; int qty = Str_ParseCmds(zTemp, ppCmd, COUNTOF(ppCmd)); int min = 0, max = 1000; if ( qty == 1 ) max = atoi(ppCmd[0]); else if ( qty == 2 ) { min = g_Exp.GetVal(ppCmd[0]); max = g_Exp.GetVal(ppCmd[1]); } if ( min > max ) { int a = min; min = max; max = a; } if ( min == max ) sVal.FormatVal(min); else sVal.FormatVal(min + Calc_GetRandVal(max - min)); return true; } badcmd: return false; // Bad command. } pszKey += strlen( sm_szLoadKeys[i] ); SKIP_SEPERATORS(pszKey); bool fZero = false; switch ( i ) { case SSC_LISTCOL: // Set the alternating color. sVal = (CWebPageDef::sm_iListIndex&1) ? "bgcolor=\"#E8E8E8\"" : ""; return( true ); case SSC_OBJ: if ( !g_World.m_uidObj.ObjFind() ) g_World.m_uidObj = 0; sVal.FormatHex((DWORD)g_World.m_uidObj); return true; case SSC_NEW: if ( !g_World.m_uidNew.ObjFind() ) g_World.m_uidNew = 0; sVal.FormatHex((DWORD)g_World.m_uidNew); return true; case SSC_SRC: if ( pSrc == NULL ) pRef = NULL; else { pRef = pSrc->GetChar(); // if it can be converted . if ( ! pRef ) pRef = dynamic_cast <CScriptObj*> (pSrc); // if it can be converted . } if ( ! pRef ) { sVal.FormatVal( 0 ); return true; } if ( !*pszKey ) { CObjBase * pObj = dynamic_cast <CObjBase*> (pRef); // if it can be converted . sVal.FormatHex( pObj ? (DWORD) pObj->GetUID() : 0 ); return true; } return pRef->r_WriteVal( pszKey, sVal, pSrc ); case SSC_VAR0: fZero = true; case SSC_VAR: // "VAR." = get/set a system wide variable. { CVarDefBase * pVar = g_Exp.m_VarGlobals.GetKey(pszKey); if ( pVar ) sVal = pVar->GetValStr(); else if ( fZero ) sVal = "0"; } return true; case SSC_DEF0: fZero = true; case SSC_DEF: { CVarDefBase * pVar = g_Exp.m_VarDefs.GetKey(pszKey); if ( pVar ) sVal = pVar->GetValStr(); else if ( fZero ) sVal = "0"; } return( true ); case SSC_EVAL: sVal.FormatVal( Exp_GetVal( pszKey )); return( true ); case SSC_FVAL: { int iVal = Exp_GetVal( pszKey ); sVal.Format( "%i.%i", iVal/10, abs(iVal%10) ); return true; } case SSC_HVAL: sVal.FormatHex( Exp_GetVal( pszKey )); return( true ); case SSC_QVAL: { // Do a switch ? type statement <QVAL conditional ? option1 : option2> TCHAR * ppCmds[3]; ppCmds[0] = const_cast<TCHAR*>(pszKey); Str_Parse( ppCmds[0], &(ppCmds[1]), "?" ); Str_Parse( ppCmds[1], &(ppCmds[2]), ":" ); sVal = ppCmds[ Exp_GetVal( ppCmds[0] ) ? 1 : 2 ]; if ( sVal.IsEmpty()) sVal = " "; } return( true ); case SSC_ISEMPTY: sVal.FormatVal( IsStrEmpty( pszKey ) ); return true; case SSC_ISNUM: GETNONWHITESPACE( pszKey ); sVal.FormatVal( IsStrNumeric( pszKey ) ); return true; case SSC_StrRev: { GETNONWHITESPACE( pszKey ); sVal = pszKey; sVal.Reverse(); return true; } case SSC_StrPos: { GETNONWHITESPACE( pszKey ); int iPos = Exp_GetVal( pszKey ); TCHAR ch; if ( isdigit( *pszKey) && isdigit( *(pszKey+1) ) ) ch = (TCHAR) Exp_GetVal( pszKey ); else { ch = *pszKey; pszKey++; } GETNONWHITESPACE( pszKey ); int iLen = strlen( pszKey ); if ( iPos < 0 ) iPos = iLen + iPos; if ( iPos < 0 ) iPos = 0; else if ( iPos > iLen ) iPos = iLen; TCHAR * pszPos = strchr( pszKey + iPos, ch ); if ( !pszPos ) sVal.FormatVal( -1 ); else sVal.FormatVal( pszPos - pszKey ); } return true; case SSC_StrSub: { int iPos = Exp_GetVal( pszKey ); int iCnt = Exp_GetVal( pszKey ); SKIP_ARGSEP( pszKey ); GETNONWHITESPACE( pszKey ); int iLen = strlen( pszKey ); if ( iPos < 0 ) iPos += iLen; if ( iPos > iLen || iPos < 0 ) iPos = 0; if ( iPos + iCnt > iLen || iCnt == 0 ) iCnt = iLen - iPos; TCHAR *buf = Str_GetTemp(); strncpy( buf, pszKey + iPos, iCnt ); buf[iCnt] = '\0'; sVal = buf; } return true; case SSC_StrArg: { TCHAR *buf = Str_GetTemp(); GETNONWHITESPACE( pszKey ); if ( *pszKey == '"' ) pszKey++; int i = 0; while ( *pszKey && !isspace( *pszKey ) && *pszKey != ',' ) { buf[i] = *pszKey; pszKey++; i++; } buf[i] = '\0'; sVal = buf; } return true; case SSC_StrEat: { GETNONWHITESPACE( pszKey ); while ( *pszKey && !isspace( *pszKey ) && *pszKey != ',' ) pszKey++; SKIP_ARGSEP( pszKey ); sVal = pszKey; } return true; case SSC_ASC: { TCHAR *buf = Str_GetTemp(); REMOVE_QUOTES( pszKey ); sVal.FormatHex( *pszKey ); sprintf( buf, sVal ); while ( *(++pszKey) ) { if ( *pszKey == '"' ) break; sVal.FormatHex( *pszKey ); strcat( buf, " " ); strcat( buf, sVal ); } sVal = buf; } return true; case SSC_READFILE: { if ( !IsSetOF( OF_FileCommands ) ) return false; TCHAR *rfArgs[1]; FILE *rfFD; TCHAR *buf = Str_GetTemp(); int line; rfArgs[0] = const_cast<TCHAR*>(pszKey); Str_Parse( rfArgs[0], &(rfArgs[1]), " " ); // Remove other junk Str_Parse( rfArgs[1], NULL, " " ); line = atoi( rfArgs[1] ); sVal = ""; if ( rfFD = fopen( rfArgs[0], "r" )) { if ( line == -1 ) // First line of the file fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); else if ( line == 0 ) { // Last line of the file while ( ! feof( rfFD ) ) fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); } else { // Line "line" of the file int x; for ( x = 1; x <= line; x++ ) { if ( feof(rfFD) ) { buf[0] = 0; break; } fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); } } sVal = buf; fclose(rfFD); } } return true; case SSC_FILELINES: { if ( !IsSetOF( OF_FileCommands ) ) return false; TCHAR *buf = Str_GetTemp(); FILE *flFD; int x(0); GETNONWHITESPACE( pszKey ); if ( flFD = fopen( pszKey, "r" ) ) { while ( ! feof(flFD) ) { fgets(buf, SCRIPT_MAX_LINE_LEN, flFD ); x++; } fclose(flFD); } sVal.FormatVal(x); } return true; case SSC_SYSCMD: case SSC_SYSSPAWN: { if ( !IsSetOF(OF_FileCommands) ) return false; GETNONWHITESPACE(pszKey); TCHAR *buf = Str_GetTemp(); TCHAR *Arg_ppCmd[10]; // limit to 9 arguments strcpy(buf, pszKey); int iQty = Str_ParseCmds(buf, Arg_ppCmd, COUNTOF(Arg_ppCmd)); if ( iQty < 1 ) return false; #ifdef WIN32 _spawnl( ( i == SSC_SYSCMD ) ? _P_WAIT : _P_NOWAIT, Arg_ppCmd[0], Arg_ppCmd[0], Arg_ppCmd[1], Arg_ppCmd[2], Arg_ppCmd[3], Arg_ppCmd[4], Arg_ppCmd[5], Arg_ppCmd[6], Arg_ppCmd[7], Arg_ppCmd[8], Arg_ppCmd[9], NULL ); #else g_Log.EventError("sysspawn/syscmd is not available on unix builds." DEBUG_CR); #endif return true; } default: StringFunction( i, pszKey, sVal ); return true; } EXC_CATCH("CScriptObj"); return false; }
static void XMLCALL charhandler(void *data, const char *s, int len) { AppData *ad = (AppData *) data; char buffer[512]; int track; memcpy(buffer,s,len); buffer[len]=0; switch(ad->current_state) { case DISK_LAYOUT_NAME: strcpy((char*)&ad->name,(char*)&buffer); break; case DISK_LAYOUT_DESCRIPTION: strcpy((char*)&ad->description,(char*)&buffer); break; case INTERFACE_MODE: ad->interface_mode = hxcfe_getFloppyInterfaceModeID(ad->floppycontext,(char*)&buffer); break; case DOUBLE_STEP: if(!strcmp(buffer,"on")) ad->double_step = 1; if(!strcmp(buffer,"off")) ad->double_step = 0; break; case FILESIZE: break; /* case TRACKSIZE: ad->track_size = atoi(buffer); break;*/ case NUMBEROFTRACK: if(!ad->xmlcheck) hxcfe_setNumberOfTrack (ad->fb,(unsigned short)atoi(buffer)); break; case NUMBEROFSIDE: if(!ad->xmlcheck) hxcfe_setNumberOfSide (ad->fb,(unsigned char)atoi(buffer)); break; case NUMBEROFSECTOR: if(!ad->xmlcheck) hxcfe_setNumberOfSector (ad->fb,(unsigned short)atoi(buffer)); break; case SECTORSIZE: if(!ad->xmlcheck) hxcfe_setSectorSize(ad->fb,atoi(buffer)); break; case INTERLEAVE: if(!ad->xmlcheck) hxcfe_setTrackInterleave(ad->fb,atoi(buffer)); break; case SKEW: if(!ad->xmlcheck) hxcfe_setTrackSkew(ad->fb,atoi(buffer)); break; case SKEW_PER_TRACK: if(!ad->xmlcheck) ad->skew_per_track = atoi(buffer); break; case SKEW_PER_SIDE: if(!ad->xmlcheck) ad->skew_per_side = atoi(buffer); break; case FORMATVALUE: if(!ad->xmlcheck) hxcfe_setSectorFill (ad->fb,(unsigned char)ahextoi(buffer)); break; case PREGAP: if(!ad->xmlcheck) hxcfe_setTrackPreGap (ad->fb,(unsigned short)atoi(buffer)); break; case GAP3: if(!ad->xmlcheck) hxcfe_setSectorGap3 (ad->fb,(unsigned char)atoi(buffer)); break; case RPM: if(!ad->xmlcheck) hxcfe_setRPM (ad->fb,(unsigned short)atoi(buffer)); break; case SECTORIDSTART: if(!ad->xmlcheck) hxcfe_setStartSectorID(ad->fb,(unsigned char)atoi(buffer)); break; case BITRATE: if(!ad->xmlcheck) hxcfe_setTrackBitrate(ad->fb,atoi(buffer)); break; case DATAOFFSET: if(!ad->xmlcheck) { track = ad->statestack[ad->stack_ptr].cur_track; ad->ts[track].base_adress = ahextoi(buffer); } break; } }
bool CItemStone::r_LoadVal( CScript & s ) // Load an item Script { ADDTOCALLSTACK("CItemStone::r_LoadVal"); EXC_TRY("LoadVal"); switch ( FindTableSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case STC_ABBREV: // "ABBREV" m_sAbbrev = s.GetArgStr(); return true; case STC_ALIGN: // "ALIGN" SetAlignType(static_cast<STONEALIGN_TYPE>(s.GetArgVal())); return true; case STC_MasterUid: { if ( s.HasArgs() ) { CGrayUID pNewMasterUid = (DWORD) s.GetArgVal(); CChar * pChar = pNewMasterUid.CharFind(); if ( !pChar ) { DEBUG_ERR(( "MASTERUID called on non char 0%lx uid.\n", (DWORD)pNewMasterUid )); return( false ); } CStoneMember * pNewMaster = GetMember( pChar ); if ( !pNewMaster ) { DEBUG_ERR(( "MASTERUID called on char 0%lx (%s) that is not a valid member of stone with 0x%lx uid.\n", (DWORD)pNewMasterUid, pChar->GetName(), (DWORD)GetUID() )); return( false ); } CStoneMember * pMaster = GetMasterMember(); if ( pMaster ) { if ( pMaster->GetLinkUID() == pNewMasterUid ) return( true ); pMaster->SetPriv(STONEPRIV_MEMBER); //pMaster->SetLoyalTo(pChar); } //pNewMaster->SetLoyalTo(pChar); pNewMaster->SetPriv(STONEPRIV_MASTER); } else { DEBUG_ERR(( "MASTERUID called without arguments.\n" )); return( false ); } } return( true ); case STC_MEMBER: // "MEMBER" { TCHAR *Arg_ppCmd[8]; // Maximum parameters in one line size_t Arg_Qty = Str_ParseCmds( s.GetArgStr(), Arg_ppCmd, COUNTOF( Arg_ppCmd ), "," ); if (Arg_Qty < 1) // must at least provide the member uid return false; new CStoneMember( this, ahextoi(Arg_ppCmd[0]), // Member's UID Arg_Qty > 2 ? static_cast<STONEPRIV_TYPE>(ATOI(Arg_ppCmd[2])) : STONEPRIV_CANDIDATE, // Members priv level (use as a type) Arg_Qty > 1 ? Arg_ppCmd[1] : "", // Title ahextoi(Arg_ppCmd[3]), // Member is loyal to this Arg_Qty > 4 ? (ATOI( Arg_ppCmd[4] ) != 0) : 0, // Paperdoll stone abbreviation (also if they declared war) Arg_Qty > 5 ? (ATOI( Arg_ppCmd[5] ) != 0) : 0, // If we declared war Arg_Qty > 6 ? ATOI( Arg_ppCmd[6] ) : 0); // AccountGold } return true; case STC_WEBPAGE: // "WEBPAGE" m_sWebPageURL = s.GetArgStr(); return true; } if ( s.IsKeyHead( sm_szLoadKeys[STC_CHARTER], 7 )) { unsigned int i = ATOI(s.GetKey() + 7); if ( i >= COUNTOF(m_sCharter)) return( false ); m_sCharter[i] = s.GetArgStr(); return( true ); } return CItem::r_LoadVal(s); EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }