* FlipBits.asm                                          Kirk A. Baker
* Flips bitmaps on X and Y axis                         10-16-89

* =================================================================================
*
* FlipBitMapY
*   Given a pointer to the above FlipData and a pointer to a BitMap, FlipBitMapY
* will flip all planes of a  bitmap on their Y-axis.
*
* =================================================================================

bm_BytesPerRow EQU 0
bm_Rows        EQU 2
bm_Depth       EQU 5
bm_Planes      EQU 8


    PUBLIC _FlipYData

* FlipBitMapY(&myBitmap);

    PUBLIC _FlipBitMapY

_FlipBitMapY:
            movem.l     d3-d5/a2-a4,-(sp)
            move.l      28(sp),a2                   ;BitMap addr in a2
            lea         _FlipYData,a3               ;FlipYData pointer in a3
            move.w      bm_Rows(a2),d0              ;
            subq.l      #1,d0                       ;# rows in d0
            move.l      d0,d5                       ;safe keeping of # rows
            moveq.l     #0,d1                       ;
            move.w      bm_BytesPerRow(a2),d1       ;
            moveq.l     #0,d2                       ;
            move.b      bm_Depth(a2),d2             ;
            subq.l      #1,d2                       ;depth in d2
            addq.l      #bm_Planes,a2               ;start of array of ptrs to planes
            moveq.l     #0,d3
            moveq.l     #0,d4
4$:         move.l      (a2)+,a4                    ;plane in a4
3$:          move.l     a4,a0                       ;start of plane in a0
             move.l     a4,a1
             adda.l     d1,a1                       ;end of row in a1
1$:           move.b    -(a1),d3                    ;byte to flip in d3
              move.b    0(a3,d3.w),d3               ;flipped byte in d3
              move.b    (a0),d4                     ;byte to flip in d4
              move.b    0(a3,d4.w),(a1)             ;put a0's flipped byte in (a1)
              move.b    d3,(a0)+                    ;put a1's flipped byte in (a0)
              cmp.l     a0,a1                       ;
              bgt.s     1$                          ;if a1 > a0 then flip again
2$:          adda.l     d1,a4                       ; index into next row
             dbf.w      d0,3$
             move.l     d5,d0                       ;restore #rows
            dbf.w       d2,4$
            movem.l     (sp)+,d3-d5/a2-a4
            rts


_FlipYData:
   dc.b   %00000000
   dc.b   %10000000
   dc.b   %01000000
   dc.b   %11000000
   dc.b   %00100000
   dc.b   %10100000
   dc.b   %01100000
   dc.b   %11100000
   dc.b   %00010000
   dc.b   %10010000
   dc.b   %01010000
   dc.b   %11010000
   dc.b   %00110000
   dc.b   %10110000
   dc.b   %01110000
   dc.b   %11110000
   dc.b   %00001000
   dc.b   %10001000
   dc.b   %01001000
   dc.b   %11001000
   dc.b   %00101000
   dc.b   %10101000
   dc.b   %01101000
   dc.b   %11101000
   dc.b   %00011000
   dc.b   %10011000
   dc.b   %01011000
   dc.b   %11011000
   dc.b   %00111000
   dc.b   %10111000
   dc.b   %01111000
   dc.b   %11111000
   dc.b   %00000100
   dc.b   %10000100
   dc.b   %01000100
   dc.b   %11000100
   dc.b   %00100100
   dc.b   %10100100
   dc.b   %01100100
   dc.b   %11100100
   dc.b   %00010100
   dc.b   %10010100
   dc.b   %01010100
   dc.b   %11010100
   dc.b   %00110100
   dc.b   %10110100
   dc.b   %01110100
   dc.b   %11110100
   dc.b   %00001100
   dc.b   %10001100
   dc.b   %01001100
   dc.b   %11001100
   dc.b   %00101100
   dc.b   %10101100
   dc.b   %01101100
   dc.b   %11101100
   dc.b   %00011100
   dc.b   %10011100
   dc.b   %01011100
   dc.b   %11011100
   dc.b   %00111100
   dc.b   %10111100
   dc.b   %01111100
   dc.b   %11111100
   dc.b   %00000010
   dc.b   %10000010
   dc.b   %01000010
   dc.b   %11000010
   dc.b   %00100010
   dc.b   %10100010
   dc.b   %01100010
   dc.b   %11100010
   dc.b   %00010010
   dc.b   %10010010
   dc.b   %01010010
   dc.b   %11010010
   dc.b   %00110010
   dc.b   %10110010
   dc.b   %01110010
   dc.b   %11110010
   dc.b   %00001010
   dc.b   %10001010
   dc.b   %01001010
   dc.b   %11001010
   dc.b   %00101010
   dc.b   %10101010
   dc.b   %01101010
   dc.b   %11101010
   dc.b   %00011010
   dc.b   %10011010
   dc.b   %01011010
   dc.b   %11011010
   dc.b   %00111010
   dc.b   %10111010
   dc.b   %01111010
   dc.b   %11111010
   dc.b   %00000110
   dc.b   %10000110
   dc.b   %01000110
   dc.b   %11000110
   dc.b   %00100110
   dc.b   %10100110
   dc.b   %01100110
   dc.b   %11100110
   dc.b   %00010110
   dc.b   %10010110
   dc.b   %01010110
   dc.b   %11010110
   dc.b   %00110110
   dc.b   %10110110
   dc.b   %01110110
   dc.b   %11110110
   dc.b   %00001110
   dc.b   %10001110
   dc.b   %01001110
   dc.b   %11001110
   dc.b   %00101110
   dc.b   %10101110
   dc.b   %01101110
   dc.b   %11101110
   dc.b   %00011110
   dc.b   %10011110
   dc.b   %01011110
   dc.b   %11011110
   dc.b   %00111110
   dc.b   %10111110
   dc.b   %01111110
   dc.b   %11111110
   dc.b   %00000001
   dc.b   %10000001
   dc.b   %01000001
   dc.b   %11000001
   dc.b   %00100001
   dc.b   %10100001
   dc.b   %01100001
   dc.b   %11100001
   dc.b   %00010001
   dc.b   %10010001
   dc.b   %01010001
   dc.b   %11010001
   dc.b   %00110001
   dc.b   %10110001
   dc.b   %01110001
   dc.b   %11110001
   dc.b   %00001001
   dc.b   %10001001
   dc.b   %01001001
   dc.b   %11001001
   dc.b   %00101001
   dc.b   %10101001
   dc.b   %01101001
   dc.b   %11101001
   dc.b   %00011001
   dc.b   %10011001
   dc.b   %01011001
   dc.b   %11011001
   dc.b   %00111001
   dc.b   %10111001
   dc.b   %01111001
   dc.b   %11111001
   dc.b   %00000101
   dc.b   %10000101
   dc.b   %01000101
   dc.b   %11000101
   dc.b   %00100101
   dc.b   %10100101
   dc.b   %01100101
   dc.b   %11100101
   dc.b   %00010101
   dc.b   %10010101
   dc.b   %01010101
   dc.b   %11010101
   dc.b   %00110101
   dc.b   %10110101
   dc.b   %01110101
   dc.b   %11110101
   dc.b   %00001101
   dc.b   %10001101
   dc.b   %01001101
   dc.b   %11001101
   dc.b   %00101101
   dc.b   %10101101
   dc.b   %01101101
   dc.b   %11101101
   dc.b   %00011101
   dc.b   %10011101
   dc.b   %01011101
   dc.b   %11011101
   dc.b   %00111101
   dc.b   %10111101
   dc.b   %01111101
   dc.b   %11111101
   dc.b   %00000011
   dc.b   %10000011
   dc.b   %01000011
   dc.b   %11000011
   dc.b   %00100011
   dc.b   %10100011
   dc.b   %01100011
   dc.b   %11100011
   dc.b   %00010011
   dc.b   %10010011
   dc.b   %01010011
   dc.b   %11010011
   dc.b   %00110011
   dc.b   %10110011
   dc.b   %01110011
   dc.b   %11110011
   dc.b   %00001011
   dc.b   %10001011
   dc.b   %01001011
   dc.b   %11001011
   dc.b   %00101011
   dc.b   %10101011
   dc.b   %01101011
   dc.b   %11101011
   dc.b   %00011011
   dc.b   %10011011
   dc.b   %01011011
   dc.b   %11011011
   dc.b   %00111011
   dc.b   %10111011
   dc.b   %01111011
   dc.b   %11111011
   dc.b   %00000111
   dc.b   %10000111
   dc.b   %01000111
   dc.b   %11000111
   dc.b   %00100111
   dc.b   %10100111
   dc.b   %01100111
   dc.b   %11100111
   dc.b   %00010111
   dc.b   %10010111
   dc.b   %01010111
   dc.b   %11010111
   dc.b   %00110111
   dc.b   %10110111
   dc.b   %01110111
   dc.b   %11110111
   dc.b   %00001111
   dc.b   %10001111
   dc.b   %01001111
   dc.b   %11001111
   dc.b   %00101111
   dc.b   %10101111
   dc.b   %01101111
   dc.b   %11101111
   dc.b   %00011111
   dc.b   %10011111
   dc.b   %01011111
   dc.b   %11011111
   dc.b   %00111111
   dc.b   %10111111
   dc.b   %01111111
   dc.b   %11111111


* FlipBitMapX(&myBitmap)

    PUBLIC _FlipBitMapX

_FlipBitMapX
            movem.l     d3-d6/a2,-(sp)
            move.l      24(sp),a2                   ;bitmap addr in a2
            moveq.l     #0,d1                       ;
            move.b      bm_Depth(a2),d1             ;
            subq.l      #1,d1                       ;depth in d1
            moveq.l     #0,d2                       ;
            move.w      bm_Rows(a2),d2              ;
            subq.l      #1,d2                       ;#rows in d2
            moveq.l     #0,d4                       ;
            move.w      bm_BytesPerRow(a2),d4       ;
            move.l      d4,d5                       ;
            move.l      d4,d6                       ;BytesPerRow in d6
            asl.l       #1,d5                       ;"backup" offset in d5
            subq.l      #1,d4                       ;adjusted BytesPerRow in d4
            move.l      d4,d3                       ;safe keeping of counter
            mulu.w      d2,d6                       ;index to last row
            addq.l      #bm_Planes,a2               ; a2 is now PlanePtr
2$:         move.l      (a2)+,a0                    ;beginning of plane
            move.l      a0,a1
            adda.l      d6,a1                       ;index a1 to begining of last row
1$:          move.b     (a0),d0
             move.b     (a1),(a0)+                  ;swap bytes in rows
             move.b     d0,(a1)+
             dbf.w      d4,1$
             suba.l     d5,a1                       ;"backup" a1
             move.l     d3,d4                       ;get BytesPerRow again
             cmp.l      a1,a0
             blt.s      1$
            dbf.w       d1,2$
            movem.l     (sp)+,d3-d6/a2
            rts

* EOF
