home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / telecom / 107 / c / tiny.s < prev    next >
Encoding:
Text File  |  1987-02-20  |  2.5 KB  |  96 lines

  1. *------------------------------------------------------------------------------
  2. * Tiny format unpacker, call from C:
  3. *    untiny(ctl_adr,dat_adr,scr_adr,ctl_len);
  4. *  Register usage:
  5. *    d0    work register
  6. *    d1    work register
  7. *    d2    - not used -
  8. *    d3    control buffer offset
  9. *    d4    - not used -
  10. *    d5    screen offset
  11. *    d6    count for repeat/copy
  12. *    d7    length of control buffer <constant>
  13. *    a3    control buffer address <constant>
  14. *    a4    data buffer address
  15. *    a5    screen buffer address <constant>
  16. *------------------------------------------------------------------------------
  17. .globl _untiny
  18.  
  19. _untiny    link a6,#0
  20.     movem.l d2-d6/a3-a5,-(sp)
  21.     move.l 8(a6),a3        * Control buffer address
  22.     move.l 12(a6),a4    * Packed data buffer address
  23.     move.l 16(a6),a5    * Screen buffer address
  24.     move 20(a6),d7        * # control bytes
  25.     clr.l d3        * Control buffer offset
  26.     clr.l d5        * Screen buffer offset
  27.  
  28. t_loop    jsr get_cnt            * Get next count value -> d6
  29.     tst d6
  30.     bpl rpt_dat            * (Repeat string)
  31.     neg d6
  32.  
  33. cpy_dat subq #1,d6            * Copy string of unique words...
  34.     moveq #8,d1
  35. c_loop    move.b (a4)+,d0
  36.     lsl d1,d0
  37.     move.b (a4)+,d0
  38.     move d0,0(a5,d5.w)
  39.     jsr get_adr            * Update d5 (scrn offset)
  40.     dbra d6,c_loop
  41.     cmp d7,d3            * Check if any control bytes left
  42.     blt t_loop
  43.     bra unt_xit
  44.  
  45. rpt_dat subq #1,d6            * Repeat string of words...
  46.     move.b (a4)+,d0
  47.     moveq #8,d1
  48.     lsl d1,d0
  49.     move.b (a4)+,d0
  50. r_loop    move d0,0(a5,d5.w)
  51.     jsr get_adr            * Update d5 (scrn offset)
  52.     dbra d6,r_loop
  53.     cmp d7,d3            * Check if any control bytes left
  54.     blt t_loop
  55.  
  56. unt_xit    tst.l (sp)+
  57.     movem.l (sp)+,d3-d6/a3-a5    * Restore registers
  58.     unlk a6
  59.     rts
  60.  
  61.  
  62. *------------------------------------------------------------------------------
  63. * Get count value, return in d6...
  64.  
  65. get_cnt    move.b 0(a3,d3.w),d6        * Get next control byte
  66.     beq gcnt2            * Br. if zero
  67.     cmp.b #1,d6
  68.     beq gcnt2            * Br. if one
  69.     addq #1,d3
  70.     ext.w d6            * Return a word
  71.     rts
  72.  
  73. gcnt2    move.b 1(a3,d3.w),d0        * Get hi byte of count
  74.     lsl #7,d0
  75.     lsl #1,d0
  76.     move.b 2(a3,d3.w),d0        * Get lo byte of count
  77.     addq #3,d3
  78.     tst.b d6
  79.     beq gcnt_x
  80.     neg d0                * Neg.value flags a copy operation
  81. gcnt_x    move d0,d6
  82.     rts
  83.  
  84.  
  85. *------------------------------------------------------------------------------
  86. *  Update screen offset in d5...
  87.  
  88. get_adr    add #160,d5            * Next scrn row
  89.     cmp #32000,d5            * Past bottom line?
  90.     blt adr_xit            * No, return.
  91.     sub #31992,d5            * Top of next column, same plane
  92.     cmp #160,d5            * Past end of line?
  93.     blt adr_xit            * No, return.
  94.     sub #158,d5            * Next plane.
  95. adr_xit    rts
  96.