sunpack.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #ifdef PC
  2. char *sUnpack(char *in,char *out,char *dic) {
  3. char c; char *out0=out;
  4. while ((c=*in++)) {
  5. if ((char)c>=0) *out++=c;
  6. else {
  7. if (c==(char)0x80) *out++=*in++;
  8. else if (c==(char)0xFF) {
  9. } else {
  10. char *dp=dic;
  11. c-=(char)0x81;
  12. while (c--) {
  13. while (*dp++);
  14. }
  15. strcpy(out,dp);
  16. while (*out++); out--;
  17. }
  18. }
  19. }
  20. *out++=0;
  21. return out0;
  22. }
  23. #else
  24. char *__attribute__((stkparm)) sUnpack(char *in,char *out,char *dic);
  25. asm(
  26. " xdef sUnpack\n"
  27. "sUnpack:\n"
  28. "/* bra.s sUnpack*/\n"
  29. " move.l 4(%sp),%a0\n"
  30. " move.l 8(%sp),%a1\n"
  31. " moveq #126,%d1\n"
  32. " moveq #0,%d0\n"
  33. " move.b (%a0)+,%d0\n"
  34. " beq su_quit\n"
  35. " bmi su_special\n"
  36. "su_copy_lp:\n"
  37. " move.b %d0,(%a1)+\n"
  38. "su_next:\n"
  39. " move.b (%a0)+,%d0\n"
  40. " bgt su_copy_lp\n"
  41. " beq su_quit\n"
  42. "su_special:\n"
  43. " subq.b #1,%d0\n"
  44. " bmi su_not_escape\n"
  45. " move.b (%a0)+,(%a1)+\n"
  46. " bra su_next\n"
  47. "su_not_escape:\n"
  48. " addq.b #2,%d0\n"
  49. " bmi su_not_romcall\n"
  50. " \n"
  51. "su_not_romcall:\n"
  52. " add.b %d1,%d0\n"
  53. " move.l %a0,%d2\n"
  54. " move.l 12(%sp),%a0\n"
  55. " dbf %d0,su_search_loop\n"
  56. " bra su_search_done\n"
  57. "su_search_loop:\n"
  58. " tst.b (%a0)+\n"
  59. " bne su_search_loop\n"
  60. " dbf %d0,su_search_loop\n"
  61. "su_search_done:\n"
  62. " move.b (%a0)+,(%a1)+\n"
  63. " bne su_search_done\n"
  64. " subq.w #1,%a1\n"
  65. " move.l %d2,%a0\n"
  66. " moveq #0,%d0\n"
  67. " bra su_next\n"
  68. "su_quit:\n"
  69. " move.b %d0,(%a1)+\n"
  70. " move.l 8(%sp),%a0\n"
  71. " rts");
  72. #endif