+++ /dev/null
-;-----------------------------------------------------------\r
-;\r
-; MXHL.ASM - Horizontal line mask utility\r
-; Copyright (c) 1993,1994 by Alessandro Scotti\r
-;\r
-;-----------------------------------------------------------\r
-WARN PRO\r
-INCLUDE MODEX.DEF\r
-\r
-PUBLIC subHorizontalLineInfo\r
-\r
-MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
- ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
-\r
-EXTRN mx_BytesPerLine : WORD\r
-\r
-tblLeftSize DW 00h, 03h, 02h, 01h\r
-tblLeftMask DB 00h, 0Eh, 0Ch, 08h\r
-tblRightMask DB 00h, 01h, 03h, 07h\r
-tblPatchMask DB 02h, 06h\r
-\r
-;-----------------------------------------------------------\r
-;\r
-; Prepares register for fast horizontal line drawing.\r
-;\r
-; Input:\r
-; BX, AX = X, Y address of left pixel\r
-; CX = line width\r
-; Output:\r
-; DI = left pixel offset in video memory\r
-; AL = left block write plane mask (0 = none)\r
-; AH = right block write plane mask (0 = none)\r
-; CX = center block width in 4-pixel blocks\r
-;\r
-subHorizontalLineInfo PROC NEAR\r
- ASSUME ds:NOTHING\r
-\r
- mul [mx_BytesPerLine]\r
- mov di, bx\r
- shr di, 1\r
- shr di, 1\r
- add di, ax ; Offset of left pixel\r
-\r
- and bx, 03h\r
- mov al, tblLeftMask[bx]\r
- shl bx, 1\r
- sub cx, tblLeftSize[bx]\r
- jge @@1 ; Ok to continue\r
-\r
-; Special case: start and end in the middle of a 4-pixel block.\r
-; There are only three cases:\r
-; Pixels Left mask CX CX+2 Patch mask Result\r
-; 1) ..o. ..xx -1 1 .xx. ..x.\r
-; 2) .oo. .xxx -1 1 .xx. .xx.\r
-; 3) .o.. .xxx -2 0 .x.. .x..\r
-; All other cases are automatically handled with the standard masks.\r
- mov bx, cx\r
- inc bx\r
- inc bx\r
- and al, tblPatchMask[bx] ; Combine masks\r
- xor ah, ah ; No right block\r
- xor cx, cx ; No center block\r
- jmp @@Exit\r
-\r
-@@1:\r
- mov bx, cx\r
- and bx, 03h\r
- mov ah, tblRightMask[bx]\r
- shr cx, 2\r
-\r
-@@Exit:\r
- ret\r
-subHorizontalLineInfo ENDP\r
-\r
-MX_TEXT ENDS\r
-END\r