Annotation of ntddk/src/video/displays/vga/i386/glyphblt.asm, revision 1.1

1.1     ! root        1: ;---------------------------Module-Header------------------------------;
        !             2: ; Module Name: glyphblt.asm
        !             3: ;
        !             4: ; Output a glyph onto VGA screen
        !             5: ;
        !             6: ; Copyright (c) 1992 Microsoft Corporation
        !             7: ;-----------------------------------------------------------------------;
        !             8: 
        !             9:         .386
        !            10: 
        !            11: ifndef  DOS_PLATFORM
        !            12:         .model  small,c
        !            13: else
        !            14: ifdef   STD_CALL
        !            15:         .model  small,c
        !            16: else
        !            17:         .model  small,pascal
        !            18: endif;  STD_CALL
        !            19: endif;  DOS_PLATFORM
        !            20: 
        !            21:         assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
        !            22:         assume fs:nothing,gs:nothing
        !            23: 
        !            24:         .xlist
        !            25:         include stdcall.inc             ;calling convention cmacros
        !            26:         include i386\egavga.inc
        !            27:         include i386\strucs.inc
        !            28:         .list
        !            29: 
        !            30:         include i386\strblt.inc
        !            31: 
        !            32:         .code
        !            33: 
        !            34: ;---------------------------Public-Routine------------------------------;
        !            35: ; vGlyphBlt
        !            36: ;
        !            37: ;   Draw a glyph to the VGA screen
        !            38: ;
        !            39: ;-----------------------------------------------------------------------;
        !            40: 
        !            41: _TEXT$01   SEGMENT DWORD USE32 PUBLIC 'CODE'
        !            42:            ASSUME  CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
        !            43: 
        !            44: ProcName    xxxvGlyphBlt,vGlyphBlt,32
        !            45: 
        !            46: xxxvGlyphBlt proc uses    esi edi ebx,  \
        !            47:         pdsurf: ptr DEVSURF,            \
        !            48:         prcl:   ptr RECTL,              \
        !            49:         cStr:   DWORD,                  \
        !            50:         pgp:    ptr GLYPHPOS,           \
        !            51:         iForeClr: dword,                \
        !            52:         iBackClr: dword,                \
        !            53:         ulMode:   dword,                \
        !            54:         flOption: dword
        !            55: 
        !            56:         local   pjScreen    :ptr        ; screen pointer
        !            57:         local   pjGlyph     :ptr        ; pointer to glyph bits
        !            58:         local   cScan       :dword      ; visible glyph height
        !            59:         local   cPels       :dword      ; visible glyph width
        !            60:         local   cjBytes     :dword      ; glyph scan size
        !            61:         local   cTmp        :dword      ; temporary scan count
        !            62:         local   cInnerBytes :dword
        !            63:         local   ulNextScan  :dword      ;offset from one screen scan to next
        !            64:         local   cfBits      :byte
        !            65:         local   cfLeft      :byte
        !            66:         local   fjMask      :byte
        !            67:         local   fjLastMask  :byte
        !            68:         local   cfLastBits  :byte
        !            69: 
        !            70: ; Initialize stuff
        !            71: 
        !            72:         cld
        !            73:         mov     edi,pdsurf
        !            74:         mov     esi,prcl
        !            75: 
        !            76: ; Set the offset from one scan to the next
        !            77: 
        !            78:         mov     eax,[edi].dsurf_lNextScan
        !            79:         mov     ulNextScan,eax
        !            80: 
        !            81: ; Calculate number of scans for bltting cell
        !            82: 
        !            83: gblt_calc_dest_addr:
        !            84:         mov     eax,[esi].yTop
        !            85:         mov     edx,[esi].yBottom
        !            86:         sub     edx,eax
        !            87:         mov     cScan,edx               ; Number of scans
        !            88: 
        !            89: ; Can we assume positive value?
        !            90: 
        !            91:         mov     edx,ulNextScan
        !            92:         mul     edx                     ; EAX = byte offset to scan
        !            93: 
        !            94: ; Calculate cell width in pels
        !            95: 
        !            96:         mov     ebx,[esi].xRight
        !            97:         mov     ecx,[esi].xLeft
        !            98:         sub     ebx,ecx
        !            99:         mov     cPels,ebx               ; Width in pels
        !           100: 
        !           101: ; Calculate pointer to the 1st screen byte to blt
        !           102: 
        !           103:         mov     edx,ecx
        !           104:         shr     edx,3
        !           105:         add     eax,edx
        !           106:         add     eax,[edi].dsurf_pvBitmapStart
        !           107:         mov     pjScreen,eax            ; Base address of blit
        !           108: 
        !           109: ; Calculate the destination left edge mask
        !           110: 
        !           111: gblt_left_mask:
        !           112:         xor     eax,eax
        !           113:         cdq
        !           114:         mov     cInnerBytes,eax         ; Assume glyph fits one byte
        !           115:         mov     fjLastMask,al
        !           116:         and     cl,7
        !           117:         mov     dl,8
        !           118:         sub     dl,cl                   ; DL = bits in mask
        !           119: 
        !           120:         dec     al
        !           121:         shr     al,cl                   ; AL = left mask
        !           122: 
        !           123: ; Assume cell is at least one byte wide
        !           124: 
        !           125:         mov     fjMask,al               ; then we have this left mask
        !           126:         mov     cfBits,dl               ; along with 1 bits count
        !           127:         sub     ebx,edx                 ; EBX = cPels, EDX = bits in left mask
        !           128:         jg      short gblt_inner_count  ; but if the assume is true?
        !           129:         je      short gblt_glyph_info
        !           130: 
        !           131: ; It is less than one byte wide, calculate the right edge mask
        !           132: 
        !           133:         mov     cl,bl
        !           134:         neg     cl
        !           135:         inc     ah                      ; AH = 1
        !           136:         shl     ah,cl
        !           137:         neg     ah                      ; AH = right mask
        !           138:         and     al,ah                   ; AL = composite mask
        !           139:         mov     fjMask,al
        !           140:         jmp     short gblt_glyph_info   ; no middle or last bytes
        !           141: 
        !           142: ; Calculate the inner count
        !           143: 
        !           144: gblt_inner_count:
        !           145:         mov     ecx,ebx                 ; EBX = # bits left in cell
        !           146:         shr     ebx,3
        !           147:         mov     cInnerBytes,ebx         ; inner byte count
        !           148: 
        !           149: ; Calculate the last byte mask
        !           150: 
        !           151: gblt_last_mask:
        !           152:         and     cl,7                    ; CL = # of trailing bits
        !           153:         mov     cfLastBits,cl
        !           154:         dec     ah                      ; AH = 0FFh
        !           155:         shr     ah,cl
        !           156:         not     ah
        !           157:         mov     fjLastMask,ah
        !           158: 
        !           159: ; Now get the glyph information
        !           160: 
        !           161: gblt_glyph_info:
        !           162:         mov     edi,pgp
        !           163:         mov     ebx,[edi].gp_pgdf
        !           164:         mov     ebx,[ebx].gdf_pgb       ; ptr to glyph bits
        !           165: 
        !           166: ; Calculate the glyph scan size
        !           167: 
        !           168: gblt_glyph_scan:
        !           169:         mov     eax,[ebx].gb_cx         ; Glyph width in pels
        !           170:         add     eax,7
        !           171: ;        and     al,0e0h                 ; DWORD aligned
        !           172:         shr     eax,3
        !           173:         mov     cjBytes,eax             ; Count to move to next line of glyph
        !           174: 
        !           175: ; Assume the glyph is not clipped
        !           176: 
        !           177:         lea     edx,[ebx].gb_aj
        !           178:         mov     pjGlyph,edx             ; Start of glyph
        !           179:         mov     dl,8
        !           180:         mov     cfLeft,dl               ; Bits left in glyph byte
        !           181:         test    flOption,VGB_VERT_CLIPPED_GLYPH or VGB_HORIZ_CLIPPED_GLYPH
        !           182:         jz      short gblt_draw_glyph
        !           183: 
        !           184: ; Calculate byte offset of the 1st scan in glyph
        !           185: 
        !           186: gblt_glyph_offset:
        !           187:         mov     edx,[esi].yTop
        !           188:         sub     edx,[edi].gp_y          ; Vertical offset into glyph
        !           189:         mul     edx                     ; Can we assume positive value?
        !           190: 
        !           191: ; Calculate offset to the 1st byte in Glyph
        !           192: 
        !           193:         mov     edx,[esi].xLeft
        !           194:         sub     edx,[edi].gp_x          ; Horizontal offset into glyph
        !           195:         mov     ecx,edx
        !           196:         shr     edx,3
        !           197:         add     eax,edx                 ; Offset into glyph
        !           198:         add     pjGlyph,eax             ; Start of glyph
        !           199: 
        !           200: ; Calculate glyph's left mask
        !           201: 
        !           202: gblt_glyph_left_mask:
        !           203:         and     cl,7
        !           204:         sub     cfLeft,cl               ; Bits left in glyph byte
        !           205: 
        !           206: ; Setup the drawing parameters
        !           207: 
        !           208: gblt_draw_glyph:
        !           209:         mov     eax,ulMode              ; determine the write mode
        !           210:         call    offset FLAT:vgblt_table.[eax*4]
        !           211: 
        !           212: ; Everything is done, go home
        !           213: 
        !           214: glyph_blt_exit:
        !           215: 
        !           216:         cRet    vGlyphBlt
        !           217: 
        !           218: vgblt_table     equ     this dword
        !           219:         dd      offset FLAT:vgblt_mix_glyph
        !           220:         dd      offset FLAT:vgblt_opaque_glyph
        !           221: 
        !           222:         .errnz  VGB_MIX_STRING
        !           223:         .errnz  VGB_OPAQUE_STRING-1
        !           224: 
        !           225: ;---------------------------Public-Routine------------------------------;
        !           226: ; vgblt_mix_glyph
        !           227: ;
        !           228: ;   Draw a glyph to the VGA screen using the write mode 0
        !           229: ;
        !           230: ;-----------------------------------------------------------------------;
        !           231: 
        !           232: vgblt_mix_glyph::
        !           233: 
        !           234:         mov     dx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !           235:         mov     eax,cScan
        !           236:         mov     cTmp,eax                ; Scans to draw
        !           237:         mov     esi,pjGlyph             ; Read glyph from here
        !           238:         mov     edi,pjScreen            ; Write glyph to there
        !           239:         mov     bh,fjMask               ; Current mask
        !           240:         mov     cl,cfLeft               ; Bits available in current byte
        !           241: 
        !           242:         sub     cl,cfBits
        !           243:         jl      short vmg_fetch_two_bytes
        !           244: 
        !           245: ;
        !           246: ; Fetching one byte means we are at the left edge of the glyph, or
        !           247: ; by some miracle we are aligned with the VGA memory.  Either way
        !           248: ; we will still mask the data with fjMask.
        !           249: ;
        !           250: 
        !           251: vmg_fetch_one_byte:
        !           252:         mov     al,GRAF_BIT_MASK        ; leave it in AL
        !           253: 
        !           254: vmg_fetch_one_byte_next:
        !           255:         mov     ah,[esi]                ; AH = glyph data
        !           256: 
        !           257:         shr     ah,cl                   ; Put usable glyph data in place
        !           258: 
        !           259:         and     ah,bh                   ; AH = masked glyph data
        !           260:         jz      short @F                ; Don't waste time
        !           261: 
        !           262:         out     dx,ax
        !           263:         xchg    ah,[edi]                ; Set the bits
        !           264: 
        !           265: @@:
        !           266:         add     edi,ulNextScan          ; Next scan on VGA
        !           267:         add     esi,cjBytes             ; Next line of glyph
        !           268:         dec     cTmp
        !           269:         jnz     short vmg_fetch_one_byte_next ; finish column
        !           270: 
        !           271:         neg     cl
        !           272:         and     cl,7                    ; CL = # usable bits in next byte
        !           273:         jnz     short vmg_advance_screen_ptr
        !           274:         jmp     short vmg_advance_glyph_ptr
        !           275: 
        !           276: ; The current screen byte covers two glyph bytes
        !           277: 
        !           278: vmg_fetch_two_bytes:
        !           279:         mov     bl,GRAF_BIT_MASK        ; Set bitmask for altered bits
        !           280:         neg     cl                      ; CL = # bits required from next byte
        !           281:         add     cl,8                    ; we will have to swap AH and AL
        !           282: 
        !           283: vmg_fetch_two_bytes_next:
        !           284:         mov     ax,[esi]                ; AL = current byte, AH = next byte
        !           285:         rol     ax,cl                   ; AH = glyph data
        !           286: 
        !           287:         and     ah,bh                   ; AH = masked glyph data
        !           288:         jz      short @F                ; Don't waste time
        !           289: 
        !           290:         mov     al,bl
        !           291:         out     dx,ax
        !           292:         xchg    al,[edi]                ; Set the bits
        !           293: 
        !           294: @@:
        !           295:         add     edi,ulNextScan          ; Next scan on VGA
        !           296:         add     esi,cjBytes             ; Next line of glyph
        !           297:         dec     cTmp
        !           298:         jnz     short vmg_fetch_two_bytes_next ; finish column
        !           299:         sub     cl,8                    ; CL = # bits required from next byte
        !           300: 
        !           301: ; We will start the next screen column byte. Recalculate parameters.
        !           302: 
        !           303: vmg_advance_glyph_ptr:
        !           304:         inc     pjGlyph                 ; increment glyph pointer
        !           305: 
        !           306: vmg_advance_screen_ptr:
        !           307:         inc     pjScreen                ; Increment screen pointer
        !           308: 
        !           309: vmg_inner_bytes:
        !           310:         mov     ebx,cInnerBytes         ; do we have inner bytes?
        !           311:         or      ebx,ebx
        !           312:         jz      short vmg_last_byte
        !           313: 
        !           314:         mov     eax,cScan
        !           315:         mov     cTmp,eax                ; Scans to draw
        !           316:         mov     esi,pjGlyph             ; Read glyph from here
        !           317:         mov     edi,pjScreen            ; Write glyph to there
        !           318:         add     pjGlyph,ebx             ; advance pointer
        !           319:         add     pjScreen,ebx
        !           320:         sub     cjBytes,ebx             ; glyph scan incremental
        !           321:         or      cl,cl
        !           322:         jnz     short vmg_inner_fetch_two_bytes
        !           323: 
        !           324:         mov     al,GRAF_BIT_MASK        ; leave it in AL
        !           325: 
        !           326: vmg_inner_fetch_one_byte:
        !           327:         mov     ah,[esi]                ; AH = glyph data
        !           328:         or      ah,ah
        !           329:         jz      short @F                ; Don't waste time
        !           330: 
        !           331:         out     dx,ax
        !           332:         xchg    ah,[edi]                ; Set the bits
        !           333: 
        !           334: @@:
        !           335:         inc     esi
        !           336:         inc     edi
        !           337:         dec     ebx
        !           338:         jnz     short vmg_inner_fetch_one_byte
        !           339: 
        !           340:         mov     ebx,cInnerBytes
        !           341:         add     edi,ulNextScan          ; Next scan on VGA
        !           342:         add     esi,cjBytes             ; Next line of glyph
        !           343:         sub     edi,ebx                 ; adjust for previous increment
        !           344:         dec     cTmp
        !           345:         jnz     short vmg_inner_fetch_one_byte ; finish column
        !           346: 
        !           347:         jmp     short vmg_inner_byte_end
        !           348: 
        !           349: ; The current screen byte covers two glyph bytes
        !           350: 
        !           351: vmg_inner_fetch_two_bytes:
        !           352:         add     cl,8                    ; we will have to swap AH and AL
        !           353: 
        !           354: vmg_inner_fetch_two_bytes_next:
        !           355:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           356:         rol     ax,cl                   ; AH = glyph data
        !           357:         jz      short @F                ; Don't waste time
        !           358: 
        !           359:         mov     al,GRAF_BIT_MASK
        !           360:         out     dx,ax
        !           361:         xchg    al,[edi]                ; Set the bits
        !           362: @@:
        !           363:         inc     esi
        !           364:         inc     edi
        !           365:         dec     ebx
        !           366:         jnz     short vmg_inner_fetch_two_bytes_next
        !           367: 
        !           368:         mov     ebx,cInnerBytes
        !           369:         add     edi,ulNextScan          ; Next scan on VGA
        !           370:         add     esi,cjBytes             ; Next line of glyph
        !           371:         sub     edi,ebx                 ; adjust for previous increment
        !           372:         dec     cTmp
        !           373:         jnz     short vmg_inner_fetch_two_bytes_next ; finish column
        !           374:         sub     cl,8
        !           375: 
        !           376: vmg_inner_byte_end:
        !           377:         add     cjBytes,ebx             ; restore its actual value
        !           378: 
        !           379: vmg_last_byte:
        !           380:         mov     bl,fjLastMask           ; BL = last byte mask
        !           381:         or      bl,bl
        !           382:         jz      short vmg_exit
        !           383: 
        !           384:         mov     esi,pjGlyph             ; Read glyph from here
        !           385:         mov     edi,pjScreen            ; Write glyph to there
        !           386:         mov     ch,8
        !           387:         sub     ch,cl                   ; CH = # usable bits in current byte
        !           388:         cmp     ch,cfLastBits           ; do we need the next byte?
        !           389:         jl      short vmg_last_fetch_two_bytes
        !           390: 
        !           391:         mov     al,GRAF_BIT_MASK
        !           392: 
        !           393: vmg_last_fetch_one_byte:
        !           394:         mov     ah,[esi]                ; AH = glyph data
        !           395:         shl     ah,cl
        !           396:         and     ah,bl
        !           397:         jz      short @F                ; Don't waste time
        !           398: 
        !           399:         out     dx,ax
        !           400:         xchg    ah,[edi]                ; Set the bits
        !           401: 
        !           402: @@:
        !           403:         add     edi,ulNextScan          ; Next scan on VGA
        !           404:         add     esi,cjBytes             ; Next line of glyph
        !           405:         dec     cScan
        !           406:         jnz     short vmg_last_fetch_one_byte ; finish column
        !           407: 
        !           408:         jmp     short vmg_exit
        !           409: 
        !           410: ; The current screen byte covers two glyph bytes
        !           411: 
        !           412: vmg_last_fetch_two_bytes:
        !           413:         add     cl,8                    ; we will swap AH and AL
        !           414:         mov     bh,GRAF_BIT_MASK
        !           415: 
        !           416: vmg_last_fetch_two_bytes_next:
        !           417:         mov     ax,[esi]
        !           418:         rol     ax,cl                   ; AH = glyph data
        !           419:         and     ah,bl
        !           420:         jz      short @F                ; Don't waste time
        !           421: 
        !           422:         mov     al,bh
        !           423:         out     dx,ax
        !           424:         xchg    al,[edi]                ; Set the bits
        !           425: 
        !           426: @@:
        !           427:         add     edi,ulNextScan          ; Next scan on VGA
        !           428:         add     esi,cjBytes             ; Next line of glyph
        !           429:         dec     cScan
        !           430:         jnz     short vmg_last_fetch_two_bytes_next ; finish column
        !           431: 
        !           432: vmg_exit:
        !           433:         retn
        !           434: 
        !           435: ;---------------------------Public-Routine------------------------------;
        !           436: ; vgblt_opaque_glyph
        !           437: ;
        !           438: ;   Draw a glyph to the VGA screen using the write mode 3
        !           439: ;
        !           440: ;-----------------------------------------------------------------------;
        !           441: 
        !           442: vgblt_opaque_glyph:
        !           443: 
        !           444:         mov     eax,cScan
        !           445:         mov     cTmp,eax                ; Scans to draw
        !           446:         mov     esi,pjGlyph             ; Read glyph from here
        !           447:         mov     edi,pjScreen            ; Write glyph to there
        !           448:         mov     bh,fjMask               ; Current mask
        !           449:         mov     edx,ulNextScan
        !           450: 
        !           451:         mov     cl,cfLeft               ; Bits available in current byte
        !           452:         sub     cl,cfBits
        !           453:         jl      short vog_fetch_two_bytes
        !           454: 
        !           455: ;
        !           456: ; Fetching one byte means we are at the left edge of the glyph, or
        !           457: ; by some miracle we are aligned with the VGA memory.  Either way
        !           458: ; we will still mask the data with fjMask.
        !           459: ;
        !           460: 
        !           461: vog_fetch_one_byte:
        !           462:         mov     ah,[esi]                ; AH = glyph data
        !           463:         shr     ah,cl                   ; Put usable glyph data in place
        !           464:         and     ah,bh
        !           465:         jz      short @F                ; don't waste time
        !           466:         xchg    ah,[edi]                ; Set the bits
        !           467: @@:
        !           468:         add     edi,edx                 ; Next scan on VGA
        !           469:         add     esi,cjBytes             ; Next line of glyph
        !           470:         dec     cTmp
        !           471:         jnz     short vog_fetch_one_byte ; finish column
        !           472: 
        !           473:         neg     cl
        !           474:         and     cl,7                    ; CL = # usable bits in next byte
        !           475:         jnz     short vog_advance_screen_ptr
        !           476:         jmp     short vog_advance_glyph_ptr
        !           477: 
        !           478: ; The current screen byte covers two glyph bytes
        !           479: 
        !           480: vog_fetch_two_bytes:
        !           481:         neg     cl                      ; CL = cfBits - cfLeft
        !           482:         add     cl,8                    ; we will swap AH and AL
        !           483: 
        !           484: vog_fetch_two_bytes_next:
        !           485:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           486:         rol     ax,cl                   ; AH = glyph data
        !           487:         and     ah,bh
        !           488:         jz      short @F                ; don't waste time
        !           489:         xchg    ah,[edi]                ; Set the bits
        !           490: @@:
        !           491:         add     edi,edx                 ; Next scan on VGA
        !           492:         add     esi,cjBytes             ; Next line of glyph
        !           493:         dec     cTmp
        !           494:         jnz     short vog_fetch_two_bytes_next ; finish column
        !           495:         sub     cl,8
        !           496: 
        !           497: ; We will start the next screen column byte. Recalculate parameters.
        !           498: 
        !           499: vog_advance_glyph_ptr:
        !           500:         inc     pjGlyph
        !           501: 
        !           502: vog_advance_screen_ptr:
        !           503:         inc     pjScreen                ; Increment screen pointer
        !           504: 
        !           505: vog_inner_bytes:
        !           506:         mov     ebx,cInnerBytes         ; do we have inner bytes?
        !           507:         or      ebx,ebx
        !           508:         jz      short vog_last_byte
        !           509: 
        !           510:         mov     eax,cScan
        !           511:         mov     cTmp,eax                ; Scans to draw
        !           512:         mov     esi,pjGlyph             ; Read glyph from here
        !           513:         mov     edi,pjScreen            ; Write glyph to there
        !           514:         add     pjGlyph,ebx             ; advance pointer
        !           515:         add     pjScreen,ebx
        !           516:         sub     cjBytes,ebx             ; glyph scan size
        !           517:         sub     edx,ebx                 ; screen scan size
        !           518:         or      cl,cl
        !           519:         jnz     short vog_inner_fetch_two_bytes
        !           520: 
        !           521: vog_inner_fetch_one_byte:
        !           522:         mov     ecx,ebx
        !           523: 
        !           524: vog_inner_loop:
        !           525:         lodsb
        !           526:         or      al,al
        !           527:         jz      short @F
        !           528:         xchg    al,[edi]
        !           529: @@:
        !           530:         inc     edi
        !           531:         loop    short vog_inner_loop
        !           532: 
        !           533:         add     edi,edx                 ; Next scan on VGA
        !           534:         add     esi,cjBytes             ; Next line of glyph
        !           535:         dec     cTmp
        !           536:         jnz     short vog_inner_fetch_one_byte ; finish column
        !           537: 
        !           538:         jmp     short vog_inner_byte_end
        !           539: 
        !           540: ; The current screen byte covers two glyph bytes
        !           541: 
        !           542: vog_inner_fetch_two_bytes:
        !           543:         add     cl,8
        !           544: 
        !           545: vog_inner_fetch_two_bytes_next:
        !           546:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           547:         rol     ax,cl                   ; AH = glyph data
        !           548:         or      ah,ah
        !           549:         jz      short @F
        !           550:         xchg    ah,[edi]                ; Set the bits
        !           551: @@:
        !           552:         inc     esi
        !           553:         inc     edi
        !           554:         dec     ebx
        !           555:         jnz     short vog_inner_fetch_two_bytes_next
        !           556: 
        !           557:         mov     ebx,cInnerBytes
        !           558:         add     edi,edx                 ; Next scan on VGA
        !           559:         add     esi,cjBytes             ; Next line of glyph
        !           560:         dec     cTmp
        !           561:         jnz     short vog_inner_fetch_two_bytes_next ; finish column
        !           562:         sub     cl,8
        !           563: 
        !           564: vog_inner_byte_end:
        !           565:         add     edx,ebx                 ; restore its original value
        !           566:         add     cjBytes,ebx             ; restore its original value
        !           567: 
        !           568: vog_last_byte:
        !           569:         mov     bl,fjLastMask           ; BL = last byte mask
        !           570:         or      bl,bl
        !           571:         jz      short vog_exit
        !           572: 
        !           573:         mov     esi,pjGlyph             ; Read glyph from here
        !           574:         mov     edi,pjScreen            ; Write glyph to there
        !           575:         mov     ch,8
        !           576:         sub     ch,cl                   ; CH = # usable bits in current byte
        !           577:         cmp     ch,cfLastBits           ; do we need the next byte?
        !           578:         jl      short vog_last_fetch_two_bytes
        !           579: 
        !           580: 
        !           581: vog_last_fetch_one_byte:
        !           582:         mov     ah,[esi]                ; AH = glyph data
        !           583:         shl     ah,cl
        !           584:         and     ah,bl
        !           585:         jz      short @F
        !           586:         xchg    ah,[edi]                ; Set the bits
        !           587: @@:
        !           588:         add     edi,edx                 ; Next scan on VGA
        !           589:         add     esi,cjBytes             ; Next line of glyph
        !           590:         dec     cScan
        !           591:         jnz     short vog_last_fetch_one_byte ; finish column
        !           592: 
        !           593:         jmp     short vog_exit
        !           594: 
        !           595: ; The current screen byte covers two glyph bytes
        !           596: 
        !           597: vog_last_fetch_two_bytes:
        !           598:         add     cl,8                    ; we will swap AH and AL
        !           599: 
        !           600: vog_last_fetch_two_bytes_next:
        !           601:         mov     ax,[esi]
        !           602:         rol     ax,cl                   ; AH = glyph data
        !           603:         and     ah,bl
        !           604:         jz      short @F
        !           605:         xchg    ah,[edi]                ; Set the bits
        !           606: @@:
        !           607:         add     edi,edx                 ; Next scan on VGA
        !           608:         add     esi,cjBytes             ; Next line of glyph
        !           609:         dec     cScan
        !           610:         jnz     short vog_last_fetch_two_bytes_next ; finish column
        !           611: 
        !           612: vog_exit:
        !           613:         retn
        !           614: 
        !           615: xxxvGlyphBlt endp
        !           616: 
        !           617: 
        !           618: ;---------------------------Public-Routine------------------------------;
        !           619: ; ulSetXParentRegs
        !           620: ;
        !           621: ;   Set the VGA control registers for the specified Rop4 and foreground
        !           622: ;   color when background is transparent.
        !           623: ;
        !           624: ;-----------------------------------------------------------------------;
        !           625: 
        !           626: cProc   ulSetXParentRegs,12,<           \
        !           627:         uses    ebx edi,                \
        !           628:         rop4:   dword,                  \
        !           629:         pclr:   ptr,                    \
        !           630:         bSet:   dword                   >
        !           631: 
        !           632:         mov     edi,VGB_OPAQUE_STRING
        !           633:         mov     ebx,rop4
        !           634:         xor     ecx,ecx                 ; Color = 00, mode = set
        !           635:         or      ebx,ebx
        !           636:         jz      short vsv_set_vga_mode
        !           637: 
        !           638:         dec     ch                      ; Color = FF, mode = set
        !           639:         inc     bx
        !           640:         jz      short vsv_set_vga_mode
        !           641: 
        !           642:         mov     eax,pclr
        !           643:         mov     ch,byte ptr [eax]       ; Color = passed color, mode = set
        !           644:         cmp     bx,0f0f0h + 1
        !           645:         je      short vsv_set_vga_mode
        !           646: 
        !           647:         not     ch                      ; ~passed color
        !           648:         cmp     bx,00f0fh + 1
        !           649:         je      short vsv_set_vga_mode
        !           650: 
        !           651:         mov     cx,0FF00h + DR_XOR      ; Color = FF, mode = xor
        !           652:         mov     edi,VGB_MIX_STRING      ; We will actually do mode 0
        !           653: 
        !           654: vsv_set_vga_mode:
        !           655:         mov     eax,bSet                ; set flag
        !           656:         or      eax,eax
        !           657:         jz      short vsv_exit
        !           658: 
        !           659:         mov     dx,VGA_BASE + GRAF_ADDR
        !           660:         mov     al,GRAF_SET_RESET
        !           661:         mov     ah,ch
        !           662:         out     dx,ax
        !           663:         mov     ax,0f00h + GRAF_ENAB_SR
        !           664:         out     dx,ax
        !           665:         mov     ah,cl
        !           666:         mov     al,GRAF_DATA_ROT
        !           667:         out     dx,ax
        !           668: 
        !           669:         or      edi,edi
        !           670:         .errnz  VGB_MIX_STRING
        !           671:         jz      short vsv_exit
        !           672:         mov     ax,(M_AND_WRITE shl 8)+GRAF_MODE
        !           673:         out     dx,ax
        !           674: 
        !           675: vsv_exit:
        !           676:         mov     eax,edi                 ; return VGA mode
        !           677:         mov     edi,pclr
        !           678:         mov     byte ptr [edi],ch       ; CH = actual foreground color
        !           679:         cRet    ulSetXParentRegs
        !           680: 
        !           681: endProc ulSetXParentRegs
        !           682: 
        !           683: ;---------------------------Public-Routine------------------------------;
        !           684: ; vResetVGARegs
        !           685: ;
        !           686: ;   Reset the VGA control registers to a default state.
        !           687: ;
        !           688: ;-----------------------------------------------------------------------;
        !           689: 
        !           690: cProc   vResetVGARegs
        !           691: 
        !           692:         mov     dx,VGA_BASE + GRAF_ADDR
        !           693:         mov     ax,0ff00h + GRAF_BIT_MASK
        !           694:         out     dx,ax
        !           695:         mov     ax,0000h + GRAF_SET_RESET
        !           696:         out     dx,ax
        !           697:         mov     ax,0000h + GRAF_ENAB_SR
        !           698:         out     dx,ax
        !           699:         mov     ax,(DR_SET shl 8) + GRAF_DATA_ROT
        !           700:         out     dx,ax
        !           701:         mov     ax,((M_PROC_WRITE or M_DATA_READ) shl 8) + GRAF_MODE
        !           702:         out     dx,ax
        !           703: 
        !           704:         cRet    vResetVGARegs
        !           705: 
        !           706: endProc vResetVGARegs
        !           707: 
        !           708: public gblt_calc_dest_addr
        !           709: public gblt_left_mask
        !           710: public gblt_inner_count
        !           711: public gblt_last_mask
        !           712: public gblt_glyph_info
        !           713: public gblt_glyph_offset
        !           714: public gblt_draw_glyph
        !           715: public glyph_blt_exit
        !           716: public vgblt_mix_glyph
        !           717: public vmg_fetch_one_byte
        !           718: public vmg_fetch_two_bytes
        !           719: public vmg_advance_glyph_ptr
        !           720: public vmg_advance_screen_ptr
        !           721: public vmg_inner_bytes
        !           722: public vmg_inner_fetch_one_byte
        !           723: public vmg_inner_fetch_two_bytes
        !           724: public vmg_last_byte
        !           725: public vmg_last_fetch_one_byte
        !           726: public vmg_last_fetch_two_bytes
        !           727: public vmg_exit
        !           728: public vgblt_opaque_glyph
        !           729: public vog_fetch_one_byte
        !           730: public vog_fetch_two_bytes
        !           731: public vog_advance_glyph_ptr
        !           732: public vog_advance_screen_ptr
        !           733: public vog_inner_bytes
        !           734: public vog_inner_fetch_one_byte
        !           735: public vog_inner_fetch_two_bytes
        !           736: public vog_last_byte
        !           737: public vog_last_fetch_one_byte
        !           738: public vog_last_fetch_two_bytes
        !           739: public vog_exit
        !           740: 
        !           741: _TEXT$01   ends
        !           742: 
        !           743:         end
        !           744: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.