peep.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #ifndef NORCSID
  2. static char rcsid[] = "$Header$";
  3. #endif
  4. #include <stdio.h>
  5. /*
  6. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  7. *
  8. * This product is part of the Amsterdam Compiler Kit.
  9. *
  10. * Permission to use, sell, duplicate or disclose this software must be
  11. * obtained in writing. Requests for such permissions may be sent to
  12. *
  13. * Dr. Andrew S. Tanenbaum
  14. * Wiskundig Seminarium
  15. * Vrije Universiteit
  16. * Postbox 7161
  17. * 1007 MC Amsterdam
  18. * The Netherlands
  19. *
  20. * Author: Hans van Staveren
  21. */
  22. char buf[512];
  23. char *index();
  24. main() {
  25. register n,sa;
  26. register char *p;
  27. sa=0;
  28. for (;;) {
  29. getline(buf);
  30. if (n=stackadjust()) {
  31. sa += n;
  32. continue;
  33. }
  34. if (nullinstruction())
  35. continue;
  36. if (sa) {
  37. if (buf[0]=='t' && buf[1]=='s' && buf[2]=='t' && buf[3]==' ') {
  38. sa -= 2;
  39. buf[0]='m';
  40. buf[1]='o';
  41. buf[2]='v';
  42. strcat(buf,",(sp)+");
  43. } else if (buf[0]=='m' && buf[1]=='o' && buf[2]=='v' &&
  44. buf[3]==' ' && (p=index(&buf[5],','))!=0 &&
  45. p[1]=='-' && p[2]=='(' && p[3]=='s') {
  46. sa -= 2;
  47. p[1]=' ';
  48. }
  49. }
  50. switch(sa) {
  51. case 0:break;
  52. case 2:puts("tst (sp)+");sa=0;break;
  53. case 4:puts("cmp (sp)+,(sp)+");sa=0;break;
  54. case 6:puts("add $06,sp");sa=0;break;
  55. }
  56. puts(buf);
  57. }
  58. }
  59. getline(buf) register char *buf; {
  60. register c;
  61. while ((c=getchar())==' ' || c=='\t')
  62. ;
  63. if (c==EOF)
  64. exit(0);
  65. do *buf++=c;
  66. while ((c=getchar())!='\n');
  67. *buf=0;
  68. }
  69. stackadjust() {
  70. if (buf[0]=='t' &&
  71. buf[1]=='s' &&
  72. buf[2]=='t' &&
  73. buf[3]==' ' &&
  74. buf[4]=='(' &&
  75. buf[5]=='s' &&
  76. buf[6]=='p' &&
  77. buf[7]==')' &&
  78. buf[8]=='+') return(2);
  79. if (buf[0]=='c' &&
  80. buf[1]=='m' &&
  81. buf[2]=='p' &&
  82. buf[3]==' ' &&
  83. buf[4]=='(' &&
  84. buf[5]=='s' &&
  85. buf[6]=='p' &&
  86. buf[7]==')' &&
  87. buf[8]=='+' &&
  88. buf[9]==',' &&
  89. buf[10]=='(' &&
  90. buf[11]=='s' &&
  91. buf[12]=='p' &&
  92. buf[13]==')' &&
  93. buf[14]=='+') return(4);
  94. if (buf[0]=='a' &&
  95. buf[1]=='d' &&
  96. buf[2]=='d' &&
  97. buf[3]==' ' &&
  98. buf[4]=='$' &&
  99. buf[5]=='0' &&
  100. buf[6]=='6' &&
  101. buf[7]==',' &&
  102. buf[8]=='s' &&
  103. buf[9]=='p' &&
  104. buf[10]==0) return(6);
  105. return(0);
  106. }
  107. nullinstruction() {
  108. register char *p;
  109. if (buf[4]=='$' && buf[5]=='0' && buf[6]=='0' && buf[7]==',') {
  110. p=index(buf,'-');
  111. if (p!=0 && p[1]=='(')
  112. return(0);
  113. p=index(buf,'+');
  114. if (p!=0 && p[-1]==')')
  115. return(0);
  116. if (buf[0]=='b' && buf[1]=='i' && (buf[2]=='s' || buf[2]=='c'))
  117. return(1);
  118. if (buf[0]=='a' && buf[1]=='d' && buf[2]=='d')
  119. return(1);
  120. if (buf[0]=='s' && buf[1]=='u' && buf[2]=='b')
  121. return(1);
  122. }
  123. return(0);
  124. }