home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / gfx / megajitter-1.3.lha / MegaJitter-1.3 / ja.s next >
Text File  |  1994-05-19  |  6KB  |  222 lines

  1. *****************************************************************************
  2. * MegaJitter        written by L. Vanhelsuwé    (C) Aug 1992-94
  3. * ----------        ------------------------    ---------------
  4. *
  5. * This file contains optimized assembler routines to be called from C.
  6. *
  7. * HISTORY
  8. * -------
  9. * 20-APR-1994:    Added register args versions of routines
  10. * 12-MAY-1994:    Further optimized code by using INTERLEAVED bitplanes.
  11. *
  12. * NOTES:    - screen coordinates are assumed to be clipped by caller.
  13. *              No clipping is performed here!
  14. *
  15. *            - Number of bitplanes is fixed at 4.
  16. *
  17. *            - Resolution is fixed at 512 * 512
  18. *
  19. *            - Bitplanes are INTERLEAVED for extra performance.
  20. *
  21. *****************************************************************************
  22.  
  23.         XREF    _plane0            ;ptr to bitplane 0
  24.  
  25.         xdef    _asm_plot_pixel
  26.         xdef    _asm_read_pixel
  27.         xdef    _asm_is_food
  28.         xdef    _asm_is_empty
  29.         xdef    _asm_fastwipe_pixel
  30.  
  31. SCREEN_MAXX    equ    512            ; all code below hardwired for this
  32. SCREEN_MAXY    equ    512
  33.  
  34. NUM_COLORS    equ    16            ; 4 bitplanes **!!
  35.  
  36.  
  37. ;-----------------------------------------------------------------------------
  38. ; Here follow the versions with stack-based arguments.
  39. ;-----------------------------------------------------------------------------
  40.  
  41. **!! I'm being x-tremely naughty here. I'm messing around with registers
  42. **!! in the d2-d7/a2-a6 group which I don't save. Lattice C doesn't seem to mind...
  43.  
  44. ;-----------------------------------------------------------------------------
  45. ; FastPlot ( FastPixel*, x, y, color)
  46. ;
  47. ; D0/D1/D2 = X/Y  color 0..15        USES D0,D1,D2,D3    A0,A1
  48. ;-----------------------------------------------------------------------------
  49.  
  50. IPIXEL        MACRO
  51.  
  52.         b\4    d3,(a0)        ;bitplane 0
  53.         b\3    d3,064(a0)    ;bitplane 1 (64 bytes further down)
  54.         b\2    d3,128(a0)    ;bitplane 2
  55.         b\1    d3,192(a0)    ;bitplane 3
  56.         rts
  57.  
  58.         ENDM
  59.  
  60.  
  61.         cnop    0,8
  62.  
  63. _asm_plot_pixel    move.l    4(sp),a1        ;get FastPix*
  64.         movem.l    8(sp),d0/d1/d2        ;get x,y,color
  65.  
  66.         move.w    d0,d3            ;copy of x (no need to AND)
  67.         not.b    d3            ;0->7  7->0
  68.  
  69.         lsl.l    #8,d1            ;*256 for 512 pixel wide interleaved screen
  70.         lsr.w    #3,d0            ;pixel offset -> byte offset
  71.         add.l    d1,d0            ; calc byte offset
  72.  
  73.         move.l    d0,(a1)+        ;store offset for wipe_pixel !
  74.         move.l    d3,(a1)+        ;store bitno  for wipe_pixel !
  75.  
  76.         move.l    _plane0,a0
  77.         add.l    d0,a0            ;-> byte in bitplane 0
  78.  
  79.         and.w    #NUM_COLORS-1,d2
  80.         add.w    d2,d2
  81.         jmp    piX0(PC,D2*8)        ;execute 1 of 16 custom plotters
  82.  
  83. piX0        IPIXEL    clr,clr,clr,clr
  84.         IPIXEL    clr,clr,clr,set
  85.         IPIXEL    clr,clr,set,clr
  86.         IPIXEL    clr,clr,set,set
  87.         IPIXEL    clr,set,clr,clr
  88.         IPIXEL    clr,set,clr,set
  89.         IPIXEL    clr,set,set,clr
  90.         IPIXEL    clr,set,set,set
  91.         IPIXEL    set,clr,clr,clr
  92.         IPIXEL    set,clr,clr,set
  93.         IPIXEL    set,clr,set,clr
  94.         IPIXEL    set,clr,set,set
  95.         IPIXEL    set,set,clr,clr
  96.         IPIXEL    set,set,clr,set
  97.         IPIXEL    set,set,set,clr
  98.         IPIXEL    set,set,set,set
  99.  
  100. ;-----------------------------------------------------------------------------
  101. ; BOOL = is_food  (x, y)
  102. ; BOOL = is_empty (x, y)
  103. ;-----------------------------------------------------------------------------
  104. _asm_is_food    movem.l    4(sp),d0-d1        ;x, y
  105.  
  106.         move.w    d0,d2            ;copy of x
  107.         not.b    d2            ;0->7  7->0
  108.  
  109.         lsr.w    #3,d0            ;pixel offset -> byte offset
  110.         lsl.l    #8,d1            ;Y*256 (256 = bytesPerRow)
  111.         add.l    d0,d1            ;= byte offset
  112.  
  113.         moveq    #0,d0            ;assume FALSE
  114.  
  115.         move.l    _plane0,a0
  116.         add.l    d1,a0            ;-> byte in bitplane 0
  117.  
  118.         btst    d2,(a0)            ;test bit (no need for AND#7)
  119.         beq.s    no_food2        ;if any bit is 0 -> FALSE
  120.  
  121.           btst    d2,064(a0)
  122.           beq.s    no_food2        ;%11xx
  123.  
  124.             btst   d2,128(a0)
  125.             beq.s  no_food2            ;%111x
  126.  
  127.               btst    d2,192(a0)
  128.               beq.s    no_food2            ;%1111
  129.  
  130.         moveq    #-1,d0            ;return TRUE
  131.  
  132. no_food2    rts
  133.  
  134. ;-----------------------------------------------------------------------------
  135. _asm_is_empty    movem.l    4(sp),d0-d1        ;x, y
  136.  
  137.         move.w    d0,d2            ;copy of x
  138.         not.b    d2            ;0->7  7->0
  139.  
  140.         lsr.w    #3,d0            ;pixel offset -> byte offset
  141.         lsl.l    #8,d1            ;Y*256
  142.         add.l    d0,d1            ;= byte offset
  143.  
  144.         moveq    #0,d0            ;assume FALSE
  145.  
  146.         move.l    _plane0,a0
  147.         add.l    d1,a0
  148.  
  149.         btst    d2,(a0)            ;test bit (no need for AND#7)
  150.         bne.s    no_food2        ;if any bit is 1 -> FALSE
  151.  
  152.           btst    d2,064(a0)
  153.           bne.s    no_food2
  154.  
  155.             btst    d2,128(a0)
  156.             bne.s   no_food2
  157.  
  158.               btst    d2,192(a0)
  159.               bne.s    no_food2
  160.  
  161.         moveq    #-1,d0            ;return TRUE
  162.  
  163.         rts
  164.  
  165. ;-----------------------------------------------------------------------------
  166. ; FastWipe (FastPixel*)
  167. ;
  168. ;-----------------------------------------------------------------------------
  169.         cnop    0,2
  170.  
  171. _asm_fastwipe_pixel
  172.         move.l    4(sp),a1        ;grab arg
  173.  
  174.         move.l    _plane0,a0        ;grab bitplane base ptr
  175.  
  176.         add.l    (a1)+,a0        ;-> byte containing pixel
  177.         move.l    (a1)+,d0        ;fetch pre-computed pixel
  178.  
  179.         bclr    d0,(a0)            ;erase pixel    in plane 0
  180.         bclr    d0,064(a0)        ;        in plane 1
  181.         bclr    d0,128(a0)        ;        in plane 2
  182.         bclr    d0,192(a0)        ;        in plane 3
  183.         rts
  184.  
  185. ;-----------------------------------------------------------------------------
  186. ; color = ReadPixel (x, y)
  187. ;
  188. ; D0/D1 = X/Y  
  189. ;-----------------------------------------------------------------------------
  190. _asm_read_pixel    movem.l    4(sp),d0-d1        ;x, y
  191.  
  192.         move.w    d0,d2            ;isolate bit #
  193.         not.b    d2            ;0->7  7->0
  194.  
  195.         lsr.w    #3,d0            ;pixel offset -> byte offset
  196.         lsl.l    #8,d1            ;* bm_BytesPerRow
  197.         add.l    d0,d1            ;= byte offset
  198.  
  199.         moveq    #0,d0            ;assume color 0
  200.  
  201.         move.l    _plane0,a1        ;plane 0 ptr
  202.         add.l    d1,a1            ;-> byte in plane 0 to be tested
  203.  
  204.         btst    d2,(a1)            ;test bit
  205.         beq.s    next_fplane02
  206.         moveq    #1,d0            ;if set, add bit in color
  207.  
  208. next_fplane02    btst    d2,064(a1)
  209.         beq.s    next_fplane12
  210.         addq.b    #2,d0
  211.  
  212. next_fplane12    btst    d2,128(a1)
  213.         beq.s    next_fplane22
  214.         addq.b    #4,d0
  215.  
  216. next_fplane22    btst    d2,192(a1)
  217.         beq.s    next_fplane32
  218.         addq.b    #8,d0
  219.  
  220. next_fplane32    rts
  221.  
  222.