; Here is a VERY fast, 9-10 clocks/pixel on average RLE transparent bit
; blitter.  Also, it's only 77 bytes.  The format is:
;
;  <1 - 127>   1-127 bytes follow
;  <-1 - -126> 1-126 bytes skipped
;  <0> <n> <b> repeat <b>, n times
;  <81h>       go to next line
;  <80h>       end of picture

 ;*************************************************************;
 ;* Fast Transparent Bit Blitter - By Tenie Remmel - 77 bytes *;
 ;*************************************************************;

 Ideal

 Public      TransBlit

 Model Tiny
 P186
 CodeSeg

 Proc        TransBlit
             ;Supply DS:SI = picture, DI = screen offset (320 * y + x)
             ;For video mode 13h, Assumes ES = 0A000h (video memory)

             pusha              ;Save all registers

             mov bx,di          ;Save offset in BX
             xor cx,cx          ;Clear CX, AX
             xor ax,ax

 PixLoop:    lodsb              ;Get byte
             test al,al         ;Test it
             jg MoveData        ;Positive = data bytes follow
             jz ByteRLE         ;Zero = next byte is repeat count
             cmp al,81h         ;Test again
             jl Done            ;80h = End of picture
             jz NewLine         ;81h = End of line

 IsHole:     neg al             ;Negative = skip bytes
             add di,ax          ;Add into DI
             jmp PixLoop        ;Loop back

 MoveData:   mov cl,al          ;Put count in CL, DL
             mov dl,al
             and dl,1           ;DL = parity
             shr cl,1           ;CL = number of words
             rep movsw          ;Move by words
             test dl,dl         ;Was it odd?
             jz PixLoop         ;No, loop back
             movsb              ;Was odd, copy last byte
             jmp PixLoop        ;Loop back

 NewLine:    add bx,320         ;Next line
             mov di,bx          ;Put in DI
             jmp PixLoop        ;Loop back

 ByteRLE:    lodsw              ;Load repeat count, byte
             mov cl,al          ;Put count in CL, DL
             mov dl,al
             mov al,ah          ;Put byte in AL, AH
             and dl,1           ;DL = parity
             shr cl,1           ;CL = number of words
             rep stosw          ;Store by words
             xor ah,ah          ;Clear AH
             test dl,dl         ;Was it odd?
             jz PixLoop         ;No, loop back
             stosb              ;Was odd, store last byte
             jmp PixLoop        ;Loop back

 Done:       popa               ;Restore registers
             ret                ;Return

 EndP        TransBlit

 End
