www.pudn.com > sn068s.zip > GENFLAGS.C


#include  
 
#ifdef DJGPP_CPU 
#define GLOBAL_DIRECTIVE ".globl" 
#define BYTE_DIRECTIVE ".byte" 
#define OUTPUT_EXTENSION ".S" 
#else 
#define GLOBAL_DIRECTIVE "global" 
#define BYTE_DIRECTIVE "db" 
#define OUTPUT_EXTENSION ".asm" 
#endif 
 
const unsigned NATIVE_SPC_FLAG_C = 1; 
const unsigned NATIVE_SPC_FLAG_V = 2; 
const unsigned NATIVE_SPC_FLAG_I = 4; 
const unsigned NATIVE_SPC_FLAG_B = 8; 
const unsigned NATIVE_SPC_FLAG_H = 0x10; 
const unsigned NATIVE_SPC_FLAG_P = 0x20; 
const unsigned NATIVE_SPC_FLAG_Z = 0x40; 
const unsigned NATIVE_SPC_FLAG_N = 0x80; 
 
const unsigned REAL_SPC_FLAG_C = 1; 
const unsigned REAL_SPC_FLAG_Z = 2; 
const unsigned REAL_SPC_FLAG_I = 4; 
const unsigned REAL_SPC_FLAG_H = 8; 
const unsigned REAL_SPC_FLAG_B = 0x10; 
const unsigned REAL_SPC_FLAG_P = 0x20; 
const unsigned REAL_SPC_FLAG_V = 0x40; 
const unsigned REAL_SPC_FLAG_N = 0x80; 
 
const int SYMMETRIC_FLAGS_SPC = -1; 
 
unsigned char flags_native_to_SPC(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & NATIVE_SPC_FLAG_C) temp |= REAL_SPC_FLAG_C; 
 if (flags & NATIVE_SPC_FLAG_Z) temp |= REAL_SPC_FLAG_Z; 
 if (flags & NATIVE_SPC_FLAG_I) temp |= REAL_SPC_FLAG_I; 
 if (flags & NATIVE_SPC_FLAG_H) temp |= REAL_SPC_FLAG_H; 
 if (flags & NATIVE_SPC_FLAG_B) temp |= REAL_SPC_FLAG_B; 
 if (flags & NATIVE_SPC_FLAG_P) temp |= REAL_SPC_FLAG_P; 
 if (flags & NATIVE_SPC_FLAG_V) temp |= REAL_SPC_FLAG_V; 
 if (flags & NATIVE_SPC_FLAG_N) temp |= REAL_SPC_FLAG_N; 
 
 return temp; 
} 
 
unsigned char flags_SPC_to_native(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & REAL_SPC_FLAG_C) temp |= NATIVE_SPC_FLAG_C; 
 if (flags & REAL_SPC_FLAG_Z) temp |= NATIVE_SPC_FLAG_Z; 
 if (flags & REAL_SPC_FLAG_I) temp |= NATIVE_SPC_FLAG_I; 
 if (flags & REAL_SPC_FLAG_H) temp |= NATIVE_SPC_FLAG_H; 
 if (flags & REAL_SPC_FLAG_B) temp |= NATIVE_SPC_FLAG_B; 
 if (flags & REAL_SPC_FLAG_P) temp |= NATIVE_SPC_FLAG_P; 
 if (flags & REAL_SPC_FLAG_V) temp |= NATIVE_SPC_FLAG_V; 
 if (flags & REAL_SPC_FLAG_N) temp |= NATIVE_SPC_FLAG_N; 
 
 return temp; 
} 
 
const unsigned NATIVE_65c816_FLAG_C = 1; 
const unsigned NATIVE_65c816_FLAG_V = 2; 
const unsigned NATIVE_65c816_FLAG_M = 4; 
const unsigned NATIVE_65c816_FLAG_1 = 4; 
const unsigned NATIVE_65c816_FLAG_X = 8; 
const unsigned NATIVE_65c816_FLAG_B = 8; 
const unsigned NATIVE_65c816_FLAG_D = 0x10; 
const unsigned NATIVE_65c816_FLAG_I = 0x20; 
const unsigned NATIVE_65c816_FLAG_Z = 0x40; 
const unsigned NATIVE_65c816_FLAG_N = 0x80; 
 
const unsigned REAL_65c816_FLAG_C = 1; 
const unsigned REAL_65c816_FLAG_Z = 2; 
const unsigned REAL_65c816_FLAG_I = 4; 
const unsigned REAL_65c816_FLAG_D = 8; 
const unsigned REAL_65c816_FLAG_X = 0x10; 
const unsigned REAL_65c816_FLAG_B = 0x10; 
const unsigned REAL_65c816_FLAG_M = 0x20; 
const unsigned REAL_65c816_FLAG_1 = 0x20; 
const unsigned REAL_65c816_FLAG_V = 0x40; 
const unsigned REAL_65c816_FLAG_N = 0x80; 
 
const int SYMMETRIC_FLAGS_65c816_E0 = -1; 
const int SYMMETRIC_FLAGS_65c816_E1 = 0; 
 
unsigned char flags_native_to_65c816_E0(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & NATIVE_65c816_FLAG_C) temp |= REAL_65c816_FLAG_C; 
 if (flags & NATIVE_65c816_FLAG_Z) temp |= REAL_65c816_FLAG_Z; 
 if (flags & NATIVE_65c816_FLAG_I) temp |= REAL_65c816_FLAG_I; 
 if (flags & NATIVE_65c816_FLAG_D) temp |= REAL_65c816_FLAG_D; 
 if (flags & NATIVE_65c816_FLAG_X) temp |= REAL_65c816_FLAG_X; 
 if (flags & NATIVE_65c816_FLAG_M) temp |= REAL_65c816_FLAG_M; 
 if (flags & NATIVE_65c816_FLAG_V) temp |= REAL_65c816_FLAG_V; 
 if (flags & NATIVE_65c816_FLAG_N) temp |= REAL_65c816_FLAG_N; 
 
 return temp; 
} 
 
unsigned char flags_65c816_to_native_E0(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & REAL_65c816_FLAG_C) temp |= NATIVE_65c816_FLAG_C; 
 if (flags & REAL_65c816_FLAG_Z) temp |= NATIVE_65c816_FLAG_Z; 
 if (flags & REAL_65c816_FLAG_I) temp |= NATIVE_65c816_FLAG_I; 
 if (flags & REAL_65c816_FLAG_D) temp |= NATIVE_65c816_FLAG_D; 
 if (flags & REAL_65c816_FLAG_X) temp |= NATIVE_65c816_FLAG_X; 
 if (flags & REAL_65c816_FLAG_M) temp |= NATIVE_65c816_FLAG_M; 
 if (flags & REAL_65c816_FLAG_V) temp |= NATIVE_65c816_FLAG_V; 
 if (flags & REAL_65c816_FLAG_N) temp |= NATIVE_65c816_FLAG_N; 
 
 return temp; 
} 
 
unsigned char flags_native_to_65c816_E1(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & NATIVE_65c816_FLAG_C) temp |= REAL_65c816_FLAG_C; 
 if (flags & NATIVE_65c816_FLAG_Z) temp |= REAL_65c816_FLAG_Z; 
 if (flags & NATIVE_65c816_FLAG_I) temp |= REAL_65c816_FLAG_I; 
 if (flags & NATIVE_65c816_FLAG_D) temp |= REAL_65c816_FLAG_D; 
 if (flags & NATIVE_65c816_FLAG_B) temp |= REAL_65c816_FLAG_B; 
 temp |= REAL_65c816_FLAG_1; 
 if (flags & NATIVE_65c816_FLAG_V) temp |= REAL_65c816_FLAG_V; 
 if (flags & NATIVE_65c816_FLAG_N) temp |= REAL_65c816_FLAG_N; 
 
 return temp; 
} 
 
unsigned char flags_65c816_to_native_E1(unsigned char flags){ 
 unsigned char temp = 0; 
 
 if (flags & REAL_65c816_FLAG_C) temp |= NATIVE_65c816_FLAG_C; 
 if (flags & REAL_65c816_FLAG_Z) temp |= NATIVE_65c816_FLAG_Z; 
 if (flags & REAL_65c816_FLAG_I) temp |= NATIVE_65c816_FLAG_I; 
 if (flags & REAL_65c816_FLAG_D) temp |= NATIVE_65c816_FLAG_D; 
 // 65c816 B flag ONLY needs to be clear in stack after IRQ/NMI 
 temp |= NATIVE_65c816_FLAG_B; 
 temp |= NATIVE_65c816_FLAG_1; 
 if (flags & REAL_65c816_FLAG_V) temp |= NATIVE_65c816_FLAG_V; 
 if (flags & REAL_65c816_FLAG_N) temp |= NATIVE_65c816_FLAG_N; 
 
 return temp; 
} 
 
void generate_flags_table(FILE *out, char *label, 
                          unsigned char (*translator)(unsigned char flags)){ 
 int i; 
 
 fprintf(out, "%s:\n", label); 
 for (i = 0; i < 256; i++){ 
  if ((i & 7) == 0) fprintf(out, "%s ", BYTE_DIRECTIVE); 
  fprintf(out, "%4u", (*translator)(i)); 
  if ((i & 7) != 7) fprintf(out, ","); 
  else fprintf(out, "\n"); 
 } 
 fprintf(out, "\n"); 
} 
 
int main(int argc, char **argv){ 
 FILE *out; 
 
 out = fopen("CPUflags" OUTPUT_EXTENSION, "wt"); 
 if (!out){ 
  printf("Failure creating 65c816 CPU flag conversion tables\n"); 
  return -1; 
 } 
 
 if (SYMMETRIC_FLAGS_65c816_E0){ 
  fprintf(out, "%s %s,%s\n", GLOBAL_DIRECTIVE, "_E0_Setup_Flags_Table", "_E0_Restore_Flags_Table"); 
  fprintf(out, "%s:\n", "_E0_Setup_Flags_Table"); 
  generate_flags_table(out, "_E0_Restore_Flags_Table", 
   flags_native_to_65c816_E0); 
 } else { 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_E0_Setup_Flags_Table"); 
  generate_flags_table(out, "_E0_Setup_Flags_Table", 
   flags_native_to_65c816_E0); 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_E0_Restore_Flags_Table"); 
  generate_flags_table(out, "_E0_Restore_Flags_Table", 
   flags_65c816_to_native_E0); 
 } 
 
 if (SYMMETRIC_FLAGS_65c816_E1){ 
  fprintf(out, "%s %s,%s\n", GLOBAL_DIRECTIVE, "_E1_Setup_Flags_Table", "_E1_Restore_Flags_Table"); 
  fprintf(out, "%s:\n", "_E1_Setup_Flags_Table"); 
  generate_flags_table(out, "_E1_Restore_Flags_Table", 
   flags_native_to_65c816_E1); 
 } else { 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_E1_Setup_Flags_Table"); 
  generate_flags_table(out, "_E1_Setup_Flags_Table", 
   flags_native_to_65c816_E1); 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_E1_Restore_Flags_Table"); 
  generate_flags_table(out, "_E1_Restore_Flags_Table", 
   flags_65c816_to_native_E1); 
 } 
 
 out = freopen("SPCflags" OUTPUT_EXTENSION, "wt", out); 
 if (!out){ 
  printf("Failure creating SPC700 CPU flag conversion tables\n"); 
  return -1; 
 } 
 
 if (SYMMETRIC_FLAGS_SPC){ 
  fprintf(out, "%s %s,%s\n", GLOBAL_DIRECTIVE, "_SPC_Setup_Flags_Table", "_SPC_Restore_Flags_Table"); 
  fprintf(out, "%s:\n", "_SPC_Setup_Flags_Table"); 
  generate_flags_table(out, "_SPC_Restore_Flags_Table", 
   flags_native_to_SPC); 
 } else { 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_SPC_Setup_Flags_Table"); 
  generate_flags_table(out, "_SPC_Setup_Flags_Table", 
   flags_native_to_SPC); 
  fprintf(out, "%s %s\n", GLOBAL_DIRECTIVE, "_SPC_Restore_Flags_Table"); 
  generate_flags_table(out, "_SPC_Restore_Flags_Table", 
   flags_SPC_to_native); 
 } 
 
 fclose(out); 
 
#ifndef DJGPP_CPU 
 out = fopen("CPUflags" ".i", "wt"); 
 if (!out){ 
  printf("Failure creating 65c816 CPU flag table import include file\n"); 
  return -1; 
 } 
 
 fprintf(out, "%s %s,%s\n", "extern", "_E0_Setup_Flags_Table", "_E0_Restore_Flags_Table"); 
 fprintf(out, "%s %s,%s\n", "extern", "_E1_Setup_Flags_Table", "_E1_Restore_Flags_Table"); 
 fclose(out); 
 
 out = fopen("SPCflags" ".i", "wt"); 
 if (!out){ 
  printf("Failure creating SPC700 CPU flag table import include file\n"); 
  return -1; 
 } 
 fprintf(out, "%s %s,%s\n", "extern", "_SPC_Setup_Flags_Table", "_SPC_Restore_Flags_Table"); 
 fclose(out); 
#endif 
 
 return 0; 
}