machine.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Giovanni Agosta, Andrea Di Biagio
  3. * Politecnico di Milano, 2007
  4. *
  5. * machine.c
  6. * Formal Languages & Compilers Machine, 2007/2008
  7. *
  8. */
  9. #include "machine.h"
  10. /* Debug printf, print the value of the status word */
  11. void print_psw(FILE *file)
  12. {
  13. /* precondition */
  14. if (file == NULL)
  15. file = stderr;
  16. fprintf(file, "PSW=[0x%08x]\n", psw);
  17. fprintf(file, "CARRY (C):\t %d\nOVERFLOW (V):\t %d\n"
  18. "ZERO (Z):\t %d\nNEGATIVE (N):\t %d\n\n"
  19. , getflag(CARRY), getflag(OVERFLOW)
  20. , getflag(ZERO), getflag(NEGATIVE));
  21. }
  22. /* Debug printf, print the content of the register file */
  23. void print_regs(FILE *file)
  24. {
  25. int i;
  26. /* precondition */
  27. if (file == NULL)
  28. file = stderr;
  29. fprintf(file, "\n*** REGISTER FILE STATUS ***\n");
  30. for (i=0; i<NREGS / 8; i++)
  31. fprintf(file,"R%d =[0x%08x]\t", i, reg[i]);
  32. fprintf(file, "\n");
  33. for (i=NREGS / 8; i<NREGS / 4; i++)
  34. fprintf(file,"R%d =[0x%08x]\t", i, reg[i]);
  35. fprintf(file, "\n");
  36. for (i=NREGS / 4; i< (3*NREGS / 8); i++)
  37. {
  38. if (i < 10)
  39. fprintf(file,"R%d =[0x%08x]\t", i, reg[i]);
  40. else
  41. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  42. }
  43. fprintf(file, "\n");
  44. for (i=(3*NREGS / 8); i<NREGS / 2; i++)
  45. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  46. fprintf(file, "\n");
  47. for (i= NREGS / 2; i<(5*NREGS / 8); i++)
  48. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  49. fprintf(file, "\n");
  50. for (i=(5*NREGS / 8); i<(6*NREGS / 8); i++)
  51. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  52. fprintf(file, "\n");
  53. for (i=(6*NREGS / 8); i<(7*NREGS / 8); i++)
  54. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  55. fprintf(file, "\n");
  56. for (i=(7*NREGS / 8); i<NREGS; i++)
  57. fprintf(file,"R%d=[0x%08x]\t", i, reg[i]);
  58. fprintf(file,"\n");
  59. }
  60. /* Debug, execute a memory dump */
  61. void print_Memory_Dump(FILE *file, int lcode)
  62. {
  63. int i;
  64. /* if not specified, `file' is set to stderr */
  65. if (file == NULL)
  66. file = stderr;
  67. fprintf(file,"*** Memory Dump *** \n");
  68. for (i=0; i<lcode; i++)
  69. fprintf(file,"[0x%08x]\n", mem[i]);
  70. fprintf(file,"*** END Memory Dump *** \n");
  71. }
  72. /* Get flag from processor status word */
  73. unsigned int getflag(int flag)
  74. {
  75. return getbits(psw, flag, flag);
  76. }
  77. /* Set flag in processor status word*/
  78. void setflag(int flag, int value){
  79. int mask = 1<<flag;
  80. if (value)
  81. psw = psw | mask;
  82. else
  83. psw = psw & ~mask;
  84. }