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

1.1     ! root        1: ;---------------------------Module-Header------------------------------;
        !             2: ; Module Name: strblt.asm
        !             3: ;
        !             4: ; Output a string of glyphs onto VGA screen
        !             5: ;
        !             6: ; Created: Fri 19-Jul-1991 13:06:49
        !             7: ; Author: Viroon Touranachun [viroont]
        !             8: ;
        !             9: ; Copyright (c) 1991 Microsoft Corporation
        !            10: ;-----------------------------------------------------------------------;
        !            11:         page    ,132
        !            12:         title   String Display
        !            13: 
        !            14:         .386
        !            15: 
        !            16: ifndef  DOS_PLATFORM
        !            17:         .model  small,c
        !            18: else
        !            19: ifdef   STD_CALL
        !            20:         .model  small,c
        !            21: else
        !            22:         .model  small,pascal
        !            23: endif;  STD_CALL
        !            24: endif;  DOS_PLATFORM
        !            25: 
        !            26:         assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
        !            27:         assume fs:nothing,gs:nothing
        !            28: 
        !            29:         .xlist
        !            30:         include stdcall.inc             ;calling convention cmacros
        !            31:         include i386\egavga.inc
        !            32:         include i386\strucs.inc
        !            33:         .list
        !            34: 
        !            35:         include i386\strblt.inc
        !            36: 
        !            37: ; characteristic flags for glyphs and strings
        !            38: 
        !            39: VSB_MIX_STRING      equ     00000001h       ; the glyph is mixed
        !            40: VSB_OPAQUE_BKGND    equ     00000002h       ; the glyph bakground is opaque
        !            41: VSB_LMB_ZERO        equ     00000004h       ; the left-most bit in left mask is zero
        !            42: VSB_SAVE_BITS       equ     00000008h       ; save the glyph bits in buffer
        !            43: VSB_FIRST_GLYPH     equ     00000010h       ; the first glyph
        !            44: 
        !            45:         .code
        !            46: 
        !            47:         EXTRNP      vGlyphBlt,32
        !            48: 
        !            49: ;---------------------------Public-Routine------------------------------;
        !            50: ; vStringBlt
        !            51: ;
        !            52: ;   Draw an entire string to the VGA screen
        !            53: ;
        !            54: ; History:
        !            55: ;   Mon 08-Jul-1991 15:13:54 -by- Viroon Touranachun [viroont]
        !            56: ;   Created.
        !            57: ;-----------------------------------------------------------------------;
        !            58: 
        !            59: ProcName    xxxvStringBlt,vStringBlt,32
        !            60: 
        !            61:         ALIGN 4
        !            62: xxxvStringBlt   proc uses    esi edi ebx,   \
        !            63:         pdsurf: ptr DEVSURF,            \
        !            64:         prcl:   ptr RECTL,              \
        !            65:         cStr:   DWORD,                  \
        !            66:         pgp:    ptr GLYPHPOS,           \
        !            67:         iForeClr: dword,                \
        !            68:         iBackClr: dword,                \
        !            69:         ulMode:   dword,                \
        !            70:         flOption: dword
        !            71: 
        !            72:         local   pjScreen    :ptr        ; screen pointer
        !            73:         local   pjGlyph     :ptr        ; pointer to glyph bits
        !            74:         local   pjImage     :ptr        ; pointer to image buffer
        !            75:         local   flAccel     :dword      ; accelarator flags
        !            76:         local   pfnFirstByte:dword      ; pointer to the first glyph byte function
        !            77:         local   pfnLastGlyph:dword      ; pointer to the last glyph byte function
        !            78:         local   pfnMidGlyph :dword      ; pointer to the middle glyph byte entry
        !            79:         local   cGlyph      :dword      ; # of glyphs invloved
        !            80:         local   pjFirstGlyph:dword      ; ptr to the first glyph
        !            81:         local   cScan       :dword      ; visible glyph height
        !            82:         local   cScanBlock  :dword      ; visible glyph scan block
        !            83:         local   cLeadScan   :dword      ; visible glyph leading scan
        !            84:         local   cOffsetScan :dword      ; offset to the 1st scan
        !            85:         local   cBufferOffset:dword     ; offset into buffer for leading scans
        !            86:         local   xStartCell  :dword      ; start of the current glyph cell
        !            87:         local   xNextCell   :dword      ; start of the next glyph cell
        !            88:         local   cjBytes     :dword      ; glyph scan size in bytes
        !            89:         local   cScanCount  :dword      ; temporary scan count
        !            90:         local   cScreenInc  :dword      ; temporary screen increment
        !            91:         local   cInnerBytes :dword      ; glyph's middle full byte count
        !            92:         local   cFixGlyphWidth:dword    ; glyph's middle fixed byte count
        !            93:         local   cFixScanOffset:dword    ; byte offset into the 1st visible scan
        !            94:         local   ulNextScan  :dword      ; distance from start of one dest scan
        !            95:                                         ; to start of next
        !            96:         local   fjLastMask  :byte       ; glyph's last byte screen mask
        !            97:         local   cfLastBits  :byte       ; glyph's last byte screen mask bitcount
        !            98:         local   fjOBOSMask  :byte       ; accumulated screen byte mask
        !            99:         local   bAlign      :byte       ; dword aligned
        !           100: ; BUGBUG this should should come from the work buffer pointed to by the DSURF,
        !           101: ; or, if it's on the stack, should be allocated to the minimum needed size
        !           102:         local   abStrImage[CY_SCREEN_MAX]:byte
        !           103: 
        !           104: 
        !           105: ;----------------------------------------------------------------------------
        !           106: ; Initialize stuff
        !           107: ;----------------------------------------------------------------------------
        !           108: 
        !           109:         cld
        !           110: 
        !           111: ; Calculate the screen location
        !           112: 
        !           113: 
        !           114:         mov     edi,pdsurf
        !           115:         mov     esi,prcl
        !           116:         mov     eax,[esi].yTop
        !           117:         mov     ecx,[edi].dsurf_lNextScan
        !           118:         mov     ulNextScan,ecx
        !           119:         mul     ecx                     ; EAX = byte offset to scan
        !           120: 
        !           121: ; Initialize some parameters to zero (EDX = 0 from multiplication above)
        !           122: 
        !           123:         mov     xStartCell,edx          ; byte offset into 1st glyph
        !           124:         mov     cOffsetScan,edx         ; offset to the 1st glyph scan
        !           125:         mov     cInnerBytes,edx         ; assume no middle byte
        !           126:         mov     fjLastMask,dl           ; assume no last byte
        !           127:         mov     fjOBOSMask,dl           ; Init mask = DL = 0
        !           128:         lea     ecx,abStrImage
        !           129:         mov     pjImage,ecx
        !           130: 
        !           131: ; Calculate pointer to the 1st screen byte to blt
        !           132: 
        !           133:         mov     ecx,[esi].xLeft
        !           134:         shr     ecx,3
        !           135:         add     eax,ecx
        !           136:         add     eax,[edi].dsurf_pvBitmapStart
        !           137:         mov     pjScreen,eax            ; Base address of blit
        !           138: 
        !           139: ;----------------------------------------------------------------------------
        !           140: ; Get the glyph information
        !           141: ; Look for the 1st glyph and count the number of glyphs displayed
        !           142: ;----------------------------------------------------------------------------
        !           143: 
        !           144: sblt_glyph_search:
        !           145:         mov     edi,pgp                 ; the first glyph to display
        !           146:         mov     edx,cStr                ; # of glyphs in string
        !           147: 
        !           148:         .errnz  VGB_HORIZ_CLIPPED_GLYPH-1 ; flag must match those in flClipRect
        !           149: 
        !           150:         test    byte ptr flOption,VGB_HORIZ_CLIPPED_GLYPH
        !           151:         jz      short sblt_found_both   ; if non-clipped, display entire string
        !           152: 
        !           153: sblt_glyph_search_last:
        !           154:         mov     ecx,edx                 ; # of glyphs in string
        !           155:         dec     edx                     ; index to the last glyph in string
        !           156:         imul    edx,size GLYPHPOS
        !           157:         add     edi,edx                 ; EDI => last glyph in the string
        !           158:         mov     eax,[esi].xRight
        !           159: 
        !           160:         ALIGN 4
        !           161: sblt_glyph_search_last_loop:
        !           162:         mov     ebx,[edi].gp_pgdf
        !           163:         mov     ebx,[ebx].gdf_pgb       ; ptr to glyph bits
        !           164:         mov     ebx,[ebx].gb_x          ; glyph cell offset
        !           165:         add     ebx,[edi].gp_x          ; actual glyph position
        !           166:         cmp     ebx,eax
        !           167:         jl      short sblt_glyph_search_1st ; we found the last glyph
        !           168:         sub     edi,size GLYPHPOS       ; back one glyph
        !           169:         loop    sblt_glyph_search_last_loop
        !           170:         jmp     sblt_exit               ; nothing to show
        !           171: 
        !           172:         ALIGN 4
        !           173: sblt_glyph_search_1st:
        !           174:         mov     edx,ecx                 ; mark the last visible glyph
        !           175:         mov     eax,[esi].xLeft
        !           176:         jmp     short @F                ; we have not advance to next glyph
        !           177: 
        !           178:         ALIGN 4
        !           179: sblt_glyph_search_1st_loop:
        !           180:         mov     ebx,[edi].gp_pgdf
        !           181:         mov     ebx,[ebx].gdf_pgb       ; ptr to glyph bits
        !           182:         mov     ebx,[ebx].gb_x          ; glyph cell offset
        !           183:         add     ebx,[edi].gp_x          ; actual glyph position
        !           184: @@:
        !           185:         cmp     ebx,eax
        !           186:         jle     short sblt_count_glyph  ; we found the first glyph
        !           187:         sub     edi,size GLYPHPOS       ; back one glyph
        !           188:         loop    sblt_glyph_search_1st_loop
        !           189:         jmp     sblt_exit               ; something wrong! bail out!
        !           190: 
        !           191:         ALIGN 4
        !           192: sblt_count_glyph:
        !           193:         dec     ecx                     ; also include the current glyph
        !           194:         sub     edx,ecx                 ; glyph count = last - first
        !           195: 
        !           196: sblt_found_both:
        !           197:         mov     pjFirstGlyph,edi        ; pointer to the first glyph
        !           198:         mov     cGlyph,edx              ; # of glyphs to display
        !           199: 
        !           200: ;----------------------------------------------------------------------------
        !           201: ; Calculate number of scans to bltting cell
        !           202: ;----------------------------------------------------------------------------
        !           203: 
        !           204: sblt_calc_glyph_height:
        !           205:         mov     eax,[esi].yBottom       ; bottom of display rectangle
        !           206:         mov     ecx,[esi].yTop          ; top of display rectangle
        !           207:         sub     eax,ecx                 ; Number of scans = bottom - top
        !           208:         mov     cScan,eax
        !           209: 
        !           210:         .errnz  VGB_VERT_CLIPPED_GLYPH-2 ; flags must match those in flClipRect
        !           211: 
        !           212:         test    byte ptr flOption,VGB_VERT_CLIPPED_GLYPH ; if non-clipped,
        !           213:         jz      short @F                ; we display from the first glyph scan
        !           214:         mov     ebx,[edi].gp_pgdf
        !           215:         mov     ebx,[ebx].gdf_pgb       ; ptr to glyph bits
        !           216:         mov     ebx,[ebx].gb_y          ; glyph cell offset
        !           217:         add     ebx,[edi].gp_y          ; actual glyph position
        !           218:         sub     ecx,ebx                 ; Vertical offset into glyph
        !           219:         mov     cOffsetScan,ecx         ; offset to the 1st glyph scan
        !           220: @@:
        !           221:         mov     ecx,eax                 ; EAX = # of scans
        !           222:         add     ecx,7
        !           223:         shr     ecx,3                   ; we will transfer 8 scans at a time
        !           224:          and     eax,07h                 ; so we may have these leading scans
        !           225:         mov     cLeadScan,eax
        !           226:         mov     cScanBlock,ecx
        !           227: 
        !           228:         xor     ebx,ebx                 ; because of leading scans, we
        !           229:         mov     bl,offset FLAT:xgi_buffer_offset[eax]
        !           230:         mov     cBufferOffset,ebx       ; cache the byte offset to image buffer
        !           231: 
        !           232: ;----------------------------------------------------------------------------
        !           233: ; Setup accelerator flags
        !           234: ;----------------------------------------------------------------------------
        !           235: 
        !           236: sblt_accel_flag:
        !           237:         .errnz  VGB_MIX_STRING
        !           238:         .errnz  VGB_OPAQUE_STRING-1
        !           239:         .errnz  VGB_OPAQUE_BKGRND and 0FFFFFF00h
        !           240:         .errnz  VSB_OPAQUE_BKGND-2
        !           241:         .errnz  VSB_MIX_STRING-1
        !           242: 
        !           243:         xor     eax,eax                 ; no need for this 'cause EAX and 07 above
        !           244:         mov     ebx,flOption            ; get the option flag
        !           245:         test    bl,VGB_OPAQUE_BKGRND    ; get OPAQUE_BKGND flag
        !           246:         setnz   al                      ; AL = EAX = 1 if opaque background
        !           247:         shr     ulMode,1                ; get VGB_OPAQUE_STRING flag
        !           248:         cmc                             ; convert to VSB_MIX_STRING flag
        !           249:         adc     eax,eax                 ; combine two flags in EAX
        !           250:         or      al,VSB_FIRST_GLYPH      ; indicate the first glyph
        !           251:         mov     flAccel,eax
        !           252: 
        !           253: ; Since we always have opaque solid color background, if it is a mixed glyph
        !           254: ; we can mix the foreground solid color now and treat it as an opaque glyph
        !           255: 
        !           256:         cmp     al,VSB_FIRST_GLYPH or VSB_OPAQUE_BKGND or VSB_MIX_STRING
        !           257:         jne     short sblt_special_case
        !           258:         mov     al,byte ptr iBackClr
        !           259:         xor     byte ptr iForeClr,al    ; !! We only have XOR !!??
        !           260:         and     byte ptr flAccel,not VSB_MIX_STRING
        !           261: 
        !           262: ;----------------------------------------------------------------------------
        !           263: ; We can treat the following as special cases:
        !           264: ;   1) Non-clipped String with exact-byte glyphs with phase aligned with screen
        !           265: ;   1) Clipped String with exact-byte glyphs with phase aligned with screen
        !           266: ;----------------------------------------------------------------------------
        !           267: 
        !           268: sblt_special_case:
        !           269:         and     bl,VGB_BYTE_ALIGNED or VGB_MULTIPLE_BYTE or VGB_HORIZ_CLIPPED_GLYPH
        !           270:         cmp     bl,VGB_BYTE_ALIGNED or VGB_MULTIPLE_BYTE
        !           271:         jne     short @F
        !           272:         push    offset FLAT:sblt_exit       ; we have a non-clipped string
        !           273:         jmp     fixed_pitch_aligned_sblt    ; we handle entire string at once
        !           274: 
        !           275: @@:
        !           276:         mov     pfnMidGlyph,offset FLAT:sblt_next_glyph_cell
        !           277:         cmp     bl,VGB_BYTE_ALIGNED or VGB_MULTIPLE_BYTE or VGB_HORIZ_CLIPPED_GLYPH
        !           278:         jne     short sblt_init_jmp_table
        !           279:         mov     pfnMidGlyph,offset FLAT:sblt_middle_fpa_glyph
        !           280: 
        !           281: ;----------------------------------------------------------------------------
        !           282: ; Not a special case. Initialize some function pointers
        !           283: ;----------------------------------------------------------------------------
        !           284: 
        !           285: sblt_init_jmp_table:
        !           286:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte_1st_scrn
        !           287:         mov     pfnLastGlyph,offset FLAT:xgi_last_byte_table
        !           288:         dec     edx                     ; if only glyph, specially handle it
        !           289:         jnz     short sblt_1st_glyph_cell
        !           290: 
        !           291: comment~
        !           292: ;----------------------------------------------------------------------------
        !           293: ; We should go right to vGlyphBlt() if there is only one glyph
        !           294: ;----------------------------------------------------------------------------
        !           295: 
        !           296: sblt_call_vglyphblt:
        !           297: 
        !           298:         test    byte ptr flOption,VGB_OPAQUE_BKGRND
        !           299:         jnz     short @F
        !           300:         mov     ebx,[edi].gp_pgdf
        !           301:         mov     ebx,[ebx].gdf_pgb       ; ptr to glyph bits
        !           302:         mov     ebx,[ebx].gb_y          ; glyph cell offset
        !           303:         add     [edi].gp_y,ebx          ; actual glyph position
        !           304: 
        !           305:         cCall   vGlyphBlt,<pdsurf,prcl,cStr,edi,iForeClr,iBackClr,ulMode,flOption>
        !           306: 
        !           307:         jmp     sblt_exit
        !           308: comment~
        !           309: 
        !           310: @@:
        !           311:         mov     pfnLastGlyph,offset FLAT:xgi_last_byte_last_glyph
        !           312: 
        !           313: ; This is bad! If we have only one glyph and it will fall within only one
        !           314: ; screen byte, we will have to treat the visible byte as the last byte of the
        !           315: ; last glyph.
        !           316: 
        !           317:         mov     eax,[esi].xLeft         ; left edge
        !           318:         shr     eax,3                   ; the screen byte of the left edge
        !           319:         mov     ecx,[esi].xRight        ; right edge
        !           320:         shr     ecx,3                   ; the screen byte of the right edge
        !           321:         cmp     eax,ecx                 ; equal if in the same byte
        !           322:         jne     short sblt_1st_glyph_cell
        !           323:         mov     pfnFirstByte,offset FLAT:xgi_last_byte_last_glyph
        !           324:         and     byte ptr flAccel,not VSB_FIRST_GLYPH
        !           325: 
        !           326: ;----------------------------------------------------------------------------
        !           327: ; Let's display glyphs one byte at a time.
        !           328: ;----------------------------------------------------------------------------
        !           329: 
        !           330: ; Starting from the first glyph. Find the glyph dimension.
        !           331: 
        !           332:         ALIGN 4
        !           333: sblt_1st_glyph_cell:
        !           334:         mov     ecx,[esi].xLeft         ; certainly within 1st glyph
        !           335:         mov     xNextCell,ecx           ; position of the first glyph cell
        !           336: 
        !           337:         test    byte ptr flOption,VGB_HORIZ_CLIPPED_GLYPH ; if non-clipped,
        !           338:         jz      sblt_full_glyph_cell          ; it is a full glyph cell
        !           339: 
        !           340:         mov     ebx,[esi].xRight        ; assume we have only one glyph
        !           341:         mov     esi,[edi].gp_pgdf
        !           342:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           343:         mov     eax,[edi].gp_x
        !           344:         add     eax,[esi].gb_x          ; glyph cell offset
        !           345:         or      edx,edx                 ; EDX = cGlyph-1 => 0 if one glyph
        !           346:         jz      short @F                ; yes, we have the right edge
        !           347:         mov     ebx,[esi].gb_cx         ; full glyph cell width
        !           348:         add     ebx,eax
        !           349:         mov     xNextCell,ebx           ; position of the next glyph
        !           350: @@:
        !           351:         sub     ebx,ecx                 ; EBX = RightEdge-LeftEdge = width in pels
        !           352: 
        !           353:         mov     edx,ecx                 ; ECX = string left edge
        !           354:         sub     edx,eax                 ; EAX = 1st glyph left edge
        !           355:         mov     eax,edx                 ; EDX = pel offset into 1st glyph
        !           356:         shr     edx,3
        !           357:         mov     xStartCell,edx          ; byte offset into 1st glyph
        !           358: 
        !           359:         and     al,7                    ; AL = bit offset within 1st glyph byte
        !           360:         sub     al,8
        !           361:         neg     al
        !           362:         mov     dl,al                   ; DL = # of bits left in 1st glyph byte
        !           363:         jmp     short sblt_left_mask
        !           364: 
        !           365: ;----------------------------------------------------------------------------
        !           366: ; Update information for the last glyph
        !           367: ;----------------------------------------------------------------------------
        !           368: 
        !           369:         ALIGN 4
        !           370: sblt_last_glyph_cell:
        !           371:         mov     ecx,xNextCell           ; start of the last glyph
        !           372:         mov     edi,pjFirstGlyph
        !           373:         add     edi,size GLYPHPOS       ; move to the next glyph
        !           374:         mov     esi,[edi].gp_pgdf
        !           375:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           376: 
        !           377: sblt_last_fpa_glyph_cell:
        !           378:         mov     dl,8                    ; guarantee full byte from glyph
        !           379:         mov     ebx,prcl                ; clipped rectangle
        !           380:         mov     ebx,[ebx].xRight        ; right-trimmed glyph width
        !           381:         sub     ebx,ecx
        !           382:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte_last_glyph
        !           383:         mov     pfnLastGlyph,offset FLAT:xgi_last_byte_last_glyph
        !           384:         jmp     short sblt_left_mask
        !           385: 
        !           386: ;----------------------------------------------------------------------------
        !           387: ; Update information for the middle pfa glyphs
        !           388: ;----------------------------------------------------------------------------
        !           389: 
        !           390:         ALIGN 4
        !           391: sblt_middle_fpa_glyph:
        !           392:         mov     edi,pjFirstGlyph
        !           393:         add     edi,size GLYPHPOS       ; advance to the next glyph
        !           394:         dec     cGlyph                  ; we will not do the last glyph
        !           395:         push    cInnerBytes             ; save it because it may change
        !           396:         call    fixed_pitch_aligned_sblt_inner
        !           397:         pop     cInnerBytes             ; restore it
        !           398:         inc     cGlyph                  ; cGlyph = 1 for the last glyph
        !           399:         add     edi,size GLYPHPOS       ; move to the next glyph
        !           400:         mov     esi,[edi].gp_pgdf
        !           401:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           402:         mov     ecx,[edi].gp_x
        !           403:         add     ecx,[esi].gb_x          ; start of the last glyph
        !           404:         jmp     short sblt_last_fpa_glyph_cell
        !           405: 
        !           406: ;----------------------------------------------------------------------------
        !           407: ; Update information for the next glyph
        !           408: ;----------------------------------------------------------------------------
        !           409: 
        !           410:         ALIGN 4
        !           411: sblt_next_glyph_cell:
        !           412:         mov     ecx,xNextCell           ; position of the next glyph cell
        !           413:         mov     edi,pjFirstGlyph
        !           414:         add     edi,size GLYPHPOS       ; advance to the next glyph
        !           415:         mov     pjFirstGlyph,edi
        !           416: 
        !           417: sblt_full_glyph_cell:
        !           418:         mov     esi,[edi].gp_pgdf
        !           419:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           420:         mov     dl,8                    ; guarantee full byte from glyph
        !           421: 
        !           422: ; For full glyph, we will always start from the left edge.
        !           423: 
        !           424:         mov     ebx,[esi].gb_cx         ; full glyph cell width
        !           425:         add     xNextCell,ebx           ; advance to the following glyph cell
        !           426: 
        !           427: ;----------------------------------------------------------------------------
        !           428: ; Calculate screen bit masks
        !           429: ;----------------------------------------------------------------------------
        !           430: 
        !           431: ; Calculate the screen left edge mask
        !           432: 
        !           433:         ALIGN 4
        !           434: sblt_left_mask:
        !           435:         and     ecx,7                   ; CH = 0, CL = bits offset into 1st byte
        !           436:         setnz   al                      ; AL = 1 if left most bit is zero
        !           437:         neg     al                      ; AL = FF if left most bit is zero
        !           438:         and     eax,VSB_LMB_ZERO        ; AL = VSB_LMB_ZERO if left most bit is zero
        !           439:         or      byte ptr flAccel,al
        !           440: 
        !           441:         .errnz  VSB_LMB_ZERO and 0FFFFFF00h
        !           442: 
        !           443:         mov     al,8
        !           444:         sub     al,cl                   ; AL = bits in mask
        !           445: 
        !           446:         dec     ch                      ; CH = FF
        !           447:         shr     ch,cl                   ; CH = left mask
        !           448: 
        !           449: 
        !           450: ; Assume cell is at least one byte wide
        !           451: 
        !           452:         sub     ebx,eax                 ; EBX = glyph width, EAX = bits in left mask
        !           453:         jg      short sblt_inner_count  ; But is it true?
        !           454:         je      short sblt_left_bitcount; we know there is only one byte
        !           455: 
        !           456: ; It is less than one byte wide, calculate the right edge mask
        !           457: 
        !           458: sblt_one_byte_mask:
        !           459:         mov     cl,bl
        !           460:         neg     cl                      ; CL = bits in mask - glyph width
        !           461:         inc     ah                      ; AH = 1
        !           462:         shl     ah,cl
        !           463:         neg     ah                      ; AH = right mask
        !           464:         and     ch,ah                   ; composite mask = leftmask & rightmask
        !           465:         cmp     cGlyph,1                ; is it the last glyph?
        !           466:         je      short sblt_left_bitcount; yes, display it
        !           467:         or      byte ptr flAccel,VSB_SAVE_BITS ; no, save glyph bits in buffer
        !           468:         jmp     short sblt_left_bitcount; we know there is only one glyph byte
        !           469: 
        !           470: ; Calculate the inner count
        !           471: 
        !           472:         ALIGN 4
        !           473: sblt_inner_count:
        !           474:         mov     cl,bl                   ; EBX = # bits left in cell
        !           475:         shr     ebx,3                   ; EBX = inner bytecount
        !           476:         mov     cInnerBytes,ebx
        !           477: 
        !           478: ; Calculate the last byte mask
        !           479: 
        !           480: sblt_last_mask:
        !           481:         and     cl,7                    ; CL = # of trailing bits
        !           482:         mov     cfLastBits,cl
        !           483:         dec     ah                      ; AH = 0FFh
        !           484:         shr     ah,cl
        !           485:         not     ah                      ; AH = trailing byte mask
        !           486:         mov     fjLastMask,ah
        !           487: 
        !           488:         ALIGN 4
        !           489: sblt_left_bitcount:
        !           490:         mov     cl,al                   ; CL = left mask bitcount
        !           491: 
        !           492: ;----------------------------------------------------------------------------
        !           493: ; Now get information of the current glyph
        !           494: ;----------------------------------------------------------------------------
        !           495: 
        !           496: ; Calculate the glyph scan size
        !           497: 
        !           498: sblt_glyph_info:
        !           499:         mov     eax,[esi].gb_cx         ; Glyph width in pels
        !           500:         add     eax,7
        !           501:         shr     eax,3
        !           502:         mov     cjBytes,eax             ; bytecount for glyph scan increment
        !           503: 
        !           504: ; Assume the glyph is not clipped
        !           505: 
        !           506:         lea     esi,[esi].gb_aj
        !           507:         mov     pjGlyph,esi             ; Start of glyph
        !           508:         test    byte ptr flOption,VGB_VERT_CLIPPED_GLYPH or VGB_HORIZ_CLIPPED_GLYPH
        !           509:         jz      short sblt_xfer_glyph_image
        !           510: 
        !           511: ; Calculate byte offset of the 1st scan in glyph
        !           512: 
        !           513: sblt_glyph_offset:
        !           514:         mov     ebx,cOffsetScan         ; EBX = 1st visible glyph scan
        !           515:         imul    eax,ebx
        !           516:         xor     ebx,ebx
        !           517:         xchg    ebx,xStartCell          ; other glyph always start from 1st bit
        !           518:         add     eax,ebx                 ; offset to the 1st visible glyph byte
        !           519:         add     esi,eax                 ; ESI = ptr to 1st visible glyph byte
        !           520:         mov     pjGlyph,esi
        !           521: 
        !           522: ;----------------------------------------------------------------------------
        !           523: ; Transfer the current glyph bits to screen or buffer
        !           524: ;       CH = 1st byte screen mask
        !           525: ;       CL = 1st byte screen mask bitcount
        !           526: ;       DL = 1st glyph byte bitcount
        !           527: ;----------------------------------------------------------------------------
        !           528: 
        !           529: sblt_xfer_glyph_image:
        !           530:         mov     eax,flAccel             ; Accelarator flag
        !           531:         and     flAccel,VSB_OPAQUE_BKGND or VSB_MIX_STRING; Prepare for next glyph
        !           532: 
        !           533:         sub     cl,dl                   ; if screen mask bitcount > bitcount
        !           534:         setg    dl                      ; in 1st glyph byte, we need two bytes
        !           535:         shr     dl,1                    ; CY =1 if two byte fetch
        !           536:         adc     eax,eax
        !           537:         and     cl,7                    ; CL = phase shift
        !           538:         mov     ebx,pfnFirstByte        ; use the appropriate jump table
        !           539:         call    [ebx][eax*4]            ; transfer 1st image byte
        !           540: 
        !           541: xgi_inner_bytes:
        !           542:         mov     edx,cInnerBytes
        !           543:         or      edx,edx                 ; do we have inner bytes?
        !           544:         jz      short xgi_last_byte     ; no. go to last byte
        !           545:         mov     esi,pjGlyph             ; Read glyph from here
        !           546:         mov     eax,flAccel             ; Accelerator flags
        !           547:         xor     ch,ch
        !           548:         sub     ch,cl                   ; CY = 1 if we need another byte
        !           549:         adc     eax,eax                 ; EAX = offset to jump table
        !           550:         dec     edx                     ; is there only one middle byte?
        !           551:         jnz     short xgi_multi_inner_bytes
        !           552: 
        !           553: xgi_single_inner_byte:
        !           554:         mov     cInnerBytes,edx         ; clear inner bytecount for next glyph
        !           555:         push    offset FLAT:xgi_last_byte
        !           556:         jmp     offset FLAT:xgi_middle_byte_table[eax*4]
        !           557: 
        !           558: xgi_multi_inner_bytes:
        !           559:         inc     edx                     ; restore the bytes count
        !           560:         mov     edi,pjScreen            ; Always write glyph to screen
        !           561:         add     pjGlyph,edx             ; advance pointer to last glyph byte
        !           562:         add     pjScreen,edx            ; advance screen pointer to last column
        !           563:         sub     cjBytes,edx             ; glyph scan incremental
        !           564:         mov     ebx,ulNextScan
        !           565:         sub     ebx,edx                 ; screen scan incremental
        !           566:         mov     edx,cScan               ; display area height
        !           567:         mov     cScanCount,edx
        !           568:         call    offset FLAT:xgi_middle_bytes_table[eax*4]
        !           569:         xor     eax,eax
        !           570:         xchg    eax,cInnerBytes         ; clear inner bytecount for next glyph
        !           571:         add     cjBytes,eax             ; restore its original value
        !           572: 
        !           573: xgi_last_byte:
        !           574:         mov     ch,fjLastMask           ; CH = last byte mask
        !           575:         or      ch,ch                   ; do we have the last byte?
        !           576:         jz      short sblt_xfer_one_glyph; no. then we are done
        !           577: 
        !           578:         mov     esi,pjGlyph             ; Read glyph from here
        !           579:         mov     eax,flAccel             ; AL = EAX = Accelerator flags, AH = 0
        !           580:         mov     fjLastMask,ah           ; clear last mask for next glyph
        !           581:         mov     dh,8
        !           582:         sub     dh,cl                   ; DH = # bits available in next byte
        !           583:         sub     dh,cfLastBits           ; CY = 1 if we need another byte
        !           584:         adc     eax,eax
        !           585:         mov     ebx,pfnLastGlyph        ; use an appropriate jump table
        !           586:         call    [ebx][eax*4]            ; transfer the last glyph byte
        !           587: 
        !           588: sblt_xfer_one_glyph:
        !           589:         dec     cGlyph
        !           590:         jz      short sblt_exit         ; we are finished
        !           591:         cmp     cGlyph,1
        !           592:         je      sblt_last_glyph_cell    ; the last glyph to transfer
        !           593:         jmp     [pfnMidGlyph]           ; to the right entry point
        !           594: 
        !           595: ;----------------------------------------------------------------------------
        !           596: ; Everything is done, go home
        !           597: ;----------------------------------------------------------------------------
        !           598: 
        !           599: sblt_exit:
        !           600:         cRet    vStringBlt
        !           601: 
        !           602: ;---------------------------Private-Routine------------------------------;
        !           603: ; fixed_pitch_aligned_sblt
        !           604: ;
        !           605: ;   Draw string of fixed-pitch glyph with byte width that is byte aligned
        !           606: ;   onto screen.
        !           607: ;
        !           608: ; History:
        !           609: ;   Wed 02-Oct-1991 09:16:15 -by- Viroon Touranachun [viroont]
        !           610: ;   Created.
        !           611: ;-----------------------------------------------------------------------;
        !           612: 
        !           613:         ALIGN 4
        !           614: fixed_pitch_aligned_sblt::
        !           615:         test    byte ptr flAccel,VSB_OPAQUE_BKGND
        !           616:         jz      short fixed_pitch_aligned_sblt_inner; if we do opaque background
        !           617:         mov     esi,edi                 ; save ptr to 1st glyph
        !           618:         call    xgi_set_opaque_bkgnd    ; we need to init VGA registers
        !           619:         mov     edi,esi                 ; restore ptr to 1st glyph
        !           620: 
        !           621:         ALIGN 4
        !           622: fixed_pitch_aligned_sblt_inner:
        !           623:         mov     esi,[edi].gp_pgdf
        !           624:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           625:         mov     edx,[esi].gb_cx         ; full glyph cell width
        !           626:         mov     eax,edx
        !           627:         shr     edx,3                   ; number of bytes it covers
        !           628:         mov     cFixGlyphWidth,edx
        !           629: 
        !           630:         add     eax,7
        !           631:         shr     eax,3
        !           632:         mov     cjBytes,eax             ; bytecount for glyph scan increment
        !           633:         imul    eax,cOffsetScan
        !           634:         mov     cFixScanOffset,eax      ; fixed byte offset to 1st visible scan
        !           635: 
        !           636:         mov     eax,flAccel             ; mix modes are here
        !           637:         and     eax,VSB_OPAQUE_BKGND or VSB_MIX_STRING
        !           638:         add     eax,eax                 ; we will always do one fetch
        !           639: 
        !           640:         sub     edi,size GLYPHPOS       ; prepare to advance to 1st glyph
        !           641:         dec     edx                     ; use different routine if one byte
        !           642:         jnz     short fpa_multi_byte_glyph
        !           643: 
        !           644: fpa_single_byte_glyph:
        !           645:         mov     eax,offset FLAT:xgi_middle_byte_table[eax*4]
        !           646:         mov     pfnFirstByte,eax
        !           647: 
        !           648:         ALIGN 4
        !           649: fpa_next_single_byte_glyph:
        !           650:         add     edi,size GLYPHPOS       ; move to the next glyph
        !           651:         mov     esi,[edi].gp_pgdf
        !           652:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           653:         lea     esi,[esi].gb_aj         ; start of the glyph bits
        !           654:         add     esi,cFixScanOffset      ; advance to 1st visible byte
        !           655:         push    edi                     ; save pointer to the current glyph
        !           656:         call    [pfnFirstByte]          ; display the current glyph
        !           657:         pop     edi                     ; restore the current glyph ptr
        !           658:         dec     cGlyph
        !           659:         jnz     short fpa_next_single_byte_glyph
        !           660:         jmp     short fpa_exit          ; we are done
        !           661: 
        !           662:         ALIGN 4
        !           663: fpa_multi_byte_glyph:
        !           664:         mov     eax,offset FLAT:xgi_middle_bytes_table[eax*4]
        !           665:         mov     pfnFirstByte,eax
        !           666:         inc     edx                     ; restore the glyph width
        !           667:         mov     cInnerBytes,edx
        !           668:         sub     cjBytes,edx             ; glyph scan incremental
        !           669:         mov     ebx,ulNextScan
        !           670:         sub     ebx,edx                 ; screen scan incremental
        !           671: 
        !           672:         ALIGN 4
        !           673: fpa_next_multi_byte_glyph:
        !           674:         add     edi,size GLYPHPOS       ; move to the next glyph
        !           675:         mov     esi,[edi].gp_pgdf
        !           676:         mov     esi,[esi].gdf_pgb       ; ptr to glyph bits
        !           677:         lea     esi,[esi].gb_aj         ; start of the glyph bits
        !           678:         add     esi,cFixScanOffset      ; advance to 1st visible byte
        !           679:         push    edi                     ; save pointer to the current glyph
        !           680:         mov     edi,pjScreen            ; Always write glyph to screen
        !           681:         mov     eax,cFixGlyphWidth      ; glyph width in byte
        !           682:         add     pjScreen,eax            ; advance screen pointer to last column
        !           683:         mov     eax,cScan               ; display area height
        !           684:         mov     cScanCount,eax
        !           685:         call    [pfnFirstByte]
        !           686:         pop     edi                     ; restore the current glyph ptr
        !           687:         dec     cGlyph
        !           688:         jnz     short fpa_next_multi_byte_glyph
        !           689: 
        !           690:         ALIGN 4
        !           691: fpa_exit:
        !           692:         retn
        !           693: 
        !           694: ;*************************************************************************
        !           695: ;
        !           696: ;   The following routines transfer the glyph image to reserved memory area.
        !           697: ;
        !           698: ;*************************************************************************
        !           699: 
        !           700: ;---------------------------Private-Routine------------------------------;
        !           701: ; xgi1_buffer_overwrite
        !           702: ;
        !           703: ;   Draw a glyph byte onto the reserved memory area.
        !           704: ;   For opaque background, collect the current mask for displaying it later.
        !           705: ;
        !           706: ; History:
        !           707: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !           708: ;   Created.
        !           709: ;-----------------------------------------------------------------------;
        !           710: 
        !           711:         ALIGN 4
        !           712: xgi1_buffer_over_obos::
        !           713:         mov     fjOBOSMask,ch           ; new mask for new byte
        !           714: 
        !           715:         ALIGN 4
        !           716: xgi1_buffer_over::
        !           717:         mov     ebx,cScanBlock          ; Scans to draw
        !           718:         mov     edi,pjImage             ; we are just saving the bits
        !           719:         mov     eax,cLeadScan
        !           720:         mov     edx,cjBytes
        !           721:         jmp     offset FLAT:xgi1_fob_over[eax*4]; start at the correct location
        !           722: 
        !           723:         ALIGN 4
        !           724: xgi_fetch_one_byte_over_loop8:
        !           725:         mov     al,[esi]                ; AL = glyph data
        !           726:         add     esi,edx                 ; Next line of glyph
        !           727:         rol     al,cl                   ; Put usable glyph data in place
        !           728:         and     al,ch
        !           729: 
        !           730: xgi_fetch_one_byte_over_loop7:
        !           731:         mov     ah,[esi]                ; AL = glyph data
        !           732:         add     esi,edx                 ; Next line of glyph
        !           733:         rol     ah,cl                   ; Put usable glyph data in place
        !           734:         and     ah,ch
        !           735:         shl     eax,16
        !           736: 
        !           737: xgi_fetch_one_byte_over_loop6:
        !           738:         mov     al,[esi]                ; AL = glyph data
        !           739:         add     esi,edx                 ; Next line of glyph
        !           740:         rol     al,cl                   ; Put usable glyph data in place
        !           741:         and     al,ch
        !           742: 
        !           743: xgi_fetch_one_byte_over_loop5:
        !           744:         mov     ah,[esi]                ; AL = glyph data
        !           745:         add     esi,edx                 ; Next line of glyph
        !           746:         rol     ah,cl                   ; Put usable glyph data in place
        !           747:         and     ah,ch
        !           748:         rol     eax,16
        !           749:         stosd
        !           750: 
        !           751: xgi_fetch_one_byte_over_loop4:
        !           752:         mov     al,[esi]                ; AL = glyph data
        !           753:         add     esi,edx                 ; Next line of glyph
        !           754:         rol     al,cl                   ; Put usable glyph data in place
        !           755:         and     al,ch
        !           756: 
        !           757: xgi_fetch_one_byte_over_loop3:
        !           758:         mov     ah,[esi]                ; AL = glyph data
        !           759:         add     esi,edx                 ; Next line of glyph
        !           760:         rol     ah,cl                   ; Put usable glyph data in place
        !           761:         and     ah,ch
        !           762:         shl     eax,16
        !           763: 
        !           764: xgi_fetch_one_byte_over_loop2:
        !           765:         mov     al,[esi]                ; AL = glyph data
        !           766:         add     esi,edx                 ; Next line of glyph
        !           767:         rol     al,cl                   ; Put usable glyph data in place
        !           768:         and     al,ch
        !           769: 
        !           770: xgi_fetch_one_byte_over_loop1:
        !           771:         mov     ah,[esi]                ; AL = glyph data
        !           772:         add     esi,edx                 ; Next line of glyph
        !           773:         rol     ah,cl                   ; Put usable glyph data in place
        !           774:         and     ah,ch
        !           775:         rol     eax,16
        !           776:         stosd
        !           777: 
        !           778:         dec     ebx
        !           779:         jnz     short xgi_fetch_one_byte_over_loop8 ; finish column
        !           780: 
        !           781: xbov1_exit:
        !           782:         retn
        !           783: 
        !           784: ;---------------------------Private-Routine------------------------------;
        !           785: ; xgi1_buffer_or
        !           786: ;
        !           787: ;   Merge a glyph byte with bits in the reserved memory area.
        !           788: ;   For opaque background, collect the current mask for displaying it later.
        !           789: ;
        !           790: ; History:
        !           791: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !           792: ;   Created.
        !           793: ;-----------------------------------------------------------------------;
        !           794: 
        !           795:         ALIGN 4
        !           796: xgi1_buffer_or_obos::
        !           797:         or      fjOBOSMask,ch           ; accumulate mask for new byte
        !           798: 
        !           799:         ALIGN 4
        !           800: xgi1_buffer_or::
        !           801:         mov     ebx,cScanBlock          ; Scans to draw
        !           802:         mov     edi,pjImage             ; we are just saving the bits
        !           803:         mov     eax,cLeadScan
        !           804:         mov     edx,cjBytes
        !           805:         jmp     offset FLAT:xgi1_fob_or[eax*4]; start at the correct location
        !           806: 
        !           807:         ALIGN 4
        !           808: xgi_fetch_one_byte_or_loop8:
        !           809:         mov     al,[esi]                ; AL = glyph data
        !           810:         add     esi,edx                 ; Next line of glyph
        !           811:         rol     al,cl                   ; Put usable glyph data in place
        !           812:         and     al,ch
        !           813: 
        !           814: xgi_fetch_one_byte_or_loop7:
        !           815:         mov     ah,[esi]                ; AL = glyph data
        !           816:         add     esi,edx                 ; Next line of glyph
        !           817:         rol     ah,cl                   ; Put usable glyph data in place
        !           818:         and     ah,ch
        !           819:         shl     eax,16
        !           820: 
        !           821: xgi_fetch_one_byte_or_loop6:
        !           822:         mov     al,[esi]                ; AL = glyph data
        !           823:         add     esi,edx                 ; Next line of glyph
        !           824:         rol     al,cl                   ; Put usable glyph data in place
        !           825:         and     al,ch
        !           826: 
        !           827: xgi_fetch_one_byte_or_loop5:
        !           828:         mov     ah,[esi]                ; AL = glyph data
        !           829:         add     esi,edx                 ; Next line of glyph
        !           830:         rol     ah,cl                   ; Put usable glyph data in place
        !           831:         and     ah,ch
        !           832:         rol     eax,16
        !           833:         or      [edi],eax
        !           834:         add     edi,4                   ; advance buffer pointer
        !           835: 
        !           836: xgi_fetch_one_byte_or_loop4:
        !           837:         mov     al,[esi]                ; AL = glyph data
        !           838:         add     esi,edx                 ; Next line of glyph
        !           839:         rol     al,cl                   ; Put usable glyph data in place
        !           840:         and     al,ch
        !           841: 
        !           842: xgi_fetch_one_byte_or_loop3:
        !           843:         mov     ah,[esi]                ; AL = glyph data
        !           844:         add     esi,edx                 ; Next line of glyph
        !           845:         rol     ah,cl                   ; Put usable glyph data in place
        !           846:         and     ah,ch
        !           847:         shl     eax,16
        !           848: 
        !           849: xgi_fetch_one_byte_or_loop2:
        !           850:         mov     al,[esi]                ; AL = glyph data
        !           851:         add     esi,edx                 ; Next line of glyph
        !           852:         rol     al,cl                   ; Put usable glyph data in place
        !           853:         and     al,ch
        !           854: 
        !           855: xgi_fetch_one_byte_or_loop1:
        !           856:         mov     ah,[esi]                ; AL = glyph data
        !           857:         add     esi,edx                 ; Next line of glyph
        !           858:         rol     ah,cl                   ; Put usable glyph data in place
        !           859:         and     ah,ch
        !           860:         rol     eax,16
        !           861:         or      [edi],eax
        !           862:         add     edi,4                   ; advance buffer pointer
        !           863: 
        !           864:         dec     ebx
        !           865:         jnz     short xgi_fetch_one_byte_or_loop8 ; finish column
        !           866: 
        !           867: xbor1_exit:
        !           868:         retn
        !           869: 
        !           870: ;---------------------------Private-Routine------------------------------;
        !           871: ; xgi2_buffer_over
        !           872: ;
        !           873: ;   Draw two glyph bytes onto the reserved memory area.
        !           874: ;   For opaque background, collect the current mask for displaying it later.
        !           875: ;
        !           876: ; History:
        !           877: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !           878: ;   Created.
        !           879: ;-----------------------------------------------------------------------;
        !           880: 
        !           881:         ALIGN 4
        !           882: xgi2_buffer_over_obos::
        !           883:         mov     fjOBOSMask,ch           ; new mask for new byte
        !           884: 
        !           885:         ALIGN 4
        !           886: xgi2_buffer_over::
        !           887:         mov     ebx,cScanBlock          ; Scans to draw
        !           888:         mov     edi,pjImage             ; we are just saving the bits
        !           889:         mov     eax,cLeadScan
        !           890: 
        !           891:         push    ebp                     ; *************************************
        !           892:         mov     ebp,cjBytes             ; ** No parameter access beyond this **
        !           893: 
        !           894:         jmp     offset FLAT:xgi2_ftb_over[eax*4] ; start at the correct location
        !           895: 
        !           896:         ALIGN 4
        !           897: xgi_fetch_two_bytes_over_loop8:
        !           898:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           899:         add     esi,ebp                 ; Next line of glyph
        !           900:         rol     ax,cl                   ; AL = glyph data
        !           901:         and     al,ch
        !           902: 
        !           903: xgi_fetch_two_bytes_over_loop7:
        !           904:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !           905:         add     esi,ebp                 ; Next line of glyph
        !           906:         rol     dx,cl                   ; AL = glyph data
        !           907:         and     dl,ch
        !           908:         mov     ah,dl
        !           909:         shl     eax,16
        !           910: 
        !           911: xgi_fetch_two_bytes_over_loop6:
        !           912:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           913:         add     esi,ebp                 ; Next line of glyph
        !           914:         rol     ax,cl                   ; AL = glyph data
        !           915:         and     al,ch
        !           916: 
        !           917: xgi_fetch_two_bytes_over_loop5:
        !           918:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !           919:         add     esi,ebp                 ; Next line of glyph
        !           920:         rol     dx,cl                   ; AL = glyph data
        !           921:         and     dl,ch
        !           922:         mov     ah,dl
        !           923:         rol     eax,16
        !           924:         stosd
        !           925: 
        !           926: xgi_fetch_two_bytes_over_loop4:
        !           927:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           928:         add     esi,ebp                 ; Next line of glyph
        !           929:         rol     ax,cl                   ; AL = glyph data
        !           930:         and     al,ch
        !           931: 
        !           932: xgi_fetch_two_bytes_over_loop3:
        !           933:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !           934:         add     esi,ebp                 ; Next line of glyph
        !           935:         rol     dx,cl                   ; AL = glyph data
        !           936:         and     dl,ch
        !           937:         mov     ah,dl
        !           938:         shl     eax,16
        !           939: 
        !           940: xgi_fetch_two_bytes_over_loop2:
        !           941:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           942:         add     esi,ebp                 ; Next line of glyph
        !           943:         rol     ax,cl                   ; AL = glyph data
        !           944:         and     al,ch
        !           945: 
        !           946: xgi_fetch_two_bytes_over_loop1:
        !           947:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !           948:         add     esi,ebp                 ; Next line of glyph
        !           949:         rol     dx,cl                   ; AL = glyph data
        !           950:         and     dl,ch
        !           951:         mov     ah,dl
        !           952:         rol     eax,16
        !           953:         stosd
        !           954: 
        !           955:         dec     ebx
        !           956:         jnz     short xgi_fetch_two_bytes_over_loop8 ; finish column
        !           957: 
        !           958:         pop     ebp                     ; ** Parameter can be accessed ********
        !           959:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !           960: 
        !           961: xbov2_exit:
        !           962:         retn
        !           963: 
        !           964: ;---------------------------Private-Routine------------------------------;
        !           965: ; xgi2_buffer_or
        !           966: ;
        !           967: ;   Merge two glyph bytes with bits in the reserved memory area.
        !           968: ;   For opaque background, collect the current mask for displaying it later.
        !           969: ;
        !           970: ; History:
        !           971: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !           972: ;   Created.
        !           973: ;-----------------------------------------------------------------------;
        !           974: 
        !           975:         ALIGN 4
        !           976: xgi2_buffer_or_obos::
        !           977:         or      fjOBOSMask,ch           ; accumulate mask for new byte
        !           978: 
        !           979:         ALIGN 4
        !           980: xgi2_buffer_or::
        !           981:         mov     ebx,cScanBlock          ; Scans to draw
        !           982:         mov     edi,pjImage             ; we are just saving the bits
        !           983:         mov     eax,cLeadScan
        !           984: 
        !           985:         push    ebp                     ; *************************************
        !           986:         mov     ebp,cjBytes             ; ** No parameter access beyond this **
        !           987: 
        !           988:         jmp     offset FLAT:xgi2_ftb_or[eax*4] ; start at the correct location
        !           989: 
        !           990:         ALIGN 4
        !           991: xgi_fetch_two_bytes_or_loop8:
        !           992:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !           993:         add     esi,ebp                 ; Next line of glyph
        !           994:         rol     ax,cl                   ; AL = glyph data
        !           995:         and     al,ch
        !           996: 
        !           997: xgi_fetch_two_bytes_or_loop7:
        !           998:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !           999:         add     esi,ebp                 ; Next line of glyph
        !          1000:         rol     dx,cl                   ; AL = glyph data
        !          1001:         and     dl,ch
        !          1002:         mov     ah,dl
        !          1003:         shl     eax,16
        !          1004: 
        !          1005: xgi_fetch_two_bytes_or_loop6:
        !          1006:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !          1007:         add     esi,ebp                 ; Next line of glyph
        !          1008:         rol     ax,cl                   ; AL = glyph data
        !          1009:         and     al,ch
        !          1010: 
        !          1011: xgi_fetch_two_bytes_or_loop5:
        !          1012:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !          1013:         add     esi,ebp                 ; Next line of glyph
        !          1014:         rol     dx,cl                   ; AL = glyph data
        !          1015:         and     dl,ch
        !          1016:         mov     ah,dl
        !          1017:         rol     eax,16
        !          1018:         or      [edi],eax
        !          1019:         add     edi,4                   ; Next scan on VGA
        !          1020: 
        !          1021: xgi_fetch_two_bytes_or_loop4:
        !          1022:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !          1023:         add     esi,ebp                 ; Next line of glyph
        !          1024:         rol     ax,cl                   ; AL = glyph data
        !          1025:         and     al,ch
        !          1026: 
        !          1027: xgi_fetch_two_bytes_or_loop3:
        !          1028:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !          1029:         add     esi,ebp                 ; Next line of glyph
        !          1030:         rol     dx,cl                   ; AL = glyph data
        !          1031:         and     dl,ch
        !          1032:         mov     ah,dl
        !          1033:         shl     eax,16
        !          1034: 
        !          1035: xgi_fetch_two_bytes_or_loop2:
        !          1036:         mov     ax,[esi]                ; AL = curr byte, AH = next byte
        !          1037:         add     esi,ebp                 ; Next line of glyph
        !          1038:         rol     ax,cl                   ; AL = glyph data
        !          1039:         and     al,ch
        !          1040: 
        !          1041: xgi_fetch_two_bytes_or_loop1:
        !          1042:         mov     dx,[esi]                ; AL = curr byte, AH = next byte
        !          1043:         add     esi,ebp                 ; Next line of glyph
        !          1044:         rol     dx,cl                   ; AL = glyph data
        !          1045:         and     dl,ch
        !          1046:         mov     ah,dl
        !          1047:         rol     eax,16
        !          1048:         or      [edi],eax
        !          1049:         add     edi,4                   ; Next scan on VGA
        !          1050: 
        !          1051:         dec     ebx
        !          1052:         jnz     short xgi_fetch_two_bytes_or_loop8 ; finish column
        !          1053: 
        !          1054:         pop     ebp                     ; ** Parameter can be accessed ********
        !          1055:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          1056: 
        !          1057: xbor2_exit:
        !          1058:         retn
        !          1059: 
        !          1060: ;*************************************************************************
        !          1061: ;
        !          1062: ;   The following routines handle opaque glyph xparent background to screen
        !          1063: ;
        !          1064: ;*************************************************************************
        !          1065: 
        !          1066: ;---------------------------Private-Routine------------------------------;
        !          1067: ; xgi1_scrn_g_xbos
        !          1068: ;
        !          1069: ;   Draw an opaque glyph byte with xparent background to screen.
        !          1070: ;   If it's the 1st screen byte, adjust jump tables.
        !          1071: ;
        !          1072: ; History:
        !          1073: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1074: ;   Created.
        !          1075: ;-----------------------------------------------------------------------;
        !          1076: 
        !          1077:         ALIGN 4
        !          1078: xgi1_scrn_g_xbos_1scrn::
        !          1079:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1080: 
        !          1081:         ALIGN 4
        !          1082: xgi1_scrn_g_xbos::
        !          1083:         push    ecx                     ; preserve phase info
        !          1084:         mov     ebx,cScanBlock          ; Scans to draw
        !          1085:         mov     ecx,ulNextScan          ; scan line width
        !          1086:         mov     edi,pjScreen            ; we are displaying the glyph
        !          1087:         mov     edx,cjBytes
        !          1088:         mov     eax,cLeadScan
        !          1089:         jmp     offset FLAT:xsg1_xbos_dispatch[eax*4]; start at the correct location
        !          1090: 
        !          1091:         ALIGN 4
        !          1092: xsg1_xbos_loop8:
        !          1093:         mov     al,[esi]                ; get the glyph byte
        !          1094:         add     esi,edx                 ; Next line of glyph
        !          1095:         or      al,al
        !          1096:         jz      short @F
        !          1097:         xchg    [edi],al
        !          1098: @@:
        !          1099:         add     edi,ecx                 ; Next line on screen
        !          1100: 
        !          1101: xsg1_xbos_loop7:
        !          1102:         mov     al,[esi]                ; get the glyph byte
        !          1103:         add     esi,edx                 ; Next line of glyph
        !          1104:         or      al,al
        !          1105:         jz      short @F
        !          1106:         xchg    [edi],al
        !          1107: @@:
        !          1108:         add     edi,ecx                 ; Next line on screen
        !          1109: 
        !          1110: xsg1_xbos_loop6:
        !          1111:         mov     al,[esi]                ; get the glyph byte
        !          1112:         add     esi,edx                 ; Next line of glyph
        !          1113:         or      al,al
        !          1114:         jz      short @F
        !          1115:         xchg    [edi],al
        !          1116: @@:
        !          1117:         add     edi,ecx                 ; Next line on screen
        !          1118: 
        !          1119: xsg1_xbos_loop5:
        !          1120:         mov     al,[esi]                ; get the glyph byte
        !          1121:         add     esi,edx                 ; Next line of glyph
        !          1122:         or      al,al
        !          1123:         jz      short @F
        !          1124:         xchg    [edi],al
        !          1125: @@:
        !          1126:         add     edi,ecx                 ; Next line on screen
        !          1127: 
        !          1128: xsg1_xbos_loop4:
        !          1129:         mov     al,[esi]                ; get the glyph byte
        !          1130:         add     esi,edx                 ; Next line of glyph
        !          1131:         or      al,al
        !          1132:         jz      short @F
        !          1133:         xchg    [edi],al
        !          1134: @@:
        !          1135:         add     edi,ecx                 ; Next line on screen
        !          1136: 
        !          1137: xsg1_xbos_loop3:
        !          1138:         mov     al,[esi]                ; get the glyph byte
        !          1139:         add     esi,edx                 ; Next line of glyph
        !          1140:         or      al,al
        !          1141:         jz      short @F
        !          1142:         xchg    [edi],al
        !          1143: @@:
        !          1144:         add     edi,ecx                 ; Next line on screen
        !          1145: 
        !          1146: xsg1_xbos_loop2:
        !          1147:         mov     al,[esi]                ; get the glyph byte
        !          1148:         add     esi,edx                 ; Next line of glyph
        !          1149:         or      al,al
        !          1150:         jz      short @F
        !          1151:         xchg    [edi],al
        !          1152: @@:
        !          1153:         add     edi,ecx                 ; Next line on screen
        !          1154: 
        !          1155: xsg1_xbos_loop1:
        !          1156:         mov     al,[esi]                ; get the glyph byte
        !          1157:         add     esi,edx                 ; Next line of glyph
        !          1158:         or      al,al
        !          1159:         jz      short @F
        !          1160:         xchg    [edi],al
        !          1161: @@:
        !          1162:         add     edi,ecx                 ; Next line on screen
        !          1163: 
        !          1164:         dec     ebx
        !          1165:         jnz     short xsg1_xbos_loop8   ; finish column
        !          1166: 
        !          1167: xsg1_xbos_update_ptr:
        !          1168:         inc     pjGlyph                 ; advance glyph pointer
        !          1169:         inc     pjScreen                ; advance display ptr
        !          1170: 
        !          1171:         pop     ecx                     ; restore phase info
        !          1172: 
        !          1173:         retn
        !          1174: 
        !          1175: ;---------------------------Private-Routine------------------------------;
        !          1176: ; xgi1_scrn_gs_xbos
        !          1177: ;
        !          1178: ;   Draw opaque glyph bytes with xparent background to screen.
        !          1179: ;
        !          1180: ; History:
        !          1181: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1182: ;   Created.
        !          1183: ;-----------------------------------------------------------------------;
        !          1184: 
        !          1185:         ALIGN 4
        !          1186: xgi1_scrn_gs_xbos::
        !          1187:         mov     edx,cjBytes
        !          1188: 
        !          1189:         ALIGN 4
        !          1190: xsgs1_xbos_next_scan:
        !          1191:         mov     ecx,cInnerBytes
        !          1192: 
        !          1193:         ALIGN 4
        !          1194: xsgs1_xbos_loop:
        !          1195:         lodsb                           ; get the glyph byte
        !          1196:         or      al,al
        !          1197:         jz      short @F
        !          1198:         xchg    [edi],al
        !          1199: @@:
        !          1200:         inc     edi
        !          1201:         loop    xsgs1_xbos_loop
        !          1202: 
        !          1203:         add     esi,edx                 ; Next line of glyph
        !          1204:         add     edi,ebx                 ; advance screen pointer to next scan
        !          1205:         dec     cScanCount
        !          1206:         jnz     short xsgs1_xbos_next_scan; finish this scan
        !          1207: 
        !          1208: xsgs1_xbos_exit:
        !          1209:         retn
        !          1210: 
        !          1211: ;---------------------------Private-Routine------------------------------;
        !          1212: ; xgi1_scrn_gm_xbos
        !          1213: ;
        !          1214: ;   Draw a masked opaque glyph byte with xparent background to screen.
        !          1215: ;   For the 1st screen byte, update the jump tables.
        !          1216: ;
        !          1217: ; History:
        !          1218: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1219: ;   Created.
        !          1220: ;-----------------------------------------------------------------------;
        !          1221: 
        !          1222:         ALIGN 4
        !          1223: xgi1_scrn_gm_xbos_1scrn::
        !          1224:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1225: 
        !          1226:         ALIGN 4
        !          1227: xgi1_scrn_gm_xbos::
        !          1228:         mov     ebx,cScan               ; number of scans
        !          1229:         mov     edi,pjScreen            ; we will output to screen
        !          1230:         mov     edx,cjBytes
        !          1231: 
        !          1232:         ALIGN 4
        !          1233: xsgm1_xbos_loop:
        !          1234:         mov     al,[esi]                ; get the glyph byte
        !          1235:         rol     al,cl                   ; Put usable glyph data in place
        !          1236:         and     al,ch
        !          1237:         jz      short @F
        !          1238:         xchg    [edi],al
        !          1239: @@:
        !          1240:         add     esi,edx                 ; Next line of glyph
        !          1241:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1242:         dec     ebx
        !          1243:         jnz     short xsgm1_xbos_loop   ; finish column
        !          1244: 
        !          1245: xsgm1_xbos_update_ptr:
        !          1246:         sub     bl,cl                   ; if phase aligned, CY = 0
        !          1247:         cmc                             ; if phase aligned, CY = 1
        !          1248:         adc     pjGlyph,0               ; if phase aligned, advance glyph ptr
        !          1249:         inc     pjScreen
        !          1250: 
        !          1251: xsgm1_xbos_exit:
        !          1252:         retn
        !          1253: 
        !          1254: ;---------------------------Private-Routine------------------------------;
        !          1255: ; xgi1_scrn_gmb_xbos
        !          1256: ;
        !          1257: ;   Draw an masked opaque glyph byte and bits from the reserved memory area
        !          1258: ;   with xparent background to screen. Update jump tables if 1st screen byte.
        !          1259: ;
        !          1260: ; History:
        !          1261: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1262: ;   Created.
        !          1263: ;-----------------------------------------------------------------------;
        !          1264: 
        !          1265:         ALIGN 4
        !          1266: xgi1_scrn_gmb_xbos_1scrn::
        !          1267:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1268: 
        !          1269:         ALIGN 4
        !          1270: xgi1_scrn_gmb_xbos::
        !          1271:         push    ebp                     ; remember stack frame pointer
        !          1272:         mov     eax,cLeadScan           ; First scan to draw
        !          1273:         mov     edx,pjImage             ; access bits saved in buffer
        !          1274:         mov     edi,pjScreen            ; we are displaying the glyph
        !          1275:         mov     ebx,ulNextScan          ; offset to next screen scan
        !          1276:         mov     eax,xsgmb1_xbos_dispatch[eax*4]
        !          1277:         push    eax                     ; start at the correct location
        !          1278:         mov     ah,byte ptr cScanBlock  ; Number of scan blocks to draw
        !          1279:                                         ; ***2K scans max***
        !          1280:         mov     ebp,cjBytes             ; offset to next glyph scan
        !          1281:                                         ; ***can't access stack frame***
        !          1282:         retn                            ;jump into unrolled loop
        !          1283: 
        !          1284:         ALIGN 4
        !          1285: xsgmb1_xbos_loop8:
        !          1286:         mov     al,[esi]                ; get the glyph byte
        !          1287:         add     esi,ebp                 ; Next line of glyph
        !          1288:         rol     al,cl                   ; Put usable glyph data in place
        !          1289:         and     al,ch
        !          1290:         or      al,[edx]
        !          1291:         jz      short @F
        !          1292:         xchg    [edi],al
        !          1293: @@:
        !          1294:         add     edi,ebx
        !          1295: 
        !          1296: xsgmb1_xbos_loop7:
        !          1297:         mov     al,[esi]                ; get the glyph byte
        !          1298:         add     esi,ebp                 ; Next line of glyph
        !          1299:         rol     al,cl                   ; Put usable glyph data in place
        !          1300:         and     al,ch
        !          1301:         or      al,[edx][1]
        !          1302:         jz      short @F
        !          1303:         xchg    [edi],al
        !          1304: @@:
        !          1305:         add     edi,ebx
        !          1306: 
        !          1307: xsgmb1_xbos_loop6:
        !          1308:         mov     al,[esi]                ; get the glyph byte
        !          1309:         add     esi,ebp                 ; Next line of glyph
        !          1310:         rol     al,cl                   ; Put usable glyph data in place
        !          1311:         and     al,ch
        !          1312:         or      al,[edx][2]
        !          1313:         jz      short @F
        !          1314:         xchg    [edi],al
        !          1315: @@:
        !          1316:         add     edi,ebx
        !          1317: 
        !          1318: xsgmb1_xbos_loop5:
        !          1319:         mov     al,[esi]                ; get the glyph byte
        !          1320:         add     esi,ebp                 ; Next line of glyph
        !          1321:         rol     al,cl                   ; Put usable glyph data in place
        !          1322:         and     al,ch
        !          1323:         or      al,[edx][3]
        !          1324:         jz      short @F
        !          1325:         xchg    [edi],al
        !          1326: @@:
        !          1327:         add     edi,ebx
        !          1328:         add     edx,4
        !          1329: 
        !          1330: xsgmb1_xbos_loop4:
        !          1331:         mov     al,[esi]                ; get the glyph byte
        !          1332:         add     esi,ebp                 ; Next line of glyph
        !          1333:         rol     al,cl                   ; Put usable glyph data in place
        !          1334:         and     al,ch
        !          1335:         or      al,[edx]
        !          1336:         jz      short @F
        !          1337:         xchg    [edi],al
        !          1338: @@:
        !          1339:         add     edi,ebx
        !          1340: 
        !          1341: xsgmb1_xbos_loop3:
        !          1342:         mov     al,[esi]                ; get the glyph byte
        !          1343:         add     esi,ebp                 ; Next line of glyph
        !          1344:         rol     al,cl                   ; Put usable glyph data in place
        !          1345:         and     al,ch
        !          1346:         or      al,[edx][1]
        !          1347:         jz      short @F
        !          1348:         xchg    [edi],al
        !          1349: @@:
        !          1350:         add     edi,ebx
        !          1351: 
        !          1352: xsgmb1_xbos_loop2:
        !          1353:         mov     al,[esi]                ; get the glyph byte
        !          1354:         add     esi,ebp                 ; Next line of glyph
        !          1355:         rol     al,cl                   ; Put usable glyph data in place
        !          1356:         and     al,ch
        !          1357:         or      al,[edx][2]
        !          1358:         jz      short @F
        !          1359:         xchg    [edi],al
        !          1360: @@:
        !          1361:         add     edi,ebx
        !          1362: 
        !          1363: xsgmb1_xbos_loop1:
        !          1364:         mov     al,[esi]                ; get the glyph byte
        !          1365:         add     esi,ebp                 ; Next line of glyph
        !          1366:         rol     al,cl                   ; Put usable glyph data in place
        !          1367:         and     al,ch
        !          1368:         or      al,[edx][3]
        !          1369:         jz      short @F
        !          1370:         xchg    [edi],al
        !          1371: @@:
        !          1372:         add     edi,ebx
        !          1373:         add     edx,4
        !          1374: 
        !          1375:         dec     ah
        !          1376:         jnz     xsgmb1_xbos_loop8       ; finish column
        !          1377: 
        !          1378:         pop     ebp                     ;***can access stack frame again***
        !          1379: 
        !          1380: xsgmb1_xbos_update_ptr:
        !          1381:         inc     pjScreen
        !          1382: 
        !          1383: xsgmb1_xbos_exit:
        !          1384:         retn
        !          1385: 
        !          1386: ;---------------------------Private-Routine------------------------------;
        !          1387: ; xgi2_scrn_g_xbos
        !          1388: ;
        !          1389: ;   Draw a glyph to the reserved memory area.
        !          1390: ;
        !          1391: ; History:
        !          1392: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1393: ;   Created.
        !          1394: ;-----------------------------------------------------------------------;
        !          1395: 
        !          1396:         ALIGN 4
        !          1397: xgi2_scrn_g_xbos_1scrn::
        !          1398:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1399: 
        !          1400:         ALIGN 4
        !          1401: xgi2_scrn_g_xbos::
        !          1402:         push    ecx                     ; preserve phase info
        !          1403:         mov     eax,cLeadScan
        !          1404:         mov     ch,byte ptr cScanBlock  ; Number of scan blocks to draw
        !          1405:                                         ; ***2K scans max***
        !          1406:         mov     edi,pjScreen            ; where we are displaying the glyph
        !          1407:         mov     edx,cjBytes
        !          1408:         mov     ebx,ulNextScan          ; offset to next screen scan
        !          1409: 
        !          1410:         jmp     offset FLAT:xsg2_xbos_dispatch[eax*4]; start at the correct location
        !          1411: 
        !          1412:         ALIGN 4
        !          1413: xsg2_xbos_loop8:
        !          1414:         mov     ax,[esi]                ; get the glyph byte
        !          1415:         add     esi,edx                 ; Next line of glyph
        !          1416:         rol     ax,cl
        !          1417:         or      al,al
        !          1418:         jz      short @F
        !          1419:         xchg    [edi],al
        !          1420: @@:
        !          1421:         add     edi,ebx                 ; next screen scan line
        !          1422: 
        !          1423: xsg2_xbos_loop7:
        !          1424:         mov     ax,[esi]                ; get the glyph byte
        !          1425:         add     esi,edx                 ; Next line of glyph
        !          1426:         rol     ax,cl
        !          1427:         or      al,al
        !          1428:         jz      short @F
        !          1429:         xchg    [edi],al
        !          1430: @@:
        !          1431:         add     edi,ebx                 ; next screen scan line
        !          1432: 
        !          1433: xsg2_xbos_loop6:
        !          1434:         mov     ax,[esi]                ; get the glyph byte
        !          1435:         add     esi,edx                 ; Next line of glyph
        !          1436:         rol     ax,cl
        !          1437:         or      al,al
        !          1438:         jz      short @F
        !          1439:         xchg    [edi],al
        !          1440: @@:
        !          1441:         add     edi,ebx                 ; next screen scan line
        !          1442: 
        !          1443: xsg2_xbos_loop5:
        !          1444:         mov     ax,[esi]                ; get the glyph byte
        !          1445:         add     esi,edx                 ; Next line of glyph
        !          1446:         rol     ax,cl
        !          1447:         or      al,al
        !          1448:         jz      short @F
        !          1449:         xchg    [edi],al
        !          1450: @@:
        !          1451:         add     edi,ebx                 ; next screen scan line
        !          1452: 
        !          1453: xsg2_xbos_loop4:
        !          1454:         mov     ax,[esi]                ; get the glyph byte
        !          1455:         add     esi,edx                 ; Next line of glyph
        !          1456:         rol     ax,cl
        !          1457:         or      al,al
        !          1458:         jz      short @F
        !          1459:         xchg    [edi],al
        !          1460: @@:
        !          1461:         add     edi,ebx                 ; next screen scan line
        !          1462: 
        !          1463: xsg2_xbos_loop3:
        !          1464:         mov     ax,[esi]                ; get the glyph byte
        !          1465:         add     esi,edx                 ; Next line of glyph
        !          1466:         rol     ax,cl
        !          1467:         or      al,al
        !          1468:         jz      short @F
        !          1469:         xchg    [edi],al
        !          1470: @@:
        !          1471:         add     edi,ebx                 ; next screen scan line
        !          1472: 
        !          1473: xsg2_xbos_loop2:
        !          1474:         mov     ax,[esi]                ; get the glyph byte
        !          1475:         add     esi,edx                 ; Next line of glyph
        !          1476:         rol     ax,cl
        !          1477:         or      al,al
        !          1478:         jz      short @F
        !          1479:         xchg    [edi],al
        !          1480: @@:
        !          1481:         add     edi,ebx                 ; next screen scan line
        !          1482: 
        !          1483: xsg2_xbos_loop1:
        !          1484:         mov     ax,[esi]                ; get the glyph byte
        !          1485:         add     esi,edx                 ; Next line of glyph
        !          1486:         rol     ax,cl
        !          1487:         or      al,al
        !          1488:         jz      short @F
        !          1489:         xchg    [edi],al
        !          1490: @@:
        !          1491:         add     edi,ebx                 ; next screen scan line
        !          1492: 
        !          1493:         dec     ch
        !          1494:         jnz     xsg2_xbos_loop8         ; finish column
        !          1495: 
        !          1496: xsg2_xbos_update_ptr:
        !          1497:         inc     pjScreen                ; advance screen ptr
        !          1498:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          1499: 
        !          1500:         pop     ecx                     ; restore phase info
        !          1501: 
        !          1502:         retn
        !          1503: 
        !          1504: ;---------------------------Private-Routine------------------------------;
        !          1505: ; xgi2_scrn_gs_xbos
        !          1506: ;
        !          1507: ;   Draw a glyph to the reserved memory area.
        !          1508: ;
        !          1509: ; History:
        !          1510: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1511: ;   Created.
        !          1512: ;-----------------------------------------------------------------------;
        !          1513: 
        !          1514:         ALIGN 4
        !          1515: xgi2_scrn_gs_xbos::
        !          1516: xsgs2_xbos_next_scan:
        !          1517:         mov     edx,cInnerBytes
        !          1518: 
        !          1519:         ALIGN 4
        !          1520: xsgs2_xbos_loop:
        !          1521:         mov     ax,[esi]                ; get the glyph byte
        !          1522:         rol     ax,cl
        !          1523:         or      al,al
        !          1524:         jz      short @F
        !          1525:         xchg    [edi],al
        !          1526: @@:
        !          1527:         inc     esi
        !          1528:         inc     edi
        !          1529:         dec     edx
        !          1530:         jnz     short xsgs2_xbos_loop
        !          1531: 
        !          1532:         add     esi,cjBytes             ; Next line of glyph
        !          1533:         add     edi,ebx                 ; advance screen pointer to next scan
        !          1534:         dec     cScanCount
        !          1535:         jnz     short xsgs2_xbos_next_scan; finish this scan
        !          1536: 
        !          1537: xsgs2_xbos_exit:
        !          1538:         retn
        !          1539: 
        !          1540: ;---------------------------Private-Routine------------------------------;
        !          1541: ; xgi2_scrn_gm_xbos
        !          1542: ;
        !          1543: ;   Draw a glyph to the reserved memory area.
        !          1544: ;
        !          1545: ; History:
        !          1546: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1547: ;   Created.
        !          1548: ;-----------------------------------------------------------------------;
        !          1549: 
        !          1550:         ALIGN 4
        !          1551: xgi2_scrn_gm_xbos_1scrn::
        !          1552:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1553: 
        !          1554:         ALIGN 4
        !          1555: xgi2_scrn_gm_xbos::
        !          1556:         mov     ebx,cScan               ; number of scans
        !          1557:         mov     edi,pjScreen            ; we will output to screen
        !          1558:         mov     edx,cjBytes
        !          1559: 
        !          1560:         ALIGN 4
        !          1561: xsgm2_xbos_loop:
        !          1562:         mov     ax,[esi]                ; get the glyph byte
        !          1563:         rol     ax,cl                   ; Put usable glyph data in place
        !          1564:         and     al,ch
        !          1565:         jz      short @F
        !          1566:         xchg    [edi],al
        !          1567: @@:
        !          1568:         add     esi,edx                 ; Next line of glyph
        !          1569:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1570:         dec     ebx
        !          1571:         jnz     short xsgm2_xbos_loop   ; finish column
        !          1572: 
        !          1573: xsgm2_xbos_update_ptr:
        !          1574:         inc     pjScreen                ; advance screen ptr
        !          1575:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          1576: 
        !          1577: xsgm2_xbos_exit:
        !          1578:         retn
        !          1579: 
        !          1580: ;*************************************************************************
        !          1581: ;
        !          1582: ;   The following routines handle mixed glyph xparent background to screen
        !          1583: ;
        !          1584: ;*************************************************************************
        !          1585: 
        !          1586: ;---------------------------Private-Routine------------------------------;
        !          1587: ; xgi1_scrn_g_xbms
        !          1588: ;
        !          1589: ;   Draw a mixed glyph byte with xparent background to screen.
        !          1590: ;   If it's the 1st screen byte, adjust jump tables.
        !          1591: ;
        !          1592: ; History:
        !          1593: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1594: ;   Created.
        !          1595: ;-----------------------------------------------------------------------;
        !          1596: 
        !          1597:         ALIGN 4
        !          1598: xgi1_scrn_g_xbms_1scrn::
        !          1599:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1600: 
        !          1601:         ALIGN 4
        !          1602: xgi1_scrn_g_xbms::
        !          1603:         push    ecx                     ; preserve phase info
        !          1604:         mov     ebx,cScan               ; number of scans
        !          1605:         mov     edi,pjScreen            ; we will output to screen
        !          1606:         mov     ecx,ulNextScan          ; distance from one screen scan to next
        !          1607: 
        !          1608:         push    ebp                     ; *************************************
        !          1609:         mov     ebp,cjBytes             ; ** No parameter access beyond this **
        !          1610: 
        !          1611:         mov     edx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1612:         mov     al,GRAF_BIT_MASK
        !          1613:         out     dx,al                   ; leave GC Index pointing to Bit Mask
        !          1614:         inc     edx                     ; leave DX pointing to GC Data
        !          1615: 
        !          1616:         ALIGN 4
        !          1617: xsg1_xbms_loop:
        !          1618:         mov     al,[esi]                ; AH = glyph data
        !          1619:         or      al,al
        !          1620:         jz      short @F                ; Don't waste time
        !          1621: 
        !          1622:         out     dx,al
        !          1623:         xchg    al,[edi]                ; Set the bits
        !          1624: 
        !          1625: @@:
        !          1626:         add     esi,ebp                 ; Next line of glyph
        !          1627:         add     edi,ecx                 ; advance screen pointer to next scan
        !          1628:         dec     ebx
        !          1629:         jnz     short xsg1_xbms_loop    ; finish column
        !          1630: 
        !          1631:         pop     ebp                     ; ** Parameter can be accessed ********
        !          1632: 
        !          1633: xsg1_xbms_update_ptr:
        !          1634:         inc     pjGlyph                 ; advance glyph pointer
        !          1635:         inc     pjScreen                ; advance screen ptr
        !          1636: 
        !          1637:         pop     ecx                     ; restore phase info
        !          1638: 
        !          1639:         retn
        !          1640: 
        !          1641: ;---------------------------Private-Routine------------------------------;
        !          1642: ; xgi1_scrn_gs_xbms
        !          1643: ;
        !          1644: ;   Draw mixed glyph bytes with xparent background to screen.
        !          1645: ;
        !          1646: ; History:
        !          1647: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1648: ;   Created.
        !          1649: ;-----------------------------------------------------------------------;
        !          1650: 
        !          1651:         ALIGN 4
        !          1652: xgi1_scrn_gs_xbms::
        !          1653:         mov     dx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1654:         mov     al,GRAF_BIT_MASK        ; leave it in AL
        !          1655: 
        !          1656:         ALIGN 4
        !          1657: xsgs1_xbms_next_scan:
        !          1658:         mov     ecx,cInnerBytes
        !          1659: 
        !          1660:         ALIGN 4
        !          1661: xsgs1_xbms_loop:
        !          1662:         mov     ah,[esi]                ; AH = glyph data
        !          1663:         or      ah,ah
        !          1664:         jz      short @F                ; Don't waste time
        !          1665: 
        !          1666:         out     dx,ax
        !          1667:         xchg    ah,[edi]                ; Set the bits
        !          1668: @@:
        !          1669:         inc     esi                     ; next glyph byte
        !          1670:         inc     edi                     ; next screen byte
        !          1671:         loop    xsgs1_xbms_loop
        !          1672: 
        !          1673:         add     esi,cjBytes             ; Next line of glyph
        !          1674:         add     edi,ebx                 ; advance screen pointer to next scan
        !          1675:         dec     cScanCount
        !          1676:         jnz     short xsgs1_xbms_next_scan; finish this scan
        !          1677: 
        !          1678: xsgs1_xbms_exit:
        !          1679:         retn
        !          1680: 
        !          1681: ;---------------------------Private-Routine------------------------------;
        !          1682: ; xgi1_scrn_gm_xbms
        !          1683: ;
        !          1684: ;   Draw a masked mixed glyph byte with xparent background to screen.
        !          1685: ;   For the 1st screen byte, update the jump tables.
        !          1686: ;
        !          1687: ; History:
        !          1688: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1689: ;   Created.
        !          1690: ;-----------------------------------------------------------------------;
        !          1691: 
        !          1692:         ALIGN 4
        !          1693: xgi1_scrn_gm_xbms_1scrn::
        !          1694:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1695: 
        !          1696:         ALIGN 4
        !          1697: xgi1_scrn_gm_xbms::
        !          1698:         mov     ebx,cScan               ; number of scans
        !          1699:         mov     edi,pjScreen            ; we will output to screen
        !          1700: 
        !          1701:         mov     dx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1702:         mov     al,GRAF_BIT_MASK
        !          1703:         out     dx,al                   ; leave GC Index pointing to Bit Mask
        !          1704:         inc     edx                     ; leave DX pointing to GC Data
        !          1705: 
        !          1706:         ALIGN 4
        !          1707: xsgm1_xbms_loop:
        !          1708:         mov     al,[esi]                ; AH = glyph data
        !          1709:         rol     al,cl                   ; Put usable glyph data in place
        !          1710:         and     al,ch
        !          1711:         jz      short @F                ; Don't waste time
        !          1712: 
        !          1713:         out     dx,al
        !          1714:         xchg    al,[edi]                ; Set the bits
        !          1715: 
        !          1716: @@:
        !          1717:         add     esi,cjBytes             ; Next line of glyph
        !          1718:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1719:         dec     ebx
        !          1720:         jnz     short xsgm1_xbms_loop   ; finish column
        !          1721: 
        !          1722: xsgm1_xbms_update_ptr:
        !          1723:         sub     bl,cl                   ; if phase aligned, CY = 0
        !          1724:         cmc                             ; if phase aligned, CY = 1
        !          1725:         adc     pjGlyph,0               ; if phase aligned, advance glyph ptr
        !          1726:         inc     pjScreen
        !          1727: 
        !          1728: xsgm1_xbms_exit:
        !          1729:         retn
        !          1730: 
        !          1731: ;---------------------------Private-Routine------------------------------;
        !          1732: ; xgi1_scrn_gmb_xbms
        !          1733: ;
        !          1734: ;   Draw an masked mixed glyph byte and bits from the reserved memory area
        !          1735: ;   with xparent background to screen. Update jump tables if 1st screen byte.
        !          1736: ;
        !          1737: ; History:
        !          1738: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1739: ;   Created.
        !          1740: ;-----------------------------------------------------------------------;
        !          1741: 
        !          1742:         ALIGN 4
        !          1743: xgi1_scrn_gmb_xbms_1scrn::
        !          1744:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1745: 
        !          1746:         ALIGN 4
        !          1747: xgi1_scrn_gmb_xbms::
        !          1748:         mov     eax,cScan               ; number of scans
        !          1749:         mov     cScanCount,eax          ; scans count
        !          1750:         mov     ebx,pjImage             ; don't forget bits we saved
        !          1751:         add     ebx,cBufferOffset
        !          1752:         mov     edi,pjScreen            ; we will output to screen
        !          1753: 
        !          1754:         mov     dx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1755:         mov     al,GRAF_BIT_MASK
        !          1756:         out     dx,al                   ; leave GC Index pointing to Bit Mask
        !          1757:         inc     edx                     ; leave DX pointing to GC Data
        !          1758: 
        !          1759:         ALIGN 4
        !          1760: xsgmb1_xbms_loop:
        !          1761:         mov     al,[esi]                ; AH = glyph data
        !          1762:         rol     al,cl                   ; Put usable glyph data in place
        !          1763:         and     al,ch
        !          1764:         or      al,[ebx]
        !          1765:         jz      short @F                ; Don't waste time
        !          1766: 
        !          1767:         out     dx,al
        !          1768:         xchg    al,[edi]                ; Set the bits
        !          1769: 
        !          1770: @@:
        !          1771:         add     esi,cjBytes             ; Next line of glyph
        !          1772:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1773:         inc     ebx
        !          1774:         dec     cScanCount
        !          1775:         jnz     short xsgmb1_xbms_loop  ; finish column
        !          1776: 
        !          1777: xsgmb1_xbms_update_ptr:
        !          1778:         inc     pjScreen
        !          1779: 
        !          1780: xsgmb1_xbms_exit:
        !          1781:         retn
        !          1782: 
        !          1783: ;---------------------------Private-Routine------------------------------;
        !          1784: ; xgi2_scrn_g_xbms
        !          1785: ;
        !          1786: ;   Draw a glyph to the reserved memory area.
        !          1787: ;
        !          1788: ; History:
        !          1789: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1790: ;   Created.
        !          1791: ;-----------------------------------------------------------------------;
        !          1792: 
        !          1793:         ALIGN 4
        !          1794: xgi2_scrn_g_xbms_1scrn::
        !          1795:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1796: 
        !          1797:         ALIGN 4
        !          1798: xgi2_scrn_g_xbms::
        !          1799:         mov     ebx,cScan               ; number of scans
        !          1800:         mov     edi,pjScreen            ; we will output to screen
        !          1801: 
        !          1802:         mov     edx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1803:         mov     al,GRAF_BIT_MASK
        !          1804:         out     dx,al                   ; leave GC Index pointing to Bit Mask
        !          1805:         inc     edx                     ; leave DX pointing to GC Data
        !          1806: 
        !          1807:         ALIGN 4
        !          1808: xsg2_xbms_loop:
        !          1809:         mov     ax,[esi]                ; AH = glyph data
        !          1810:         rol     ax,cl
        !          1811:         or      al,al
        !          1812:         jz      short @F                ; Don't waste time
        !          1813: 
        !          1814:         out     dx,al
        !          1815:         xchg    al,[edi]                ; Set the bits
        !          1816: 
        !          1817: @@:
        !          1818:         add     esi,cjBytes             ; Next line of glyph
        !          1819:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1820:         dec     ebx
        !          1821:         jnz     short xsg2_xbms_loop    ; finish column
        !          1822: 
        !          1823: xsg2_xbms_update_ptr:
        !          1824:         inc     pjScreen                ; advance screen ptr
        !          1825:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          1826: 
        !          1827: xsg2_xbms_exit:
        !          1828:         retn
        !          1829: 
        !          1830: ;---------------------------Private-Routine------------------------------;
        !          1831: ; xgi2_scrn_gs_xbms
        !          1832: ;
        !          1833: ;   Draw a glyph to the reserved memory area.
        !          1834: ;
        !          1835: ; History:
        !          1836: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1837: ;   Created.
        !          1838: ;-----------------------------------------------------------------------;
        !          1839: 
        !          1840:         ALIGN 4
        !          1841: xgi2_scrn_gs_xbms::
        !          1842:         mov     dx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1843:         add     cl,8                    ; we want the glyph byte in AH
        !          1844:         mov     cScreenInc,ebx
        !          1845: 
        !          1846:         ALIGN 4
        !          1847: xsgs2_xbms_next_scan:
        !          1848:         mov     ebx,cInnerBytes
        !          1849: 
        !          1850:         ALIGN 4
        !          1851: xsgs2_xbms_loop:
        !          1852:         mov     ax,[esi]                ; AH = glyph data
        !          1853:         rol     ax,cl
        !          1854:         or      ah,ah
        !          1855:         jz      short @F                ; Don't waste time
        !          1856: 
        !          1857:         mov     al,GRAF_BIT_MASK        ; leave it in AL
        !          1858:         out     dx,ax
        !          1859:         xchg    ah,[edi]                ; Set the bits
        !          1860: @@:
        !          1861:         inc     esi                     ; next glyph byte
        !          1862:         inc     edi                     ; next screen byte
        !          1863:         dec     ebx
        !          1864:         jnz     short xsgs2_xbms_loop
        !          1865: 
        !          1866:         add     esi,cjBytes             ; Next line of glyph
        !          1867:         add     edi,cScreenInc          ; advance screen pointer to next scan
        !          1868:         dec     cScanCount
        !          1869:         jnz     short xsgs2_xbms_next_scan; finish this scan
        !          1870:         sub     cl,8                    ; restore phase shift
        !          1871: 
        !          1872: xsgs2_xbms_exit:
        !          1873:         mov     ebx,cScreenInc
        !          1874:         retn
        !          1875: 
        !          1876: ;---------------------------Private-Routine------------------------------;
        !          1877: ; xgi2_scrn_gm_xbms
        !          1878: ;
        !          1879: ;   Draw a glyph to the reserved memory area.
        !          1880: ;
        !          1881: ; History:
        !          1882: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1883: ;   Created.
        !          1884: ;-----------------------------------------------------------------------;
        !          1885: 
        !          1886:         ALIGN 4
        !          1887: xgi2_scrn_gm_xbms_1scrn::
        !          1888:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1889: 
        !          1890:         ALIGN 4
        !          1891: xgi2_scrn_gm_xbms::
        !          1892:         mov     ebx,cScan               ; number of scans
        !          1893:         mov     edi,pjScreen            ; we will output to screen
        !          1894: 
        !          1895:         mov     edx,VGA_BASE + GRAF_ADDR ; Leave this in a register
        !          1896:         mov     al,GRAF_BIT_MASK
        !          1897:         out     dx,al                   ; leave GC Index pointing to Bit Mask
        !          1898:         inc     edx                     ; leave DX pointing to GC Data
        !          1899: 
        !          1900:         ALIGN 4
        !          1901: xsgm2_xbms_loop:
        !          1902:         mov     ax,[esi]                ; AH = glyph data
        !          1903:         rol     ax,cl                   ; Put usable glyph data in place
        !          1904:         and     al,ch
        !          1905:         jz      short @F                ; Don't waste time
        !          1906: 
        !          1907:         out     dx,al
        !          1908:         xchg    al,[edi]                ; Set the bits
        !          1909: 
        !          1910: @@:
        !          1911:         add     esi,cjBytes             ; Next line of glyph
        !          1912:         add     edi,ulNextScan          ; advance screen pointer to next scan
        !          1913:         dec     ebx
        !          1914:         jnz     short xsgm2_xbms_loop   ; finish column
        !          1915: 
        !          1916: xsgm2_xbms_update_ptr:
        !          1917:         inc     pjScreen                ; advance screen ptr
        !          1918:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          1919: 
        !          1920:         retn
        !          1921: 
        !          1922: ;*************************************************************************
        !          1923: ;
        !          1924: ;   The following routines handle opaque glyph opaque background to screen
        !          1925: ;
        !          1926: ;*************************************************************************
        !          1927: 
        !          1928: ;---------------------------Private-Routine------------------------------;
        !          1929: ; xgi1_scrn_g_obos
        !          1930: ;
        !          1931: ;   Draw an opaque glyph byte with opaque background to screen.
        !          1932: ;   If it's the 1st screen byte, adjust jump tables.
        !          1933: ;
        !          1934: ; History:
        !          1935: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          1936: ;   Created.
        !          1937: ;-----------------------------------------------------------------------;
        !          1938: 
        !          1939:         ALIGN 4
        !          1940: xgi1_scrn_g_obos_1scrn::
        !          1941:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          1942:         call    xgi_set_opaque_bkgnd    ; registers were never set
        !          1943: 
        !          1944:         ALIGN 4
        !          1945: xgi1_scrn_g_obos::
        !          1946:         push    ecx                     ; preserve phase info
        !          1947:         mov     eax,cLeadScan
        !          1948:         mov     ebx,cScanBlock          ; Scans to draw
        !          1949:         mov     ecx,ulNextScan          ; offset from one screen scan to next
        !          1950:         mov     edi,pjScreen            ; we are displaying the glyph
        !          1951:         mov     edx,cjBytes
        !          1952:         jmp     offset FLAT:xsg1_obos_dispatch[eax*4]; start at the correct location
        !          1953: 
        !          1954:         ALIGN 4
        !          1955: xsg1_obos_loop8:
        !          1956:         mov     al,[esi]
        !          1957:         add     esi,edx                 ; Next line of glyph
        !          1958:         mov     [edi],al
        !          1959:         add     edi,ecx                 ; next screen scan
        !          1960: 
        !          1961: xsg1_obos_loop7:
        !          1962:         mov     al,[esi]
        !          1963:         add     esi,edx                 ; Next line of glyph
        !          1964:         mov     [edi],al
        !          1965:         add     edi,ecx                 ; next screen scan
        !          1966: 
        !          1967: xsg1_obos_loop6:
        !          1968:         mov     al,[esi]
        !          1969:         add     esi,edx                 ; Next line of glyph
        !          1970:         mov     [edi],al
        !          1971:         add     edi,ecx                 ; next screen scan
        !          1972: 
        !          1973: xsg1_obos_loop5:
        !          1974:         mov     al,[esi]
        !          1975:         add     esi,edx                 ; Next line of glyph
        !          1976:         mov     [edi],al
        !          1977:         add     edi,ecx                 ; next screen scan
        !          1978: 
        !          1979: xsg1_obos_loop4:
        !          1980:         mov     al,[esi]
        !          1981:         add     esi,edx                 ; Next line of glyph
        !          1982:         mov     [edi],al
        !          1983:         add     edi,ecx                 ; next screen scan
        !          1984: 
        !          1985: xsg1_obos_loop3:
        !          1986:         mov     al,[esi]
        !          1987:         add     esi,edx                 ; Next line of glyph
        !          1988:         mov     [edi],al
        !          1989:         add     edi,ecx                 ; next screen scan
        !          1990: 
        !          1991: xsg1_obos_loop2:
        !          1992:         mov     al,[esi]
        !          1993:         add     esi,edx                 ; Next line of glyph
        !          1994:         mov     [edi],al
        !          1995:         add     edi,ecx                 ; next screen scan
        !          1996: 
        !          1997: xsg1_obos_loop1:
        !          1998:         mov     al,[esi]
        !          1999:         add     esi,edx                 ; Next line of glyph
        !          2000:         mov     [edi],al
        !          2001:         add     edi,ecx                 ; next screen scan
        !          2002: 
        !          2003:         dec     ebx
        !          2004:         jnz     short xsg1_obos_loop8   ; finish column
        !          2005: 
        !          2006: xsg1_obos_update_ptr:
        !          2007:         inc     pjGlyph                 ; advance glyph pointer
        !          2008:         inc     pjScreen                ; advance the display ptr
        !          2009: 
        !          2010:         pop     ecx                     ; restore phase info
        !          2011: 
        !          2012:         retn
        !          2013: 
        !          2014: ;---------------------------Private-Routine------------------------------;
        !          2015: ; xgi1_scrn_gs_obos
        !          2016: ;
        !          2017: ;   Draw opaque glyph bytes with opaque background to screen.
        !          2018: ;
        !          2019: ; History:
        !          2020: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2021: ;   Created.
        !          2022: ;-----------------------------------------------------------------------;
        !          2023: 
        !          2024:         ALIGN 4
        !          2025: xgi1_scrn_gs_obos::
        !          2026:         mov     edx,cjBytes
        !          2027: 
        !          2028:         ALIGN 4
        !          2029: xsgs1_obos_next_scan:
        !          2030:         mov     ecx,cInnerBytes         ; inner glyph byte
        !          2031:         rep     movsb
        !          2032:         add     esi,edx                 ; Next line of glyph
        !          2033:         add     edi,ebx                 ; Next scan on VGA
        !          2034:         dec     cScanCount
        !          2035:         jnz     short xsgs1_obos_next_scan ; finish column
        !          2036: 
        !          2037: xsgs1_obos_exit:
        !          2038:         retn
        !          2039: 
        !          2040: ;---------------------------Private-Routine------------------------------;
        !          2041: ; xgi1_scrn_gmb_obos
        !          2042: ;
        !          2043: ;   Draw an masked opaque glyph byte and bits from the reserved memory area
        !          2044: ;   with opaque background to screen.
        !          2045: ;
        !          2046: ; History:
        !          2047: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2048: ;   Created.
        !          2049: ;-----------------------------------------------------------------------;
        !          2050: 
        !          2051:         ALIGN 4
        !          2052: xgi1_scrn_gmb_obos::
        !          2053:         push    ebp                     ; remember stack frame pointer
        !          2054:         mov     eax,cLeadScan
        !          2055:         mov     edx,pjImage             ; along with bits saved in buffer
        !          2056:         mov     edi,pjScreen            ; we are displaying the glyph
        !          2057:         mov     ebx,ulNextScan          ; offset to next screen scan
        !          2058:         mov     eax,xsgmb1_obos_dispatch[eax*4]
        !          2059:         push    eax                     ; start at the correct location
        !          2060:         mov     ah,byte ptr cScanBlock  ; Number of scan blocks to draw
        !          2061:                                         ; ***2K scans max***
        !          2062:         mov     ebp,cjBytes             ; ** No parameter access beyond this **
        !          2063: 
        !          2064:         retn                            ;jump into unrolled loop
        !          2065: 
        !          2066:         ALIGN 4
        !          2067: xsgmb1_obos_loop8:
        !          2068:         mov     al,[esi]
        !          2069:         add     esi,ebp                 ; Next line of glyph
        !          2070:         rol     al,cl                   ; Put usable glyph data in place
        !          2071:         and     al,ch
        !          2072:         or      al,[edx]
        !          2073:         mov     [edi],al
        !          2074:         add     edi,ebx
        !          2075: 
        !          2076: xsgmb1_obos_loop7:
        !          2077:         mov     al,[esi]
        !          2078:         add     esi,ebp                 ; Next line of glyph
        !          2079:         rol     al,cl                   ; Put usable glyph data in place
        !          2080:         and     al,ch
        !          2081:         or      al,[edx][1]
        !          2082:         mov     [edi],al
        !          2083:         add     edi,ebx
        !          2084: 
        !          2085: xsgmb1_obos_loop6:
        !          2086:         mov     al,[esi]
        !          2087:         add     esi,ebp                 ; Next line of glyph
        !          2088:         rol     al,cl                   ; Put usable glyph data in place
        !          2089:         and     al,ch
        !          2090:         or      al,[edx][2]
        !          2091:         mov     [edi],al
        !          2092:         add     edi,ebx
        !          2093: 
        !          2094: xsgmb1_obos_loop5:
        !          2095:         mov     al,[esi]
        !          2096:         add     esi,ebp                 ; Next line of glyph
        !          2097:         rol     al,cl                   ; Put usable glyph data in place
        !          2098:         and     al,ch
        !          2099:         or      al,[edx][3]
        !          2100:         mov     [edi],al
        !          2101:         add     edi,ebx
        !          2102:         add     edx,4
        !          2103: 
        !          2104: xsgmb1_obos_loop4:
        !          2105:         mov     al,[esi]
        !          2106:         add     esi,ebp                 ; Next line of glyph
        !          2107:         rol     al,cl                   ; Put usable glyph data in place
        !          2108:         and     al,ch
        !          2109:         or      al,[edx]
        !          2110:         mov     [edi],al
        !          2111:         add     edi,ebx
        !          2112: 
        !          2113: xsgmb1_obos_loop3:
        !          2114:         mov     al,[esi]
        !          2115:         add     esi,ebp                 ; Next line of glyph
        !          2116:         rol     al,cl                   ; Put usable glyph data in place
        !          2117:         and     al,ch
        !          2118:         or      al,[edx][1]
        !          2119:         mov     [edi],al
        !          2120:         add     edi,ebx
        !          2121: 
        !          2122: xsgmb1_obos_loop2:
        !          2123:         mov     al,[esi]
        !          2124:         add     esi,ebp                 ; Next line of glyph
        !          2125:         rol     al,cl                   ; Put usable glyph data in place
        !          2126:         and     al,ch
        !          2127:         or      al,[edx][2]
        !          2128:         mov     [edi],al
        !          2129:         add     edi,ebx
        !          2130: 
        !          2131: xsgmb1_obos_loop1:
        !          2132:         mov     al,[esi]
        !          2133:         add     esi,ebp                 ; Next line of glyph
        !          2134:         rol     al,cl                   ; Put usable glyph data in place
        !          2135:         and     al,ch
        !          2136:         or      al,[edx][3]
        !          2137:         mov     [edi],al
        !          2138:         add     edi,ebx
        !          2139:         add     edx,4
        !          2140: 
        !          2141:         dec     ah
        !          2142:         jnz     xsgmb1_obos_loop8       ; finish column
        !          2143: 
        !          2144:         pop     ebp                     ; ** Parameter can be accessed ********
        !          2145: 
        !          2146: xsgmb1_obos_update_ptr:
        !          2147:         inc     pjScreen
        !          2148: 
        !          2149: xsgmb1_obos_exit:
        !          2150:         retn
        !          2151: 
        !          2152: ;---------------------------Private-Routine------------------------------;
        !          2153: ; xgi2_scrn_g_obos
        !          2154: ;
        !          2155: ;   Draw an opaque glyph byte (2-fetch) with opaque background to screen.
        !          2156: ;   If it's the 1st screen byte, adjust jump tables.
        !          2157: ;
        !          2158: ; History:
        !          2159: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2160: ;   Created.
        !          2161: ;-----------------------------------------------------------------------;
        !          2162: 
        !          2163:         ALIGN 4
        !          2164: xgi2_scrn_g_obos_1scrn::
        !          2165:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          2166:         call    xgi_set_opaque_bkgnd
        !          2167: 
        !          2168:         ALIGN 4
        !          2169: xgi2_scrn_g_obos::
        !          2170:         push    ebp                     ; remember stack frame pointer
        !          2171:         mov     eax,cLeadScan
        !          2172:         mov     ebx,cScanBlock          ; Scans to draw
        !          2173:         mov     edi,pjScreen            ; we are displaying the glyph
        !          2174:         mov     edx,cjBytes             ; glyph distance to next scan
        !          2175:         mov     ebp,ulNextScan          ; distance from one scan to next
        !          2176:                                         ; ***stack frame unavailable***
        !          2177:         jmp     offset FLAT:xsg2_obos_dispatch[eax*4]; start at the correct location
        !          2178: 
        !          2179:         ALIGN 4
        !          2180: xsg2_obos_loop8:
        !          2181:         mov     ax,[esi]
        !          2182:         add     esi,edx                 ; Next line of glyph
        !          2183:         rol     ax,cl
        !          2184:         mov     [edi],al
        !          2185:         add     edi,ebp
        !          2186: 
        !          2187: xsg2_obos_loop7:
        !          2188:         mov     ax,[esi]
        !          2189:         add     esi,edx                 ; Next line of glyph
        !          2190:         rol     ax,cl
        !          2191:         mov     [edi],al
        !          2192:         add     edi,ebp
        !          2193: 
        !          2194: xsg2_obos_loop6:
        !          2195:         mov     ax,[esi]
        !          2196:         add     esi,edx                 ; Next line of glyph
        !          2197:         rol     ax,cl
        !          2198:         mov     [edi],al
        !          2199:         add     edi,ebp
        !          2200: 
        !          2201: xsg2_obos_loop5:
        !          2202:         mov     ax,[esi]
        !          2203:         add     esi,edx                 ; Next line of glyph
        !          2204:         rol     ax,cl
        !          2205:         mov     [edi],al
        !          2206:         add     edi,ebp
        !          2207: 
        !          2208: xsg2_obos_loop4:
        !          2209:         mov     ax,[esi]
        !          2210:         add     esi,edx                 ; Next line of glyph
        !          2211:         rol     ax,cl
        !          2212:         mov     [edi],al
        !          2213:         add     edi,ebp
        !          2214: 
        !          2215: xsg2_obos_loop3:
        !          2216:         mov     ax,[esi]
        !          2217:         add     esi,edx                 ; Next line of glyph
        !          2218:         rol     ax,cl
        !          2219:         mov     [edi],al
        !          2220:         add     edi,ebp
        !          2221: 
        !          2222: xsg2_obos_loop2:
        !          2223:         mov     ax,[esi]
        !          2224:         add     esi,edx                 ; Next line of glyph
        !          2225:         rol     ax,cl
        !          2226:         mov     [edi],al
        !          2227:         add     edi,ebp
        !          2228: 
        !          2229: xsg2_obos_loop1:
        !          2230:         mov     ax,[esi]
        !          2231:         add     esi,edx                 ; Next line of glyph
        !          2232:         rol     ax,cl
        !          2233:         mov     [edi],al
        !          2234:         add     edi,ebp
        !          2235: 
        !          2236:         dec     ebx
        !          2237:         jnz     short xsg2_obos_loop8   ; finish column
        !          2238: 
        !          2239:         pop     ebp                     ; restore stack frame pointer
        !          2240:                                         ; ***stack frame available***
        !          2241: xsg2_obos_update_ptr:
        !          2242:         inc     pjScreen                ; advance screen ptr
        !          2243:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          2244: 
        !          2245:         retn
        !          2246: 
        !          2247: ;---------------------------Private-Routine------------------------------;
        !          2248: ; xgi2_scrn_gs_obos
        !          2249: ;
        !          2250: ;   Draw multiple opaque glyph bytes (2-fetch) with opaque background to
        !          2251: ;   screen. If it's the 1st screen byte, adjust jump tables.
        !          2252: ;
        !          2253: ; History:
        !          2254: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2255: ;   Created.
        !          2256: ;-----------------------------------------------------------------------;
        !          2257: 
        !          2258:         ALIGN 4
        !          2259: xgi2_scrn_gs_obos::
        !          2260: xsgs2_obos_next_scan:
        !          2261:         mov     edx,cInnerBytes         ; inner glyph byte
        !          2262: 
        !          2263:         ALIGN 4
        !          2264: xsgs2_obos_loop:
        !          2265:         mov     ax,[esi]
        !          2266:         rol     ax,cl
        !          2267:         stosb
        !          2268:         inc     esi
        !          2269:         dec     edx
        !          2270:         jnz     short xsgs2_obos_loop
        !          2271: 
        !          2272:         add     esi,cjBytes             ; Next line of glyph
        !          2273:         add     edi,ebx                 ; Next scan on VGA
        !          2274:         dec     cScanCount
        !          2275:         jnz     short xsgs2_obos_next_scan ; finish column
        !          2276: 
        !          2277: xsgs2_obos_exit:
        !          2278:         retn
        !          2279: 
        !          2280: ;---------------------------Private-Routine------------------------------;
        !          2281: ; xgi1_scrn_gm_obos
        !          2282: ;
        !          2283: ;   Draw a masked opaque glyph byte with opaque background to
        !          2284: ;   screen. If it's the 1st screen byte, adjust jump tables.
        !          2285: ;
        !          2286: ; History:
        !          2287: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2288: ;   Created.
        !          2289: ;-----------------------------------------------------------------------;
        !          2290: 
        !          2291:         ALIGN 4
        !          2292: xgi1_scrn_gm_obos_1scrn::
        !          2293:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          2294:         call    xgi1_scrn_gm_obos
        !          2295:         jmp     xgi_set_opaque_bkgnd_test_full_byte
        !          2296: 
        !          2297:         ALIGN 4
        !          2298: xgi1_scrn_gm_obos_lg::
        !          2299:         test    ch,1                    ; if there is a right bitmask
        !          2300:         jz      short xgi1_scrn_gm_obos ; set up VGA regs
        !          2301:         inc     cInnerBytes             ; otherwise, include it in the middle
        !          2302:         retn
        !          2303: 
        !          2304:         ALIGN 4
        !          2305: xgi1_scrn_gm_obos::
        !          2306: 
        !          2307: ; Setup bit mask and stuff.
        !          2308: 
        !          2309:         call    xgi_setup_opaque_bkgnd_edge
        !          2310: 
        !          2311: ; The following AND leaves 1 bits in AH for the planes which
        !          2312: ; CANNOT be done on the second pass.  So if this is zero we can
        !          2313: ; skip the first pass.
        !          2314: 
        !          2315:         and     ah,bl                   ; BL = BkColor = color where data is 1
        !          2316:         or      ah,bl                   ; planes to enable
        !          2317:         jz      short xsgm1_obos_skip_first_pass
        !          2318:         or      al,ah                   ; Include "Set/Reset" planes.
        !          2319:         out     dx,al                   ; Enable planes for first pass.
        !          2320: 
        !          2321:         push    eax
        !          2322:         mov     ebx,cScan
        !          2323: 
        !          2324:         ALIGN 4
        !          2325: xsgm1_obos_first_pass:
        !          2326:         mov     al,[esi]
        !          2327:         rol     al,cl                   ; Put usable glyph data in place
        !          2328:         xchg    al,[edi]
        !          2329:         add     esi,cjBytes
        !          2330:         add     edi,ulNextScan
        !          2331:         dec     ebx
        !          2332:         jnz     short xsgm1_obos_first_pass
        !          2333: 
        !          2334:         pop     eax
        !          2335:         mov     esi,pjGlyph             ; restore the glyph pointer
        !          2336:         mov     edi,pjScreen            ; restore the screen pointer
        !          2337: 
        !          2338:         ALIGN 4
        !          2339: xsgm1_obos_skip_first_pass:
        !          2340: 
        !          2341: ; Enable the other planes.
        !          2342: 
        !          2343:         not     ah
        !          2344:         and     ah,MM_ALL
        !          2345:         jz      short xsgm1_obos_no_planes_left
        !          2346:         mov     al,ah
        !          2347:         out     dx,al
        !          2348:         mov     ebx,cScan
        !          2349: 
        !          2350:         ALIGN 4
        !          2351: xsgm1_obos_second_pass:
        !          2352:         mov     al,[esi]
        !          2353:         rol     al,cl                   ; Put usable glyph data in place
        !          2354:         not     al
        !          2355:         xchg    al,[edi]
        !          2356:         add     esi,cjBytes
        !          2357:         add     edi,ulNextScan
        !          2358:         dec     ebx
        !          2359:         jnz     short xsgm1_obos_second_pass
        !          2360: 
        !          2361:         ALIGN 4
        !          2362: xsgm1_obos_no_planes_left:
        !          2363:         mov     al,MM_ALL
        !          2364:         out     dx,al
        !          2365: 
        !          2366: xsgm1_obos_exit:
        !          2367:         sub     bl,cl                   ; if phase aligned, CY = 0
        !          2368:         cmc                             ; if phase aligned, CY = 1
        !          2369:         adc     pjGlyph,0               ; if phase aligned, advance glyph ptr
        !          2370:         inc     pjScreen                ; advance the display ptr
        !          2371:         retn                            ; no need to restore anything
        !          2372: 
        !          2373: ;---------------------------Private-Routine------------------------------;
        !          2374: ; xgi2_scrn_gm_obos
        !          2375: ;
        !          2376: ;   Draw a masked opaque glyph bytes (2-fetch) with opaque background to
        !          2377: ;   screen. If it's the 1st screen byte, adjust jump tables.
        !          2378: ;
        !          2379: ; History:
        !          2380: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2381: ;   Created.
        !          2382: ;-----------------------------------------------------------------------;
        !          2383: 
        !          2384:         ALIGN 4
        !          2385: xgi2_scrn_gm_obos_1scrn::
        !          2386:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          2387:         call    xgi2_scrn_gm_obos
        !          2388:         jmp     xgi_set_opaque_bkgnd_test_full_byte
        !          2389: 
        !          2390:         ALIGN 4
        !          2391: xgi2_scrn_gm_obos_lg::
        !          2392:         test    ch,1                    ; if there is a right bitmask
        !          2393:         jz      short xgi2_scrn_gm_obos ; set up VGA regs
        !          2394:         inc     cInnerBytes             ; otherwise, include it in the middle
        !          2395:         retn
        !          2396: 
        !          2397:         ALIGN 4
        !          2398: xgi2_scrn_gm_obos::
        !          2399: 
        !          2400: ; Setup bit mask and stuff.
        !          2401: 
        !          2402:         call    xgi_setup_opaque_bkgnd_edge
        !          2403: 
        !          2404: ; The following AND leaves 1 bits in AH for the planes which
        !          2405: ; CANNOT be done on the second pass.  So if this is zero we can
        !          2406: ; skip the first pass.
        !          2407: 
        !          2408:         and     ah,bl                   ; BL = BkColor = color where data is 1
        !          2409:         or      ah,bl                   ; planes to enable
        !          2410:         jz      short xsgm2_obos_skip_first_pass
        !          2411:         or      al,ah                   ; Include "Set/Reset" planes.
        !          2412:         out     dx,al                   ; Enable planes for first pass.
        !          2413: 
        !          2414:         push    eax
        !          2415:         mov     ebx,cScan
        !          2416: 
        !          2417:         ALIGN 4
        !          2418: xsgm2_obos_first_pass:
        !          2419:         mov     ax,[esi]
        !          2420:         rol     ax,cl                   ; Put usable glyph data in place
        !          2421:         xchg    al,[edi]
        !          2422:         add     esi,cjBytes
        !          2423:         add     edi,ulNextScan
        !          2424:         dec     ebx
        !          2425:         jnz     short xsgm2_obos_first_pass
        !          2426: 
        !          2427:         pop     eax
        !          2428:         mov     esi,pjGlyph             ; restore the glyph pointer
        !          2429:         mov     edi,pjScreen            ; restore the screen pointer
        !          2430: 
        !          2431:         ALIGN 4
        !          2432: xsgm2_obos_skip_first_pass:
        !          2433: 
        !          2434: ; Enable the other planes.
        !          2435: 
        !          2436:         not     ah
        !          2437:         and     ah,MM_ALL
        !          2438:         jz      short xsgm2_obos_no_planes_left
        !          2439:         mov     al,ah
        !          2440:         out     dx,al
        !          2441:         mov     ebx,cScan
        !          2442: 
        !          2443:         ALIGN 4
        !          2444: xsgm2_obos_second_pass:
        !          2445:         mov     ax,[esi]
        !          2446:         rol     ax,cl                   ; Put usable glyph data in place
        !          2447:         not     al
        !          2448:         xchg    al,[edi]
        !          2449:         add     esi,cjBytes
        !          2450:         add     edi,ulNextScan
        !          2451:         dec     ebx
        !          2452:         jnz     short xsgm2_obos_second_pass
        !          2453: 
        !          2454:         ALIGN 4
        !          2455: xsgm2_obos_no_planes_left:
        !          2456:         mov     al,MM_ALL
        !          2457:         out     dx,al
        !          2458: 
        !          2459: xsgm2_obos_exit:
        !          2460:         inc     pjScreen                ; advance the display ptr
        !          2461:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          2462:         retn                            ; no need to restore anything
        !          2463: 
        !          2464: 
        !          2465: ;---------------------------Private-Routine------------------------------;
        !          2466: ; xgi1_scrn_gmb_obos_1st_scrn
        !          2467: ;
        !          2468: ;   Draw a masked opaque glyph byte and bits in reserved buffer with
        !          2469: ;   opaque background to the 1st screen byte.
        !          2470: ;
        !          2471: ; History:
        !          2472: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2473: ;   Created.
        !          2474: ;-----------------------------------------------------------------------;
        !          2475: 
        !          2476:         ALIGN 4
        !          2477: xgi1_scrn_gmb_obos_1scrn::
        !          2478:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          2479: 
        !          2480: ; Here we need to setup the bitmask including those in buffer. It can be
        !          2481: ; calculated here from the x starting point.
        !          2482: 
        !          2483:         ALIGN 4
        !          2484: xgmb1_obos_1scrn_bitmask:
        !          2485:         xor     bh,bh                   ; we use and clear
        !          2486:         xchg    bh,fjOBOSMask           ; the acculmulated mask
        !          2487:         or      bh,ch                   ; also include the current mask
        !          2488:         jns     short xsgmb1_call_obos_edge  ; there is really a mask
        !          2489:         call    xgi_set_opaque_bkgnd    ; no mask, treat it as a full byte
        !          2490:         jmp     xgi1_scrn_gmb_obos
        !          2491: 
        !          2492:         ALIGN 4
        !          2493: xsgmb1_call_obos_edge:
        !          2494:         call    xsgmb1_obos_edge
        !          2495:         jmp     xgi_set_opaque_bkgnd_test_full_byte
        !          2496: 
        !          2497: ;---------------------------Private-Routine------------------------------;
        !          2498: ; xgi1_scrn_gmb_obos_last_glyph
        !          2499: ;
        !          2500: ;   Draw a masked opaque byte from the last glyph and bits in reserved
        !          2501: ;   buffer with opaque background to the screen.
        !          2502: ;
        !          2503: ; History:
        !          2504: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2505: ;   Created.
        !          2506: ;-----------------------------------------------------------------------;
        !          2507: 
        !          2508:         ALIGN 4
        !          2509: xgi1_scrn_gmb_obos_lg::
        !          2510:         xor     bh,bh
        !          2511:         xchg    bh,fjOBOSMask           ; use and clear the accumulated mask
        !          2512:         or      bh,ch                   ; plus the current mask
        !          2513:         inc     bh                      ; if mask is all 1s
        !          2514:         jnz     short @F
        !          2515:         call    xgi_set_opaque_bkgnd    ; treat it as a full byte
        !          2516:         jmp     xgi1_scrn_gmb_obos
        !          2517: @@:
        !          2518:         dec     bh
        !          2519:         call    xsgmb1_obos_edge        ; draw this first byte
        !          2520:         cmp     cInnerBytes,0           ; last glyph has full middle bytes?
        !          2521:         jz      short @F                ; no, then get out
        !          2522:         call    xgi_set_opaque_bkgnd    ; set the full byte
        !          2523: @@:
        !          2524:         retn
        !          2525: 
        !          2526: ;---------------------------Private-Routine------------------------------;
        !          2527: ; xgi1_scrn_gmb_obos_edge
        !          2528: ;
        !          2529: ;   Draw a masked opaque glyph byte and bits in reserved
        !          2530: ;   buffer with opaque background to the screen.
        !          2531: ;
        !          2532: ; History:
        !          2533: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2534: ;   Created.
        !          2535: ;-----------------------------------------------------------------------;
        !          2536: 
        !          2537:         ALIGN 4
        !          2538: xsgmb1_obos_edge:
        !          2539:         xchg    ch,bh                   ; set with the accumulated mask
        !          2540:         call    xgi_setup_opaque_bkgnd_edge
        !          2541:         xchg    ch,bh                   ; restore the current byte mask
        !          2542: 
        !          2543: ; The following AND leaves 1 bits in AH for the planes which
        !          2544: ; CANNOT be done on the second pass.  So if this is zero we can
        !          2545: ; skip the first pass.
        !          2546: 
        !          2547:         and     ah,bl                   ; BL = BkColor = color where data is 1
        !          2548:         or      ah,bl                   ; planes to enable
        !          2549:         jz      short xsgmbe1_obos_skip_first_pass
        !          2550:         or      al,ah                   ; Include "Set/Reset" planes.
        !          2551:         out     dx,al                   ; Enable planes for first pass.
        !          2552: 
        !          2553:         push    eax
        !          2554:         mov     ebx,cScan
        !          2555:         mov     edx,pjImage
        !          2556:         add     edx,cBufferOffset
        !          2557: 
        !          2558:         ALIGN 4
        !          2559: xsgmbe1_obos_first_pass:
        !          2560:         mov     al,[esi]
        !          2561:         rol     al,cl                   ; Put usable glyph data in place
        !          2562:         and     al,ch
        !          2563:         or      al,[edx]
        !          2564:         xchg    al,[edi]
        !          2565:         add     esi,cjBytes
        !          2566:         add     edi,ulNextScan
        !          2567:         inc     edx
        !          2568:         dec     ebx
        !          2569:         jnz     short xsgmbe1_obos_first_pass
        !          2570: 
        !          2571:         pop     eax
        !          2572:         mov     esi,pjGlyph             ; restore the glyph pointer
        !          2573:         mov     edi,pjScreen            ; restore the screen pointer
        !          2574:         mov     dx,VGA_BASE + SEQ_DATA  ; The rest of the OUTs are here.
        !          2575: 
        !          2576:         ALIGN 4
        !          2577: xsgmbe1_obos_skip_first_pass:
        !          2578: 
        !          2579: ; Enable the other planes.
        !          2580: 
        !          2581:         not     ah
        !          2582:         and     ah,MM_ALL
        !          2583:         jz      short xsgmbe1_obos_no_planes_left
        !          2584:         mov     al,ah
        !          2585:         out     dx,al
        !          2586:         mov     ebx,cScan
        !          2587:         mov     edx,pjImage
        !          2588:         add     edx,cBufferOffset
        !          2589: 
        !          2590:         ALIGN 4
        !          2591: xsgmbe1_obos_second_pass:
        !          2592:         mov     al,[esi]
        !          2593:         rol     al,cl                   ; Put usable glyph data in place
        !          2594:         and     al,ch
        !          2595:         or      al,[edx]
        !          2596:         not     al
        !          2597:         xchg    al,[edi]
        !          2598:         add     esi,cjBytes
        !          2599:         add     edi,ulNextScan
        !          2600:         inc     edx
        !          2601:         dec     ebx
        !          2602:         jnz     short xsgmbe1_obos_second_pass
        !          2603:         mov     dx,VGA_BASE + SEQ_DATA  ; The rest of the OUTs are here.
        !          2604: 
        !          2605:         ALIGN 4
        !          2606: xsgmbe1_obos_no_planes_left:
        !          2607:         mov     al,MM_ALL
        !          2608:         out     dx,al
        !          2609: 
        !          2610: xsgmbe1_obos_exit:
        !          2611:         sub     bl,cl                   ; if phase aligned, CY = 0
        !          2612:         cmc                             ; if phase aligned, CY = 1
        !          2613:         adc     pjGlyph,0               ; if phase aligned, advance glyph ptr
        !          2614:         inc     pjScreen                ; advance the display ptr
        !          2615:         retn
        !          2616: 
        !          2617: ;---------------------------Private-Routine------------------------------;
        !          2618: ; xgi_set_opaque_bkgnd_edge
        !          2619: ;
        !          2620: ;   Set the VGA registers for drawing a masked screen byte with opaque
        !          2621: ;   glyph and opaque background.
        !          2622: ;
        !          2623: ; History:
        !          2624: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2625: ;   Created.
        !          2626: ;-----------------------------------------------------------------------;
        !          2627: 
        !          2628:         ALIGN 4
        !          2629: xgi_setup_opaque_bkgnd_edge::
        !          2630: 
        !          2631:         mov     edi,pjScreen            ; screen pointer
        !          2632:         mov     dx,VGA_BASE + GRAF_ADDR
        !          2633:         mov     ax,GRAF_DATA_ROT + 256 * DR_SET
        !          2634:         out     dx,ax
        !          2635:         mov     ah,ch                   ; put mask in AH
        !          2636:         mov     al,GRAF_BIT_MASK
        !          2637:         out     dx,ax
        !          2638: 
        !          2639: ; Put foreground color in Set/Reset and enable planes where colors
        !          2640: ; match.
        !          2641: 
        !          2642:         mov     ah,byte ptr (iBackClr)
        !          2643:         mov     bl,byte ptr (iForeClr)
        !          2644:         mov     al,GRAF_SET_RESET
        !          2645:         out     dx,ax
        !          2646:         xor     ah,bl
        !          2647:         not     ah                      ; gives 1 where colors match
        !          2648:         mov     al,GRAF_ENAB_SR
        !          2649:         out     dx,ax
        !          2650:         mov     dx,VGA_BASE + SEQ_DATA  ; The rest of the OUTs are here.
        !          2651:         mov     al,ah
        !          2652:         not     ah                      ; Gives 1 where colors mismatch.
        !          2653:         retn
        !          2654: 
        !          2655: ;---------------------------Private-Routine------------------------------;
        !          2656: ; xgi_set_opaque_bkgnd
        !          2657: ;
        !          2658: ;   Set the VGA registers for drawing a full screen byte with opaque
        !          2659: ;   glyph and opaque background.
        !          2660: ;
        !          2661: ; History:
        !          2662: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2663: ;   Created.
        !          2664: ;-----------------------------------------------------------------------;
        !          2665: 
        !          2666:         ALIGN 4
        !          2667: xgi_set_opaque_bkgnd_test_full_byte::
        !          2668:         mov     edi,prcl
        !          2669:         mov     edx,[edi].xLeft
        !          2670:         mov     eax,[edi].xRight
        !          2671:         sub     eax,edx                 ; EAX = display area width
        !          2672:         neg     edx
        !          2673:         and     edx,7                   ; EDX = bits in left partial byte
        !          2674:         sub     eax,edx
        !          2675:         shr     eax,3                   ; EAX = inner full bytes
        !          2676:         jnz     short xgi_set_opaque_bkgnd
        !          2677:         retn                            ; there'll be no full byte
        !          2678: 
        !          2679:         ALIGN 4
        !          2680: xgi_set_opaque_bkgnd::
        !          2681: 
        !          2682:         mov     dx,VGA_BASE + GRAF_ADDR
        !          2683:         mov     ax,(DR_SET shl 8) + GRAF_DATA_ROT
        !          2684:         out     dx,ax
        !          2685: 
        !          2686: ; First we put the foreground color into the latches.  We do this
        !          2687: ; by putting this color into SET_RESET, writing it, then reading it.
        !          2688: ; The memory location we will use is the first byte where we will blt.
        !          2689: 
        !          2690:         mov     ah,byte ptr iBackClr    ; for appropriate color
        !          2691:         mov     al,GRAF_SET_RESET
        !          2692:         out     dx,ax
        !          2693:         mov     ax,0F00h + GRAF_ENAB_SR
        !          2694:         out     dx,ax
        !          2695: 
        !          2696: ; Set bit mask = FF.
        !          2697:         mov     ax,0FF00h + GRAF_BIT_MASK
        !          2698:         out     dx,ax
        !          2699: 
        !          2700: ; Fill the latches.
        !          2701:         mov     edi,pjScreen            ; we will overwrite this byte anyway
        !          2702:         mov     [edi],al                ; color in SetReset is written, not AL
        !          2703:         mov     al,[edi]                ; read to fill latches
        !          2704: 
        !          2705: ; Go to XOR mode.
        !          2706:         mov     ax,GRAF_DATA_ROT + 256 * DR_XOR
        !          2707:         out     dx,ax
        !          2708: 
        !          2709: ; Now setup SET_RESET.
        !          2710: 
        !          2711:         mov     ah,byte ptr iBackClr    ; for appropriate color
        !          2712:         xor     ah,byte ptr iForeClr    ; gives 0 where colors match
        !          2713:         mov     al,GRAF_SET_RESET
        !          2714:         out     dx,ax
        !          2715:         not     ah
        !          2716:         mov     al,GRAF_ENAB_SR
        !          2717:         out     dx,ax                   ; enable Set/Reset where colors match
        !          2718: 
        !          2719: sob_exit:
        !          2720:         retn
        !          2721: 
        !          2722: IFNDEF  GMB_2_FETCH_POSSIBLE
        !          2723: 
        !          2724: ;*****************************************************************************
        !          2725: ;
        !          2726: ;   We claim that when we are displaying a glyph image plus bits saved in the
        !          2727: ;   memory buffer, we will never need to fetch 2 bytes from the current glyph
        !          2728: ;   because we will never need more than 8 bits from the current glyph.
        !          2729: ;
        !          2730: ;*****************************************************************************
        !          2731: 
        !          2732: xgi2_scrn_gmb::
        !          2733: 
        !          2734: if      DBG
        !          2735:         int     3
        !          2736: endif;  DBG
        !          2737: 
        !          2738:         retn
        !          2739: 
        !          2740: ELSE    ;GMB_2_FETCH_POSSIBLE
        !          2741: 
        !          2742: ;---------------------------Private-Routine------------------------------;
        !          2743: ; xgi2_scrn_gmb_xbos
        !          2744: ;
        !          2745: ;   Draw a glyph to the reserved memory area.
        !          2746: ;
        !          2747: ; History:
        !          2748: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2749: ;   Created.
        !          2750: ;-----------------------------------------------------------------------;
        !          2751: 
        !          2752:         ALIGN 4
        !          2753: xgi2_scrn_gmb_xbos_1scrn::
        !          2754:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          2755: 
        !          2756:         ALIGN 4
        !          2757: xgi2_scrn_gmb_xbos::
        !          2758:         mov     eax,cLeadScan
        !          2759:         mov     edx,pjImage             ; access bits saved in buffer
        !          2760:         mov     edi,pjScreen            ; we will output to screen
        !          2761:         mov     eax,xsgmb2_xbos_dispatch[eax*4] ; start at the correct location
        !          2762:         push    eax
        !          2763:         mov     eax,cScanBlock          ; Number of scan blocks to draw
        !          2764:         shl     eax,16                  ; put count in high word of EAX
        !          2765:                                         ; ***64K scan lines max***
        !          2766:         mov     ebx,ulNextScan          ; distance from one screen scan to next
        !          2767:         push    ebp                     ; remember stack frame pointer
        !          2768:         mov     ebp,cjBytes             ; distance to next glyph scan
        !          2769:                                         ; ***stack frame not available***
        !          2770:         retn                            ; branch into unrolled loop
        !          2771: 
        !          2772:         ALIGN 4
        !          2773: xsgmb2_xbos_loop8:
        !          2774:         mov     ax,[esi]                ; get the glyph byte
        !          2775:         add     esi,ebp                 ; Next line of glyph
        !          2776:         rol     ax,cl                   ; Put usable glyph data in place
        !          2777:         and     al,ch
        !          2778:         or      al,[edx]
        !          2779:         jz      short @F
        !          2780:         xchg    [edi],al
        !          2781: @@:
        !          2782:         add     edi,ebx                 ; point to next screen scan
        !          2783: 
        !          2784: xsgmb2_xbos_loop7:
        !          2785:         mov     ax,[esi]                ; get the glyph byte
        !          2786:         add     esi,ebp                 ; Next line of glyph
        !          2787:         rol     ax,cl                   ; Put usable glyph data in place
        !          2788:         and     al,ch
        !          2789:         or      al,[edx][1]
        !          2790:         jz      short @F
        !          2791:         xchg    [edi],al
        !          2792: @@:
        !          2793:         add     edi,ebx                 ; point to next screen scan
        !          2794: 
        !          2795: xsgmb2_xbos_loop6:
        !          2796:         mov     ax,[esi]                ; get the glyph byte
        !          2797:         add     esi,ebp                 ; Next line of glyph
        !          2798:         rol     ax,cl                   ; Put usable glyph data in place
        !          2799:         and     al,ch
        !          2800:         or      al,[edx][2]
        !          2801:         jz      short @F
        !          2802:         xchg    [edi],al
        !          2803: @@:
        !          2804:         add     edi,ebx                 ; point to next screen scan
        !          2805: 
        !          2806: xsgmb2_xbos_loop5:
        !          2807:         mov     ax,[esi]                ; get the glyph byte
        !          2808:         add     esi,ebp                 ; Next line of glyph
        !          2809:         rol     ax,cl                   ; Put usable glyph data in place
        !          2810:         and     al,ch
        !          2811:         or      al,[edx][3]
        !          2812:         jz      short @F
        !          2813:         xchg    [edi],al
        !          2814: @@:
        !          2815:         add     edi,ebx                 ; point to next screen scan
        !          2816:         add     edx,4
        !          2817: 
        !          2818: xsgmb2_xbos_loop4:
        !          2819:         mov     ax,[esi]                ; get the glyph byte
        !          2820:         add     esi,ebp                 ; Next line of glyph
        !          2821:         rol     ax,cl                   ; Put usable glyph data in place
        !          2822:         and     al,ch
        !          2823:         or      al,[edx]
        !          2824:         jz      short @F
        !          2825:         xchg    [edi],al
        !          2826: @@:
        !          2827:         add     edi,ebx                 ; point to next screen scan
        !          2828: 
        !          2829: xsgmb2_xbos_loop3:
        !          2830:         mov     ax,[esi]                ; get the glyph byte
        !          2831:         add     esi,ebp                 ; Next line of glyph
        !          2832:         rol     ax,cl                   ; Put usable glyph data in place
        !          2833:         and     al,ch
        !          2834:         or      al,[edx][1]
        !          2835:         jz      short @F
        !          2836:         xchg    [edi],al
        !          2837: @@:
        !          2838:         add     edi,ebx                 ; point to next screen scan
        !          2839: 
        !          2840: xsgmb2_xbos_loop2:
        !          2841:         mov     ax,[esi]                ; get the glyph byte
        !          2842:         add     esi,ebp                 ; Next line of glyph
        !          2843:         rol     ax,cl                   ; Put usable glyph data in place
        !          2844:         and     al,ch
        !          2845:         or      al,[edx][2]
        !          2846:         jz      short @F
        !          2847:         xchg    [edi],al
        !          2848: @@:
        !          2849:         add     edi,ebx                 ; point to next screen scan
        !          2850: 
        !          2851: xsgmb2_xbos_loop1:
        !          2852:         mov     ax,[esi]                ; get the glyph byte
        !          2853:         add     esi,ebp                 ; Next line of glyph
        !          2854:         rol     ax,cl                   ; Put usable glyph data in place
        !          2855:         and     al,ch
        !          2856:         or      al,[edx][3]
        !          2857:         jz      short @F
        !          2858:         xchg    [edi],al
        !          2859: @@:
        !          2860:         add     edi,ebx                 ; point to next screen scan
        !          2861:         add     edx,4
        !          2862: 
        !          2863:         and     eax,0ffff0000h
        !          2864:         sub     eax,000010000h
        !          2865:         jnz     short xsgmb2_xbos_loop8 ; finish column
        !          2866: 
        !          2867:         pop     ebp                     ; ***stack frame available***
        !          2868: 
        !          2869: xsgmb2_xbos_update_ptr:
        !          2870:         inc     pjScreen                ; advance screen ptr
        !          2871:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          2872: 
        !          2873:         retn
        !          2874: 
        !          2875: 
        !          2876: ;---------------------------Private-Routine------------------------------;
        !          2877: ; xgi2_scrn_gmb_obos
        !          2878: ;
        !          2879: ;   Draw a masked opaque glyph bytes (2-fetch) and bits from reserved
        !          2880: ;   memory area with opaque background to screen.
        !          2881: ;
        !          2882: ; History:
        !          2883: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2884: ;   Created.
        !          2885: ;-----------------------------------------------------------------------;
        !          2886: 
        !          2887:         ALIGN 4
        !          2888: xgi2_scrn_gmb_obos::
        !          2889:         mov     eax,cLeadScan
        !          2890:         mov     edx,pjImage             ; along with bits saved in buffer
        !          2891:         mov     edi,pjScreen            ; we are displaying the glyph
        !          2892:         mov     eax,xsgmb2_obos_dispatch[eax*4]; start at the correct location
        !          2893:         push    eax
        !          2894:         mov     eax,cScanBlock          ; Number of scan blocks to draw
        !          2895:         shl     eax,16                  ; put count in high word of EAX
        !          2896:                                         ; ***64K scan lines max***
        !          2897:         mov     ebx,ulNextScan          ; distance from one screen scan to next
        !          2898:         push    ebp                     ; remember stack frame pointer
        !          2899:         mov     ebp,cjBytes             ; distance to next glyph scan
        !          2900:                                         ; ***stack frame not available***
        !          2901:         retn                            ; branch into unrolled loop
        !          2902: 
        !          2903:         ALIGN 4
        !          2904: xsgmb2_obos_loop8:
        !          2905:         mov     ax,[esi]
        !          2906:         add     esi,ebp                 ; Next line of glyph
        !          2907:         rol     ax,cl                   ; Put usable glyph data in place
        !          2908:         and     al,ch
        !          2909:         or      al,[edx]
        !          2910:         mov     [edi],al
        !          2911:         add     edi,ebx                 ; point to next screen scan
        !          2912: 
        !          2913: xsgmb2_obos_loop7:
        !          2914:         mov     ax,[esi]
        !          2915:         add     esi,ebp                 ; Next line of glyph
        !          2916:         rol     ax,cl                   ; Put usable glyph data in place
        !          2917:         and     al,ch
        !          2918:         or      al,[edx][1]
        !          2919:         mov     [edi],al
        !          2920:         add     edi,ebx                 ; point to next screen scan
        !          2921: 
        !          2922: xsgmb2_obos_loop6:
        !          2923:         mov     ax,[esi]
        !          2924:         add     esi,ebp                 ; Next line of glyph
        !          2925:         rol     ax,cl                   ; Put usable glyph data in place
        !          2926:         and     al,ch
        !          2927:         or      al,[edx][2]
        !          2928:         mov     [edi],al
        !          2929:         add     edi,ebx                 ; point to next screen scan
        !          2930: 
        !          2931: xsgmb2_obos_loop5:
        !          2932:         mov     ax,[esi]
        !          2933:         add     esi,ebp                 ; Next line of glyph
        !          2934:         rol     ax,cl                   ; Put usable glyph data in place
        !          2935:         and     al,ch
        !          2936:         or      al,[edx][3]
        !          2937:         mov     [edi],al
        !          2938:         add     edi,ebx                 ; point to next screen scan
        !          2939:         add     edx,4
        !          2940: 
        !          2941: xsgmb2_obos_loop4:
        !          2942:         mov     ax,[esi]
        !          2943:         add     esi,ebp                 ; Next line of glyph
        !          2944:         rol     ax,cl                   ; Put usable glyph data in place
        !          2945:         and     al,ch
        !          2946:         or      al,[edx]
        !          2947:         mov     [edi],al
        !          2948:         add     edi,ebx                 ; point to next screen scan
        !          2949: 
        !          2950: xsgmb2_obos_loop3:
        !          2951:         mov     ax,[esi]
        !          2952:         add     esi,ebp                 ; Next line of glyph
        !          2953:         rol     ax,cl                   ; Put usable glyph data in place
        !          2954:         and     al,ch
        !          2955:         or      al,[edx][1]
        !          2956:         mov     [edi],al
        !          2957:         add     edi,ebx                 ; point to next screen scan
        !          2958: 
        !          2959: xsgmb2_obos_loop2:
        !          2960:         mov     ax,[esi]
        !          2961:         add     esi,ebp                 ; Next line of glyph
        !          2962:         rol     ax,cl                   ; Put usable glyph data in place
        !          2963:         and     al,ch
        !          2964:         or      al,[edx][2]
        !          2965:         mov     [edi],al
        !          2966:         add     edi,ebx                 ; point to next screen scan
        !          2967: 
        !          2968: xsgmb2_obos_loop1:
        !          2969:         mov     ax,[esi]
        !          2970:         add     esi,ebp                 ; Next line of glyph
        !          2971:         rol     ax,cl                   ; Put usable glyph data in place
        !          2972:         and     al,ch
        !          2973:         or      al,[edx][3]
        !          2974:         mov     [edi],al
        !          2975:         add     edi,ebx                 ; point to next screen scan
        !          2976:         add     edx,4
        !          2977: 
        !          2978:         and     eax,0ffff0000h
        !          2979:         sub     eax,000010000h
        !          2980:         jnz     short xsgmb2_obos_loop8 ; finish column
        !          2981: 
        !          2982:         pop     ebp                     ; ***stack frame available***
        !          2983: 
        !          2984: xsgmb2_obos_update_ptr:
        !          2985:         inc     pjScreen                ; advance screen ptr
        !          2986:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          2987: 
        !          2988: xsgmb2_obos_exit:
        !          2989:         retn
        !          2990: 
        !          2991: ;---------------------------Private-Routine------------------------------;
        !          2992: ; xgi2_scrn_gmb_obos_1st_scrn
        !          2993: ;
        !          2994: ;   Draw a masked opaque glyph byte (2-fetch) and bits in reserved buffer
        !          2995: ;   with opaque background to the 1st screen byte.
        !          2996: ;
        !          2997: ; History:
        !          2998: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          2999: ;   Created.
        !          3000: ;-----------------------------------------------------------------------;
        !          3001: 
        !          3002:         ALIGN 4
        !          3003: xgi2_scrn_gmb_obos_1scrn::
        !          3004:         mov     pfnFirstByte,offset FLAT:xgi_1st_byte
        !          3005: 
        !          3006: ; Here we need to setup the bitmask including those in buffer. It can be
        !          3007: ; calculated here from the x starting point.
        !          3008: 
        !          3009:         ALIGN 4
        !          3010: xgmb2_obos_1scrn_bitmask:
        !          3011:         xor     bh,bh                   ; we use and clear
        !          3012:         xchg    bh,fjOBOSMask           ; the acculmulated mask
        !          3013:         or      bh,ch                   ; also include the current mask
        !          3014:         jns     short xsgmb2_call_obos_edge  ; there is really a mask
        !          3015:         call    xgi_set_opaque_bkgnd    ; no mask, treat it as a full byte
        !          3016:         jmp     xgi2_scrn_gmb_obos
        !          3017: 
        !          3018: xsgmb2_call_obos_edge:
        !          3019:         call    xsgmb2_obos_edge
        !          3020:         jmp     xgi_set_opaque_bkgnd_test_full_byte
        !          3021: 
        !          3022: ;---------------------------Private-Routine------------------------------;
        !          3023: ; xgi2_scrn_gmb_obos_last_glyph
        !          3024: ;
        !          3025: ;   Draw a masked opaque byte from the last glyph (2-fetch) and bits in
        !          3026: ;   reserved buffer with opaque background to the screen.
        !          3027: ;
        !          3028: ; History:
        !          3029: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          3030: ;   Created.
        !          3031: ;-----------------------------------------------------------------------;
        !          3032: 
        !          3033:         ALIGN 4
        !          3034: xgi2_scrn_gmb_obos_lg::
        !          3035:         xor     bh,bh
        !          3036:         xchg    bh,fjOBOSMask           ; use and clear the accumulated mask
        !          3037:         or      bh,ch                   ; plus the current mask
        !          3038:         inc     bh                      ; if mask is all 1s
        !          3039:         jnz     short @F
        !          3040:         call    xgi_set_opaque_bkgnd    ; treat it as a full byte
        !          3041:         jmp     xgi2_scrn_gmb_obos
        !          3042: @@:
        !          3043:         dec     bh
        !          3044:         call    xsgmb2_obos_edge        ; draw this first byte
        !          3045:         cmp     cInnerBytes,0           ; last glyph has full middle bytes?
        !          3046:         jz      short @F                ; no, then get out
        !          3047:         call    xgi_set_opaque_bkgnd    ; set the full byte
        !          3048: @@:
        !          3049:         retn
        !          3050: 
        !          3051: ;---------------------------Private-Routine------------------------------;
        !          3052: ; xgi2_scrn_gmb_obos_edge
        !          3053: ;
        !          3054: ;   Draw a masked opaque byte from the glyph (2-fetch) and bits in
        !          3055: ;   reserved buffer with opaque background to the screen.
        !          3056: ;
        !          3057: ; History:
        !          3058: ;   Thu 18-Jul-1991 13:10:27 -by- Viroon Touranachun [viroont]
        !          3059: ;   Created.
        !          3060: ;-----------------------------------------------------------------------;
        !          3061: 
        !          3062:         ALIGN 4
        !          3063: xsgmb2_obos_edge:
        !          3064:         xchg    bh,ch                   ; set with the accumulated mask
        !          3065:         call    xgi_setup_opaque_bkgnd_edge
        !          3066:         xchg    bh,ch                   ; restore the current byte mask
        !          3067: 
        !          3068: ; The following AND leaves 1 bits in AH for the planes which
        !          3069: ; CANNOT be done on the second pass.  So if this is zero we can
        !          3070: ; skip the first pass.
        !          3071: 
        !          3072:         and     ah,bl                   ; BL = BkColor = color where data is 1
        !          3073:         or      ah,bl                   ; planes to enable
        !          3074:         jz      xsgmbe2_obos_skip_first_pass
        !          3075:         or      al,ah                   ; Include "Set/Reset" planes.
        !          3076:         out     dx,al                   ; Enable planes for first pass.
        !          3077: 
        !          3078:         push    eax
        !          3079:         mov     ebx,cScan
        !          3080:         mov     edx,pjImage
        !          3081:         add     edx,cBufferOffset
        !          3082: 
        !          3083:         ALIGN 4
        !          3084: xsgmbe2_obos_first_pass:
        !          3085:         mov     ax,[esi]
        !          3086:         rol     ax,cl                   ; Put usable glyph data in place
        !          3087:         and     al,ch
        !          3088:         or      al,[edx]
        !          3089:         xchg    al,[edi]
        !          3090:         add     esi,cjBytes
        !          3091:         add     edi,ulNextScan
        !          3092:         inc     edx
        !          3093:         dec     ebx
        !          3094:         jnz     short xsgmbe2_obos_first_pass
        !          3095: 
        !          3096:         pop     eax
        !          3097:         mov     esi,pjGlyph             ; restore the glyph pointer
        !          3098:         mov     edi,pjScreen            ; restore the screen pointer
        !          3099:         mov     dx,VGA_BASE + SEQ_DATA  ; The rest of the OUTs are here.
        !          3100: 
        !          3101:         ALIGN 4
        !          3102: xsgmbe2_obos_skip_first_pass:
        !          3103: 
        !          3104: ; Enable the other planes.
        !          3105: 
        !          3106:         not     ah
        !          3107:         and     ah,MM_ALL
        !          3108:         jz      short xsgmbe2_obos_no_planes_left
        !          3109:         mov     al,ah
        !          3110:         out     dx,al
        !          3111:         mov     ebx,cScan
        !          3112:         mov     edx,pjImage
        !          3113:         add     edx,cBufferOffset
        !          3114: 
        !          3115:         ALIGN 4
        !          3116: xsgmbe2_obos_second_pass:
        !          3117:         mov     ax,[esi]
        !          3118:         rol     ax,cl                   ; Put usable glyph data in place
        !          3119:         and     al,ch
        !          3120:         or      al,[edx]
        !          3121:         not     al
        !          3122:         xchg    al,[edi]
        !          3123:         add     esi,cjBytes
        !          3124:         add     edi,ulNextScan
        !          3125:         inc     edx
        !          3126:         dec     ebx
        !          3127:         jnz     short xsgmbe2_obos_second_pass
        !          3128:         mov     dx,VGA_BASE + SEQ_DATA  ; The rest of the OUTs are here.
        !          3129: 
        !          3130: xsgmbe2_obos_no_planes_left:
        !          3131:         mov     al,MM_ALL
        !          3132:         out     dx,al
        !          3133: 
        !          3134: xsgmbe2_obos_exit:
        !          3135:         inc     pjScreen                ; advance the display ptr
        !          3136:         inc     pjGlyph                 ; always advance glyph ptr for 2 bytes
        !          3137:         retn
        !          3138: 
        !          3139: ENDIF   ;GMB_2_FETCH_POSSIBLE
        !          3140: 
        !          3141:         ALIGN   4
        !          3142: 
        !          3143: xgi_1st_byte_1st_scrn   equ this dword              ;FG  SB LMB OB  MS  2F
        !          3144:         dd  offset FLAT:xgi1_scrn_g_xbos_1scrn      ; 0   0  0   0   0  0
        !          3145:         dd  offset FLAT:xgi2_scrn_g_xbos_1scrn      ; 0   0  0   0   0  1
        !          3146:         dd  offset FLAT:xgi1_scrn_g_xbms_1scrn      ; 0   0  0   0   1  0
        !          3147:         dd  offset FLAT:xgi2_scrn_g_xbms_1scrn      ; 0   0  0   0   1  1
        !          3148:         dd  offset FLAT:xgi1_scrn_g_obos_1scrn      ; 0   0  0   1   0  0
        !          3149:         dd  offset FLAT:xgi2_scrn_g_obos_1scrn      ; 0   0  0   1   0  1
        !          3150:         dd  offset FLAT:xgi1_scrn_g_obos_1scrn      ; 0   0  0   1   1  0
        !          3151:         dd  offset FLAT:xgi2_scrn_g_obos_1scrn      ; 0   0  0   1   1  1
        !          3152:         dd  offset FLAT:xgi1_scrn_gmb_xbos_1scrn    ; 0   0  1   0   0  0
        !          3153:         dd  offset FLAT:xgi2_scrn_gmb               ; 0   0  1   0   0  1
        !          3154:         dd  offset FLAT:xgi1_scrn_gmb_xbms_1scrn    ; 0   0  1   0   1  0
        !          3155:         dd  offset FLAT:xgi2_scrn_gmb               ; 0   0  1   0   1  1
        !          3156:         dd  offset FLAT:xgi1_scrn_gmb_obos_1scrn    ; 0   0  1   1   0  0
        !          3157:         dd  offset FLAT:xgi2_scrn_gmb               ; 0   0  1   1   0  1
        !          3158:         dd  offset FLAT:xgi1_scrn_gmb_obos_1scrn    ; 0   0  1   1   1  0
        !          3159:         dd  offset FLAT:xgi2_scrn_gmb               ; 0   0  1   1   1  1
        !          3160:         dd  offset FLAT:xgi1_buffer_or              ; 0   1  0   0   0  0
        !          3161:         dd  offset FLAT:xgi2_buffer_or              ; 0   1  0   0   0  1
        !          3162:         dd  offset FLAT:xgi1_buffer_or              ; 0   1  0   0   1  0
        !          3163:         dd  offset FLAT:xgi2_buffer_or              ; 0   1  0   0   1  1
        !          3164:         dd  offset FLAT:xgi1_buffer_or_obos         ; 0   1  0   1   0  0
        !          3165:         dd  offset FLAT:xgi2_buffer_or_obos         ; 0   1  0   1   0  1
        !          3166:         dd  offset FLAT:xgi1_buffer_or_obos         ; 0   1  0   1   1  0
        !          3167:         dd  offset FLAT:xgi2_buffer_or_obos         ; 0   1  0   1   1  1
        !          3168:         dd  offset FLAT:xgi1_buffer_or              ; 0   1  1   0   0  0
        !          3169:         dd  offset FLAT:xgi2_buffer_or              ; 0   1  1   0   0  1
        !          3170:         dd  offset FLAT:xgi1_buffer_or              ; 0   1  1   0   1  0
        !          3171:         dd  offset FLAT:xgi2_buffer_or              ; 0   1  1   0   1  1
        !          3172:         dd  offset FLAT:xgi1_buffer_or_obos         ; 0   1  1   1   0  0
        !          3173:         dd  offset FLAT:xgi2_buffer_or_obos         ; 0   1  1   1   0  1
        !          3174:         dd  offset FLAT:xgi1_buffer_or_obos         ; 0   1  1   1   1  0
        !          3175:         dd  offset FLAT:xgi2_buffer_or_obos         ; 0   1  1   1   1  1
        !          3176:         dd  offset FLAT:xgi1_scrn_g_xbos_1scrn      ; 1   0  0   0   0  0
        !          3177:         dd  offset FLAT:xgi2_scrn_g_xbos_1scrn      ; 1   0  0   0   0  1
        !          3178:         dd  offset FLAT:xgi1_scrn_g_xbms_1scrn      ; 1   0  0   0   1  0
        !          3179:         dd  offset FLAT:xgi2_scrn_g_xbms_1scrn      ; 1   0  0   0   1  1
        !          3180:         dd  offset FLAT:xgi1_scrn_g_obos_1scrn      ; 1   0  0   1   0  0
        !          3181:         dd  offset FLAT:xgi2_scrn_g_obos_1scrn      ; 1   0  0   1   0  1
        !          3182:         dd  offset FLAT:xgi1_scrn_g_obos_1scrn      ; 1   0  0   1   1  0
        !          3183:         dd  offset FLAT:xgi2_scrn_g_obos_1scrn      ; 1   0  0   1   1  1
        !          3184:         dd  offset FLAT:xgi1_scrn_gm_xbos_1scrn     ; 1   0  1   0   0  0
        !          3185:         dd  offset FLAT:xgi2_scrn_gm_xbos_1scrn     ; 1   0  1   0   0  1
        !          3186:         dd  offset FLAT:xgi1_scrn_gm_xbms_1scrn     ; 1   0  1   0   1  0
        !          3187:         dd  offset FLAT:xgi2_scrn_gm_xbms_1scrn     ; 1   0  1   0   1  1
        !          3188:         dd  offset FLAT:xgi1_scrn_gm_obos_1scrn     ; 1   0  1   1   0  0
        !          3189:         dd  offset FLAT:xgi2_scrn_gm_obos_1scrn     ; 1   0  1   1   0  1
        !          3190:         dd  offset FLAT:xgi1_scrn_gm_obos_1scrn     ; 1   0  1   1   1  0
        !          3191:         dd  offset FLAT:xgi2_scrn_gm_obos_1scrn     ; 1   0  1   1   1  1
        !          3192:         dd  offset FLAT:xgi1_buffer_over            ; 1   1  0   0   0  0
        !          3193:         dd  offset FLAT:xgi2_buffer_over            ; 1   1  0   0   0  1
        !          3194:         dd  offset FLAT:xgi1_buffer_over            ; 1   1  0   0   1  0
        !          3195:         dd  offset FLAT:xgi2_buffer_over            ; 1   1  0   0   1  1
        !          3196:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1   1  0   1   0  0
        !          3197:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1   1  0   1   0  1
        !          3198:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1   1  0   1   1  0
        !          3199:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1   1  0   1   1  1
        !          3200:         dd  offset FLAT:xgi1_buffer_over            ; 1   1  1   0   0  0
        !          3201:         dd  offset FLAT:xgi2_buffer_over            ; 1   1  1   0   0  1
        !          3202:         dd  offset FLAT:xgi1_buffer_over            ; 1   1  1   0   1  0
        !          3203:         dd  offset FLAT:xgi2_buffer_over            ; 1   1  1   0   1  1
        !          3204:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1   1  1   1   0  0
        !          3205:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1   1  1   1   0  1
        !          3206: ;       dd  offset FLAT:xgi1_buffer_over_obos       ; 1   1  1   1   1  0
        !          3207: ;       dd  offset FLAT:xgi2_buffer_over_obos       ; 1   1  1   1   1  1
        !          3208: 
        !          3209: xgi_1st_byte    equ this dword                      ;SB LMB OB  MS  2F
        !          3210:         dd  offset FLAT:xgi1_scrn_g_xbos            ; 0  0   0   0  0
        !          3211:         dd  offset FLAT:xgi2_scrn_g_xbos            ; 0  0   0   0  1
        !          3212:         dd  offset FLAT:xgi1_scrn_g_xbms            ; 0  0   0   1  0
        !          3213:         dd  offset FLAT:xgi2_scrn_g_xbms            ; 0  0   0   1  1
        !          3214:         dd  offset FLAT:xgi1_scrn_g_obos            ; 0  0   1   0  0
        !          3215:         dd  offset FLAT:xgi2_scrn_g_obos            ; 0  0   1   0  1
        !          3216:         dd  offset FLAT:xgi1_scrn_g_obos            ; 0  0   1   1  0
        !          3217:         dd  offset FLAT:xgi2_scrn_g_obos            ; 0  0   1   1  1
        !          3218:         dd  offset FLAT:xgi1_scrn_gmb_xbos          ; 0  1   0   0  0
        !          3219:         dd  offset FLAT:xgi2_scrn_gmb               ; 0  1   0   0  1
        !          3220:         dd  offset FLAT:xgi1_scrn_gmb_xbms          ; 0  1   0   1  0
        !          3221:         dd  offset FLAT:xgi2_scrn_gmb               ; 0  1   0   1  1
        !          3222:         dd  offset FLAT:xgi1_scrn_gmb_obos          ; 0  1   1   0  0
        !          3223:         dd  offset FLAT:xgi2_scrn_gmb               ; 0  1   1   0  1
        !          3224:         dd  offset FLAT:xgi1_scrn_gmb_obos          ; 0  1   1   1  0
        !          3225:         dd  offset FLAT:xgi2_scrn_gmb               ; 0  1   1   1  1
        !          3226:         dd  offset FLAT:xgi1_buffer_over            ; 1  0   0   0  0
        !          3227:         dd  offset FLAT:xgi2_buffer_over            ; 1  0   0   0  1
        !          3228:         dd  offset FLAT:xgi1_buffer_over            ; 1  0   0   1  0
        !          3229:         dd  offset FLAT:xgi2_buffer_over            ; 1  0   0   1  1
        !          3230:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1  0   1   0  0
        !          3231:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1  0   1   0  1
        !          3232:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1  0   1   1  0
        !          3233:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1  0   1   1  1
        !          3234:         dd  offset FLAT:xgi1_buffer_or              ; 1  1   0   0  0
        !          3235:         dd  offset FLAT:xgi2_buffer_or              ; 1  1   0   0  1
        !          3236:         dd  offset FLAT:xgi1_buffer_or              ; 1  1   0   1  0
        !          3237:         dd  offset FLAT:xgi2_buffer_or              ; 1  1   0   1  1
        !          3238:         dd  offset FLAT:xgi1_buffer_or_obos         ; 1  1   1   0  0
        !          3239:         dd  offset FLAT:xgi2_buffer_or_obos         ; 1  1   1   0  1
        !          3240: ;       dd  offset FLAT:xgi1_buffer_or_obos         ; 1  1   1   1  0
        !          3241: ;       dd  offset FLAT:xgi2_buffer_or_obos         ; 1  1   1   1  1
        !          3242: 
        !          3243: xgi_1st_byte_last_glyph equ this dword              ;LMB OB MS  2F
        !          3244:         dd  offset FLAT:xgi1_scrn_gm_xbos           ; 0   0  0  0
        !          3245:         dd  offset FLAT:xgi2_scrn_gm_xbos           ; 0   0  0  1
        !          3246:         dd  offset FLAT:xgi1_scrn_gm_xbms           ; 0   0  1  0
        !          3247:         dd  offset FLAT:xgi2_scrn_gm_xbms           ; 0   0  1  1
        !          3248:         dd  offset FLAT:xgi1_scrn_gm_obos_lg        ; 0   1  0  0
        !          3249:         dd  offset FLAT:xgi2_scrn_gm_obos_lg        ; 0   1  0  1
        !          3250:         dd  offset FLAT:xgi1_scrn_gm_obos_lg        ; 0   1  1  0
        !          3251:         dd  offset FLAT:xgi2_scrn_gm_obos_lg        ; 0   1  1  1
        !          3252:         dd  offset FLAT:xgi1_scrn_gmb_xbos          ; 1   0  0  0
        !          3253:         dd  offset FLAT:xgi2_scrn_gmb               ; 1   0  0  1
        !          3254:         dd  offset FLAT:xgi1_scrn_gmb_xbms          ; 1   0  1  0
        !          3255:         dd  offset FLAT:xgi2_scrn_gmb               ; 1   0  1  1
        !          3256:         dd  offset FLAT:xgi1_scrn_gmb_obos_lg       ; 1   1  0  0
        !          3257:         dd  offset FLAT:xgi2_scrn_gmb               ; 1   1  0  1
        !          3258:         dd  offset FLAT:xgi1_scrn_gmb_obos_lg       ; 1   1  1  0
        !          3259: ;       dd  offset FLAT:xgi2_scrn_gmb               ; 1   1  1  1
        !          3260: 
        !          3261: xgi_middle_byte_table   equ this dword              ;OB  MS  2F
        !          3262:         dd  offset FLAT:xgi1_scrn_g_xbos            ; 0   0   0
        !          3263:         dd  offset FLAT:xgi2_scrn_g_xbos            ; 0   0   1
        !          3264:         dd  offset FLAT:xgi1_scrn_g_xbms            ; 0   1   0
        !          3265:         dd  offset FLAT:xgi2_scrn_g_xbms            ; 0   1   1
        !          3266:         dd  offset FLAT:xgi1_scrn_g_obos            ; 1   0   0
        !          3267:         dd  offset FLAT:xgi2_scrn_g_obos            ; 1   0   1
        !          3268: ;       dd  offset FLAT:xgi1_scrn_g_obos            ; 1   1   0
        !          3269: ;       dd  offset FLAT:xgi2_scrn_g_obos            ; 1   1   1
        !          3270: 
        !          3271: xgi_middle_bytes_table   equ this dword             ;OB  MS  2F
        !          3272:         dd  offset FLAT:xgi1_scrn_gs_xbos           ; 0   0   0
        !          3273:         dd  offset FLAT:xgi2_scrn_gs_xbos           ; 0   0   1
        !          3274:         dd  offset FLAT:xgi1_scrn_gs_xbms           ; 0   1   0
        !          3275:         dd  offset FLAT:xgi2_scrn_gs_xbms           ; 0   1   1
        !          3276:         dd  offset FLAT:xgi1_scrn_gs_obos           ; 1   0   0
        !          3277:         dd  offset FLAT:xgi2_scrn_gs_obos           ; 1   0   1
        !          3278: ;       dd  offset FLAT:xgi1_scrn_gs_obos           ; 1   1   0
        !          3279: ;       dd  offset FLAT:xgi2_scrn_gs_obos           ; 1   1   1
        !          3280: 
        !          3281: xgi_last_byte_table     equ this dword              ;OB  MS  2F
        !          3282:         dd  offset FLAT:xgi1_buffer_over            ; 0   0  0
        !          3283:         dd  offset FLAT:xgi2_buffer_over            ; 0   0  1
        !          3284:         dd  offset FLAT:xgi1_buffer_over            ; 0   1  0
        !          3285:         dd  offset FLAT:xgi2_buffer_over            ; 0   1  1
        !          3286:         dd  offset FLAT:xgi1_buffer_over_obos       ; 1   0  0
        !          3287:         dd  offset FLAT:xgi2_buffer_over_obos       ; 1   0  1
        !          3288: ;       dd  offset FLAT:xgi1_buffer_over_obos       ; 1   1  0
        !          3289: ;       dd  offset FLAT:xgi2_buffer_over_obos       ; 1   1  1
        !          3290: 
        !          3291: xgi_last_byte_last_glyph    equ this dword          ;LMB OB  MS  2F
        !          3292:         dd  offset FLAT:xgi1_scrn_gm_xbos           ; 0   0   0  0
        !          3293:         dd  offset FLAT:xgi2_scrn_gm_xbos           ; 0   0   0  1
        !          3294:         dd  offset FLAT:xgi1_scrn_gm_xbms           ; 0   0   1  0
        !          3295:         dd  offset FLAT:xgi2_scrn_gm_xbms           ; 0   0   1  1
        !          3296:         dd  offset FLAT:xgi1_scrn_gm_obos           ; 0   1   0  0
        !          3297:         dd  offset FLAT:xgi2_scrn_gm_obos           ; 0   1   0  1
        !          3298:         dd  offset FLAT:xgi1_scrn_gm_obos           ; 0   1   1  0
        !          3299:         dd  offset FLAT:xgi2_scrn_gm_obos           ; 0   1   1  1
        !          3300:         dd  offset FLAT:xgi1_scrn_gm_xbos           ; 1   0   0  0
        !          3301:         dd  offset FLAT:xgi2_scrn_gm_xbos           ; 1   0   0  1
        !          3302:         dd  offset FLAT:xgi1_scrn_gm_xbms           ; 1   0   1  0
        !          3303:         dd  offset FLAT:xgi2_scrn_gm_xbms           ; 1   0   1  1
        !          3304:         dd  offset FLAT:xgi1_scrn_gm_obos           ; 1   1   0  0
        !          3305:         dd  offset FLAT:xgi2_scrn_gm_obos           ; 1   1   0  1
        !          3306: ;       dd  offset FLAT:xgi1_scrn_gm_obos           ; 1   1   1  0
        !          3307: ;       dd  offset FLAT:xgi2_scrn_gm_obos           ; 1   1   1  1
        !          3308: 
        !          3309: xgi_buffer_offset   equ     this dword
        !          3310:         db      0
        !          3311:         db      3
        !          3312:         db      2
        !          3313:         db      1
        !          3314:         db      0
        !          3315:         db      3
        !          3316:         db      2
        !          3317:         db      1
        !          3318: 
        !          3319: loop_table      macro   name
        !          3320: 
        !          3321:         dd      offset FLAT:&name&_loop8
        !          3322:         dd      offset FLAT:&name&_loop1
        !          3323:         dd      offset FLAT:&name&_loop2
        !          3324:         dd      offset FLAT:&name&_loop3
        !          3325:         dd      offset FLAT:&name&_loop4
        !          3326:         dd      offset FLAT:&name&_loop5
        !          3327:         dd      offset FLAT:&name&_loop6
        !          3328:         dd      offset FLAT:&name&_loop7
        !          3329: 
        !          3330:         endm
        !          3331: 
        !          3332: xgi1_fob_over   equ this dword
        !          3333:         loop_table  xgi_fetch_one_byte_over
        !          3334: 
        !          3335: xgi2_ftb_over   equ this dword
        !          3336:         loop_table  xgi_fetch_two_bytes_over
        !          3337: 
        !          3338: xgi1_fob_or     equ this dword
        !          3339:         loop_table  xgi_fetch_one_byte_or
        !          3340: 
        !          3341: xgi2_ftb_or     equ this dword
        !          3342:         loop_table  xgi_fetch_two_bytes_or
        !          3343: 
        !          3344: xsg1_xbos_dispatch equ this dword
        !          3345:         loop_table  xsg1_xbos
        !          3346: 
        !          3347: xsgmb1_xbos_dispatch equ this dword
        !          3348:         loop_table  xsgmb1_xbos
        !          3349: 
        !          3350: xsg2_xbos_dispatch equ this dword
        !          3351:         loop_table  xsg2_xbos
        !          3352: 
        !          3353: xsg1_obos_dispatch equ this dword
        !          3354:         loop_table  xsg1_obos
        !          3355: 
        !          3356: xsgmb1_obos_dispatch equ this dword
        !          3357:         loop_table  xsgmb1_obos
        !          3358: 
        !          3359: xsg2_obos_dispatch equ this dword
        !          3360:         loop_table  xsg2_obos
        !          3361: 
        !          3362: IFDEF   GMB_2_FETCH_POSSIBLE
        !          3363: 
        !          3364: xsgmb2_xbos_dispatch equ this dword
        !          3365:         loop_table  xsgmb2_xbos
        !          3366: 
        !          3367: xsgmb2_obos_dispatch equ this dword
        !          3368:         loop_table  xsgmb2_obos_loop8
        !          3369: 
        !          3370: ENDIF   ;GMB_2_FETCH_POSSIBLE
        !          3371: 
        !          3372: xxxvStringBlt endp
        !          3373: 
        !          3374: public sblt_glyph_search
        !          3375: public sblt_glyph_search_last
        !          3376: public sblt_glyph_search_1st
        !          3377: public sblt_found_both
        !          3378: public sblt_calc_glyph_height
        !          3379: public sblt_accel_flag
        !          3380: public sblt_special_case
        !          3381: public sblt_init_jmp_table
        !          3382: ;public sblt_call_vglyphblt
        !          3383: public sblt_1st_glyph_cell
        !          3384: public sblt_last_glyph_cell
        !          3385: public sblt_middle_fpa_glyph
        !          3386: public sblt_next_glyph_cell
        !          3387: public sblt_left_mask
        !          3388: public sblt_one_byte_mask
        !          3389: public sblt_inner_count
        !          3390: public sblt_last_mask
        !          3391: public sblt_glyph_info
        !          3392: public sblt_xfer_glyph_image
        !          3393: public sblt_exit
        !          3394: public xgi_inner_bytes
        !          3395: public xgi_last_byte
        !          3396: public fixed_pitch_aligned_sblt
        !          3397: public fixed_pitch_aligned_sblt_inner
        !          3398: public fpa_single_byte_glyph
        !          3399: public fpa_multi_byte_glyph
        !          3400: public fpa_exit
        !          3401: public xgi1_buffer_over
        !          3402: public xgi1_buffer_or
        !          3403: public xgi2_buffer_over
        !          3404: public xgi2_buffer_or
        !          3405: public xgi1_scrn_g_obos_1scrn
        !          3406: public xgi1_scrn_g_obos
        !          3407: public xgi1_scrn_g_xbos_1scrn
        !          3408: public xgi1_scrn_g_xbos
        !          3409: public xgi1_scrn_g_xbms_1scrn
        !          3410: public xgi1_scrn_g_xbms
        !          3411: public xgi1_scrn_gs_obos
        !          3412: public xgi1_scrn_gs_xbos
        !          3413: public xgi1_scrn_gs_xbms
        !          3414: public xgi1_scrn_gm_xbos_1scrn
        !          3415: public xgi1_scrn_gm_xbos
        !          3416: public xgi1_scrn_gm_xbms_1scrn
        !          3417: public xgi1_scrn_gm_xbms
        !          3418: public xgi1_scrn_gmb_obos_1scrn
        !          3419: public xgi1_scrn_gmb_obos
        !          3420: public xgi1_scrn_gmb_xbos_1scrn
        !          3421: public xgi1_scrn_gmb_xbos
        !          3422: public xgi1_scrn_gmb_xbms_1scrn
        !          3423: public xgi1_scrn_gmb_xbms
        !          3424: public xgi2_scrn_g_obos_1scrn
        !          3425: public xgi2_scrn_g_obos
        !          3426: public xgi2_scrn_g_xbos_1scrn
        !          3427: public xgi2_scrn_g_xbos
        !          3428: public xgi2_scrn_g_xbms_1scrn
        !          3429: public xgi2_scrn_g_xbms
        !          3430: public xgi2_scrn_gs_obos
        !          3431: public xgi2_scrn_gs_xbos
        !          3432: public xgi2_scrn_gs_xbms
        !          3433: public xgi2_scrn_gm_xbos_1scrn
        !          3434: public xgi2_scrn_gm_xbos
        !          3435: public xgi2_scrn_gm_xbms_1scrn
        !          3436: public xgi2_scrn_gm_xbms
        !          3437: public xgi1_scrn_gm_obos_1scrn
        !          3438: public xgi1_scrn_gm_obos_lg
        !          3439: public xgi1_scrn_gm_obos
        !          3440: public xgi2_scrn_gm_obos_1scrn
        !          3441: public xgi2_scrn_gm_obos_lg
        !          3442: public xgi2_scrn_gm_obos
        !          3443: public xgi1_scrn_gmb_obos_lg
        !          3444: public xgi_setup_opaque_bkgnd_edge
        !          3445: public xgi_set_opaque_bkgnd
        !          3446: 
        !          3447: IFDEF  GMB_2_FETCH_POSSIBLE
        !          3448: public xgi2_scrn_gmb_obos_1scrn
        !          3449: public xgi2_scrn_gmb_obos
        !          3450: public xgi2_scrn_gmb_xbos_1scrn
        !          3451: public xgi2_scrn_gmb_xbos
        !          3452: public xgi2_scrn_gmb_xbms_1scrn
        !          3453: public xgi2_scrn_gmb_xbms
        !          3454: public xgi2_scrn_gmb_obos_lg
        !          3455: ENDIF  ;GMB_2_FETCH_POSSIBLE
        !          3456: 
        !          3457:         end
        !          3458: 

unix.superglobalmegacorp.com

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