|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.