The following code from EDDHBBLT.ASM is similar to code found throughout the driver.
; ss:esp now points to the destination coordinates: pop these straight into ; the hardware pop eax memregwrite dest_map, eax ; write the pixel op to kick off the blt memregwrite pixel_op, edx IFDEF HARD_DRAW ; see if the source is vram or not by checking vram marker IFDEF _8514 push ebx mov ebx, AIxfer.pbmhSrc mov eax, [ebx].bit map_address and eax, 0f0000000h cmp eax, 0f0000000h pop ebx jz short @f call SoftSrcSpecialist jmp short soft_done @@: call SrcSpecialist soft_done: ENDIF ;_8514 ELSE saveregs call _eddf_MESS restoreregs ENDIF
The following code from EDDHLNE.ASM shows the procedure for Soft-Draw mode. In this code, setup is created and calls eddf_MESS.
ELSE ;SOFT_DRAW IFDEF _8514 mov eax,_SPad.ptsNewStart memregwrite dest_map,eax mov ax,_SPad.sK1 memregwrite sr_K1,ax mov ax,_SPad.sK2 memregwrite sr_K2,ax mov ax,_SPad.usErrorTerm memregwrite Err_Term,ax mov ax,_SPad.usMajorAxis memregwrite dim1,ax ENDIF ;_8514 saveregs call _eddf_MESS restoreregs ENDIF
The S3 driver draws to bit maps by having eddf_MESS emulate certain XGA operations in software. The eddf_MESS routine interprets the Shadow8514Regs, based on the parameters therein, and the pel operation, then calls one of a number of routines to perform the requested drawing operation. For the most part, eddf_MESS is a collection of jump tables to routines that do the work. Each case and each pel depth are broken out into special cased routines. To some extent, this explains the size of the code. Individually, the routines themselves are not complex, although many of them are implemented as macros. The following is a list of the files that comprise the MESS, and the functions they perform.