|
|
;* **************************************************************************** ;* ;* COPYRIGHT (C) 1985-1992 MICROSOFT ;* ;* **************************************************************************** ; TITLE Format.asm line formatting routines for windows Write ; Module: format.asm ; contains native code versions of FormatLine, Justify, FGrowFormatHeap, ; FFirstIch, DxpFromCh, and ValidateMemoryDC ; ;* ;* REVISION HISTORY ;* ;* Date Who Rel Ver Remarks ;* 5/23/85 bz initial translation from c ;* 6/21/85 bl Set ?WIN == 0 for windows header ;* 7/09/85 pnt Call WinFailure() if vhMDC == NULL ;* 7/16/85 pnt Truncate tabs at right margin ;* 7/21/85 pnt Treat running heads like normal paragraphs ;* 7/30/85 bl Fixed bug in FFirstIch -- change scasb to scasw ;* 8/05/85 pnt Added ValidateMemoryDC() ;* 8/05/85 pnt DxpFromCh returns dxpSpace if ch < space ;* 8/07/85 pnt cchCHPUsed changed from 9 to 7 ;* 8/09/85 pnt Ensure there tabs don't back up on the screen ;* 8/14/85 pnt Map center and right tabs to left tabs ;* 8/27/85 pnt Single spacing changed to font leading only ;* 8/29/85 pnt Lines with no breaks can be right, center flush ;* 10/01/85 pnt Forced section mark to be in stardard font ;* 10/07/85 pnt DxpFromCh returns dxpSpace iff width unimportant ;* 10/10/85 pnt Validity of vfli cache depends on flm ;* 10/10/85 pnt fPrevSpace not set for null runs ;* 10/30/89 pault set code to use SYSENDMARK code in FORM1.C ;* (7.23.91) v-dougk changed dxp char arrays to int arrays SYSENDMARK EQU 1 ;* ;* ************************************************************************* */
;* ************************************************************************* */ ; Naming conventions used here ; ; rxx_name register variable - reg is xx. This may be a temporary naming ; of a register (e.g. rax_ichT) ; c_name defined constant in c program (e.g. c_false) ; ;* ************************************************************************* */ subttl Conditional variables and cmacros page
; *************** Conditional variables ************************* ; ***** These variables should be defined using the -D command line ; ***** option in masm. They are only checked for being defined, not ; ***** for a particular value ; ; DEBUG define with -DDEBUG ; ** controls ASSERT code ** ; SCRIBBLE define with -DSCRIBBLE ; ** controls SCRIBBLE code ** ; CASHMERE ; ** code taken out for Write, to be used for Cashmere ** ; ; *************** End conditional variables *************************
memM = 1 ; medium model for cmacros ?WIN = 1 ; windows header used here .xlist include cmacros.inc page .list ;.sall createSeg FORM1_TEXT,FORM1_TEXT,BYTE,PUBLIC,CODE
ASSUME CS: FORM1_TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
subttl Public definitions page ; ; Public definitions for this module ; PUBLIC DxpFromCh PUBLIC FormatLine PUBLIC Justify PUBLIC FGrowFormatHeap PUBLIC FFirstIch PUBLIC ValidateMemoryDC
; ; External procedures referenced from this module ;
EXTRN IMAX:FAR EXTRN CCHDIFFER:FAR EXTRN CACHESECT:FAR EXTRN FCHNGSIZEH:FAR EXTRN CACHEPARA:FAR EXTRN FORMATGRAPHICS:FAR EXTRN FFORMATSPECIALS:FAR EXTRN MULTDIV:FAR EXTRN FETCHCP:FAR EXTRN SETTEXTJUSTIFICATION:FAR EXTRN GETTEXTEXTENT:FAR EXTRN LOADFONT:FAR EXTRN WINFAILURE:FAR EXTRN GETDEVICECAPS:FAR EXTRN SETBKMODE:FAR EXTRN SETTEXTCOLOR:FAR EXTRN CREATECOMPATIBLEDC:FAR EXTRN GETPRINTERDC:FAR
; **** Debugging code ********** IFDEF DEBUG IFDEF SCRIBBLE EXTRN FNSCRIBBLE:FAR ENDIF ENDIF
subttl External definitions page ; ; External definitions referenced from this module ; sBegin DATA
EXTRN PLOCALHEAP:WORD ;EXTRN DOCHELP:WORD EXTRN VFLI:BYTE EXTRN VHGCHPFORMAT:WORD EXTRN ICHPMACFORMAT:WORD EXTRN VCHPABS:BYTE EXTRN VPAPABS:BYTE EXTRN VSEPABS:BYTE EXTRN VSEPPAGE:BYTE EXTRN VCHPNORMAL:BYTE EXTRN VCPFIRSTPARACACHE:DWORD EXTRN VCPFETCH:DWORD EXTRN YPSUBSUPER:WORD EXTRN VPCHFETCH:WORD EXTRN VCCHFETCH:WORD EXTRN YPSUBSUPERPR:WORD EXTRN VHMDC:WORD EXTRN VHDCPRINTER:WORD EXTRN DXPLOGINCH:WORD EXTRN DYPLOGINCH:WORD EXTRN DXAPRPAGE:WORD EXTRN DYAPRPAGE:WORD EXTRN DXPPRPAGE:WORD EXTRN DYPPRPAGE:WORD EXTRN DYPMAX:WORD EXTRN VFMISCREEN:BYTE EXTRN VFMIPRINT:BYTE EXTRN VFOUTOFMEMORY:WORD EXTRN VFMONOCHROME:WORD EXTRN RGBTEXT:DWORD EXTRN PWWDCUR:WORD EXTRN VCHDECIMAL:BYTE EXTRN VZATABDFLT:BYTE sEnd DATA
;sBegin BSS sBegin DATA $S784_ichpFormat DB 02H DUP (?) EVEN sEnd DAT ;sEnd BSS
subttl Macros page ; ******************************************************************** ; macros done here for speed, rather than doing far procedure call
;----------------------------------------------------------------------------- ; bltc (pTo, wFill, cw) - fills cw words of memory starting at pTo with wFill. ;----------------------------------------------------------------------------- ; macro bltc destroys ax,es,cx
bltc MACRO pTo,wFill,cw push di mov ax,ds ; we are filling in the data segment mov es,ax mov di,pTo ; get the destination, constant, and count mov ax,wFill mov cx,cw cld ; the operation is forward rep stosw ; fill memory pop di ENDM
;----------------------------------------------------------------------------- ; bltbc (pTo, bFill, cb) - fills cb bytes of memory starting at pTo with ; bFill. ;-----------------------------------------------------------------------------
; macro bltbc destroys ax,es,cx
bltbc MACRO pTo,bFill,cb push di mov ax,ds ; we are filling in the data segment mov es,ax mov di,pTo ; get the destination, constant, and count mov al,bFill mov cx,cb cld ; the operation is forward rep stosb ; fill memory pop di ENDM
;------------------------------------------------------------------------------ ; blt (pFrom, pTo, cw) - a block transfer of wFills from pFrom to pTo; ; The size of the block is cw wFills. This blt() handles the case of ; overlapping source and destination. blt() returns a pointer to the ; end of the destination buffer (pTo + cw). NOTE - use this blt() to ; to transfer within the current DS only--use the bltx for FAR blts. ;-----------------------------------------------------------------------------
; macro blt destroys ax,bx,cx,es
blt MACRO pFrom,pTo,cw local blt1 push si push di mov si,pFrom ; get pointers and length of blt mov di,pTo mov cx,cw mov ax,ds ; set up segment registers mov es,ax mov ax,di ; calculate return value mov bx,cx shl bx,1 add ax,bx cmp si,di ; reverse direction of the blt if jae blt1 ; necessary
dec bx dec bx add si,bx add di,bx std blt1: rep movsw cld pop di pop si ENDM
subttl C structures Used in this module page ; ; *** The following structure definitions were used when this module ; *** was being developed: ; ;struct IFI ;{ ;int xp; ;int xpLeft; ;int xpRight; ;int xpReal; ;int xpPr; ;int xpPrRight; ;int ich; ;int ichLeft; ;int ichPrev; ;int ichFetch; ;int dypLineSize; ;int cchSpace; ;int cBreak; ;int chBreak; ;int jc;
;#ifdef CASHMERE ;int tlc; ;#endif /* CASHMERE */
;int fPrevSpace; ;}; ; *************************************************************************** ; ***** Equates for IFI structure ifi offsets ****************
IFI_STRUC STRUC xp DW ? xpLeft_Ifi DW ? xpRight_Ifi DW ? xpReal_Ifi DW ? xpPr DW ? xpPrRight DW ? ich_Ifi DW ? ichLeft DW ? ichPrev DW ? ichFetch DW ? dypLineSize DW ? cchSpace DW ? cBreak_Ifi DW ? chBreak DW ? _jc DW ? ; (2.27.91) D. Kent fPrevSpace DW ? IFI_STRUC ENDS
oIfi_xp EQU 0 oIfi_xpLeft EQU 2 oIfi_xpRight EQU 4 oIfi_xpReal EQU 6 oIfi_xpPr EQU 8 oIfi_xpPrRight EQU 10 oIfi_ich EQU 12 oIfi_ichLeft EQU 14 oIfi_ichPrev EQU 16 oIfi_ichFetch EQU 18 oIfi_dypLineSize EQU 20 oIfi_cchSpace EQU 22 oIfi_cBreak EQU 24 oIfi_chBreak EQU 26 oIfi_jc EQU 28 oIfi_fPrevSpace EQU 30
page ; ***************************************************************************
;/* Formatted line structure. ;Reorganized KJS, CS Sept 3 */ ;/* booleans in bytes to simplify machine code */ ;struct FLI ;{ ;typeCP cpMin; ;int ichCpMin; ;typeCP cpMac; ;int ichCpMac; ;int ichMac; ;int dcpDepend; ;unsigned fSplat : 8; ;/* First character in region where spaces have additional pixel */ ;unsigned ichFirstWide : 8; ;/* ichMac, with trailing blanks excluded */ ;int ichReal; ;int doc;
;int xpLeft; ;int xpRight; ;/* xpRight, with trailing blanks excluded */ ;int xpReal; ;/* the right margin where insert will have to break the line */ ;int xpMarg; ; ;unsigned fGraphics : 8; ;unsigned fAdjSpace : 8; /* Whether you adjust the spaces */
;unsigned dxpExtra; ;/* the interesting positions in order from top to bottom are: ;top: yp+dypLine ;top of ascenders: yp+dypAfter+dypFont ;base line: yp+dypBase ;bottom of descenders: yp+dypAfter ;bottom of line: yp ;distances between the points can be determined by algebraic subtraction. ;e.g. space before = yp+dypLine - (yp+dypAfter+dypFont) ;*/ ;int dypLine; ;int dypAfter; ;int dypFont; ;int dypBase;
;int ichLastTab; ;int rgdxp[ichMaxLine]; ;CHAR rgch[ichMaxLine]; ;}; ; *************************************************************************** ichMaxLine EQU 255 dxpNil EQU 0FFFFH
FLI STRUC cpMin_OFF DW ? cpMin_SEG DW ? ichCpMin DW ? cpMac_OFF DW ? cpMac_SEG DW ? ichCpMac DW ? ichMac DW ? dcpDepend DW ? fSplat DB ? ichFirstWide DB ? ichReal DW ? doc_Fli DW ? xpLeft_Fli DW ? xpRight DW ? xpReal_Fli DW ? xpMarg DW ? fGraphics_Fli DB ? fAdjSpace DB ? dxpExtra DW ? dypLine DW ? dypAfter DW ? dypFont DW ? dypBase DW ? fSplatNext DW ? ichLastTab DW ? flm_Fli DW ? rgdxp DW ichMaxLine DUP (?) rgch DB ichMaxLine DUP (?) FLI ENDS
page
; ************************************************************************** ;struct TBD /* Tab Descriptor */ ;{ ;unsigned dxa; /* distance from left margin of tab stop */ ;unsigned char jc : 3; /* justification code */ ;unsigned char tlc : 3; /* leader dot code */ ;unsigned char opcode : 2; /* operation code for Format Tabs */ ;CHAR chAlign; /* ASCII code of char to align on ;if jcTab=3, or 0 to align on '.' */ ;}; ; *************************************************************************** ; ***** Equates for TBD structure offsets **************** TBD STRUC dxa DW ? jc_Tbd DB ? ; 3 bits chAlign DB ? ;char TBD ENDS
;/* bit field equates in TBD structure */ tlc EQU jc_Tbd ; 3 bits opcode EQU jc_Tbd ; 2 bits
page ; ************************************************************************** ;struct PAP /* Paragraph properties */ ;{ ;unsigned fStyled : 1; /* BYTE 0 */ ;unsigned stc : 7; ;unsigned jc : 2; /* BYTE 1 */ ;unsigned fKeep : 1; ;unsigned fKeepFollow : 1; ;unsigned : 4; ;unsigned stcNormChp : 7; /* BYTE 2 */ ;unsigned : 9; /* BYTE 3 */ ;unsigned dxaRight; /* BYTE 4-5 */ ;unsigned dxaLeft; /* BYTE 6-7 */ ;unsigned dxaLeft1; /* BYTE 8-9 */ ;unsigned dyaLine; /* 10-11 */ ;unsigned dyaBefore; /* 12-13 */ ;unsigned dyaAfter; /* 14-15 */ ;unsigned rhc : 4; /* Running hd code */ ;unsigned fGraphics : 1; /* Graphics bit */ ;unsigned wUnused1 : 11; ;int wUnused2; ;int wUnused3; ;struct TBD rgtbd[itbdMaxWord]; ;};
; *************************************************************************** ; ***** Equates for PAP structure offsets ****************
PAP STRUC fStyled DB ? ;1 bit /* BYTE 0 */ jc_Pap DB ? ;2 bits /* BYTE 1 */ rmChp DB ? ;7 bits /* BYTE 2 */ unused9 DB ? ;9 bits /* BYTE 3 */ dxaRight DW ? ;/* BYTE 4-5 */ dxaLeft DW ? ;/* BYTE 6-7 */ dxaLeft1 DW ? ;/* BYTE 8-9 */ dyaLine DW ? ;/* 10-11 */ dyaBefore DW ? ;/* 12-13 */ dyaAfter DW ? ;/* 14-15 */ ;/* BYTE 16-17 */ rhc DW ? ;4 bits /* Running hd code */ wUnused2 DW ? ;/* BYTE 18-19 */ wUnused3 DW ? ;/* BYTE 20-21 */ rgtbd DW ? ;/* BYTE 23-23 */ PAP ENDS ;/* bit field equates in PAP structure */ stc_Pap EQU fStyled ;7 bits fKeep EQU jc_Pap ;1 bit fKeepFollow EQU jc_Pap ;1 bit unused4 EQU jc_Pap ;4 bits fGraphics_Pap EQU rhc ;1 bits /* Graphics bit */ wUnused1 EQU rhc ;11 bits page
; ************************************************************************** ;struct SEP ; { /* Section properties */ ; unsigned fStyled : 1; /* BYTE 0 */ ; unsigned stc : 7; ; unsigned bkc : 3; /* Break code */ /* BYTE 1 */ ; unsigned nfcPgn : 3; /* Pgn format code */ ; unsigned :2; ; unsigned yaMac; /* Page height */ /* BYTE 2-3 */ ; unsigned xaMac; /* Page width */ /* BYTE 4-5 */ ; unsigned pgnStart; /* Starting pgn */ /* BYTE 6-7 */ ; unsigned yaTop; /* Start of text */ /* BYTE 8-9 */ ; unsigned dyaText; /* Height of text */ /* 10-11 */ ; unsigned xaLeft; /* Left text margin */ /* 12-13 */ ; unsigned dxaText; /* Width of text */ /* 14-15 */ ; unsigned rhc : 4; /* *** RESERVED *** */ /* 16 */ ; /* (Must be same as PAP) */ ; unsigned : 2; ; unsigned fAutoPgn : 1; /* Print pgns without hdr */ ; unsigned fEndFtns : 1; /* Footnotes at end of doc */ ; unsigned cColumns : 8; /* # of columns */ /* BYTE 17 */ ; unsigned yaRH1; /* Pos of top hdr */ /* 18-19 */ ; unsigned yaRH2; /* Pos of bottom hdr */ /* 20-21 */ ; unsigned dxaColumns; /* Intercolumn gap */ /* 22-23 */ ; unsigned dxaGutter; /* Gutter width */ /* 24-25 */ ; unsigned yaPgn; /* Y pos of page nos */ /* 26-27 */ ; unsigned xaPgn; /* X pos of page nos */ /* 28-29 */ ; CHAR rgbJunk[cchPAP - 30]; /* Pad to cchPAP */ ; };
; *************************************************************************** ; ***** Equates for SEP structure offsets **************** SEP STRUC fStyled_Sep DB ? ;1 bit /* BYTE 0 */ bkc DB ? ;3 bits /* BYTE 1 */ yaMac DW ? ; /* Page height */ /* BYTE 2-3 */ xaMac DW ? ;/* Page width */ /* BYTE 4-5 */ pgnStart DW ? ; /* Starting pgn */ /* BYTE 6-7 */ yaTop DW ? ; /* Start of text */ /* BYTE 8-9 */ dyaText DW ? ; /* Height of text */ /* 10-11 */ xaLeft_Sep DW ? ; /* Left text margin */ /* 12-13 */ dxaText DW ? ; /* Width of text */ /* 14-15 */ rhc_Sep DB ? ;4 bits /* 16 */ ; /* (Must be same as PAP) */ cColumns DB ? ; /* # of columns */ /* BYTE 17 */ yaRH1 DW ? ; /* Pos of top hdr */ /* 18-19 */ yaRH2 DW ? ; /* Pos of bottom hdr */ /* 20-21 */ dxaColumns DW ? ;/* Intercolumn gap */ /* 22-23 */ dxaGutter DW ? ; /* Gutter width */ /* 24-25 */ yaPgn DW ? ; /* Y pos of page nos */ /* 26-27 */ xaPgn DW ? ; /* X pos of page nos */ /* 28-29 */ rgbJunk DW ? ; /* Pad to cchPAP */ SEP ENDS
;/* bit field equates in SEP structure */
stc_Sep EQU fStyled_Sep ;7 bits nfcPgn EQU bkc ; 3 bits /* Pgn format code */ junk1_Sep EQU bkc ; 2 bits junk2_Sep EQU rhc_Sep ;2 bits fAutoPgn EQU rhc_Sep ;1 bit /* Print pgns without hdr */ fEndFtns EQU rhc_Sep ;1 bit /* Footnotes at end of doc */
page
; ************************************************************************** ;typedef struct FMI /* font metric information */ ;{ ;int *mpchdxp; /* pointer to width table */ ;/* NOTE - we actually point chDxpMin entries ;before the start of the table, so ;that the valid range begins at the ;start of the actual table */ ;int dxpSpace; /* width of a space */ ;int dxpOverhang; /* overhang for italic/bold chars */ ;int dypAscent; /* ascent */ ;int dypDescent; /* descent */ ;int dypBaseline; /* difference from top of cell to baseline */ ;int dypLeading; /* accent space plus recommended leading */ ;};
; *************************************************************************** ; ***** Equates for FMI structure offsets **************** FMI STRUC mpchdxp DW ? dxpSpace DW ? dxpOverhang DW ? dypAscent_Fmi DW ? dypDescent_Fmi DW ? dypBaseline DW ? dypLeading DW ? FMI ENDS page
; ************************************************************************** ;struct CHP /* Character properties */ ;{ ;unsigned fStyled : 1; /* BYTE 0 */ ;unsigned stc : 7; /* style */ ;unsigned fBold : 1; /* BYTE 1 */ ;unsigned fItalic : 1; ;unsigned ftc : 6; /* Font code */ ;unsigned hps : 8; /* Size in half pts */ /* BYTE 2 */ ;unsigned fUline : 1; /* BYTE 3 */ ;unsigned fStrike : 1; ;unsigned fDline: 1; ;unsigned fOverset : 1; ;unsigned csm : 2; /* Case modifier */ ;unsigned fSpecial : 1; ;unsigned : 1; ;unsigned ftcXtra : 3; /* BYTE 4 */ ;unsigned fOutline : 1; ;unsigned fShadow : 1; ;unsigned : 3; ;unsigned hpsPos : 8; /* BYTE 5 */ ;unsigned fFixedPitch : 8; /* used internally only */ ;unsigned chLeader : 8; ;unsigned ichRun : 8; ;unsigned cchRun : 8; ;};
; *************************************************************************** ; ***** Equates for CHP structure offsets **************** CHP STRUC fStyled_Chp DB ? ;1 bit /* BYTE 0 */ fBold DB ? ;1 bit /* BYTE 1 */ hps DB ? ;8 bits /* BYTE 2 */ fUline DB ? ;1 bit /* BYTE 3 */ ftcXtra DB ? ;3 bits /* BYTE 4 */ hpsPos DB ? ;8 bits /* BYTE 5 */ fFixedPitch DB ? ;8 bits /* BYTE 6 */ chLeader DB ? ;8 bits /* BYTE 7 */ ichRun DB ? ;8 bits /* BYTE 8 */ cchRun DB ? ;8 bits /* BYTE 9 */ CHP ENDS
;/* bit field equates in CHP structure */ stc_Chp EQU fStyled_Chp ;7 bits /* style */ fItalic EQU fBold ;1 bit ftc EQU fBold ;6 bits fStrike EQU fUline ;1 bit fDline EQU fUline ;1 bit fOverset EQU fUline ;1 bit csm EQU fUline ;2 bits /* Case modifier */ fSpecial EQU fUline ;1 bit chp_unused1 EQU fUline ;1 bit fOutline EQU ftcXtra ;1 bit fShadow EQU ftcXtra ;1 bit chp_unused2 EQU ftcXtra ;3 bits
; ************************************************************************** subttl Bit masks page
mask_0001 EQU 1 mask_0010 EQU 2 mask_0011 EQU 3 mask_0100 EQU 4 mask_0101 EQU 5 mask_0110 EQU 6 mask_0111 EQU 7 mask_1000 EQU 8 mask_1001 EQU 9 mask_1010 EQU 10 mask_1011 EQU 11 mask_1100 EQU 12 mask_1101 EQU 13 mask_1110 EQU 14 mask_1111 EQU 15 mask_0001_0000 EQU 16 mask_1111_1111 EQU 65535 mask_0100_0000 EQU 64
subttl Defined C Constants
c_True EQU 1 c_False EQU 0 c_hpsDefault EQU 20 c_cwFLIBase EQU 22 c_cwIFI EQU 16 c_cwCHP EQU 5 c_docNil EQU -1 c_cpNil EQU -1 c_czaInch EQU 1440 c_czaLine EQU 240 c_xaRightMax EQU 31680 c_hpsNegMin EQU 128 ;/* Justification codes: must agree with menu.mod */ c_jcLeft EQU 0 c_jcCenter EQU 1 c_jcRight EQU 2 c_jcBoth EQU 3
c_jcTabMin EQU 4 c_jcTabLeft EQU 4 c_jcTabCenter EQU 5 c_jcTabRight EQU 6 c_jcTabDecimal EQU 7
;/* Tab leader codes: must agree with menu.mod */ c_tlcWhite EQU 0 c_tlcDot EQU 1 c_tlcHyphen EQU 2 c_tlcUline EQU 3
c_chEmark EQU 164
c_chNil EQU -1 c_chDelPrev EQU 8 c_chTab EQU 9 c_chEol EQU 10 c_chNewLine EQU 11 c_chSect EQU 12 c_chReturn EQU 13 c_chNRHFile EQU 31 c_chSpace EQU 32 c_chSplat EQU 46 c_chHyphen EQU 45
subttl FormatLine() page ; ************************************************************************** sBegin FORM1_TEXT ;*** ; ; FormatLine(doc, cp, ichCp, cpMac, flm) ; int doc; ; typeCP cp; ; int ichCp; ; typeCP cpMac; ; int flm; ; ; This procedure fills up vfli with a line of text. It is very large ; and called often - each time a character is typed, at least. ; ;*** cProc FormatLine,<PUBLIC,FAR>,<di,si> parmW doc parmD cp parmW ichCp parmD cpMac parmW flm ; Line 79
localW dyaFormat localW fFlmPrinting localDP psep localW xaRight localW dypAscentMac localW ichpNRH localW ypSubSuperFormat localW dxpFormat localW dypFormat localDP ppap localW dypAscent
localV ifi,%(size IFI_STRUC)
localW xpTab localW fTruncated localW xaLeft localW dypDescentMac localDP ptbd localW dypDescent localW dxaFormat localW dxp localW cch localDP pch localW xpPrev localW iichNew localW dxpPr localW cchUsed localW dich localW fSizeChanged localW chT localW cch2 localW dxpCh localW xaTab localW xaPr localW chT2 localW dxpNew
localV chpLocal,%(size CHP)
cBegin FormatLine
; Line 107 mov ax,flm and ax,1 mov fFlmPrinting,ax ; Line 113 mov fTruncated,0
;** Check for fli current */ ; Line 122 mov ax,WORD PTR VFLI.doc_Fli cmp doc,ax jne $I845 mov ax,WORD PTR VFLI.cpMin_OFF mov dx,WORD PTR VFLI.cpMin_SEG cmp SEG_cp,dx jne $I845 cmp OFF_cp,ax jne $I845 mov ax,WORD PTR VFLI.ichCpMin cmp ichCp,ax jne $I845 mov ax,WORD PTR VFLI.flm_Fli cmp flm,ax jne $I845
;* Just did this one */
jmp $RetFormat ; *** return **** ; Line 125 $I845: IFDEF DEBUG IFDEF SCRIBBLE mov ax,5 push ax mov ax,70 push ax call FAR PTR FNSCRIBBLE ENDIF ENDIF ; Line 129 ;* ;* This means: ;* vfli.fSplat = false; ;* vfli.dcpDepend = 0; ;* vfli.ichCpMac = 0; ;* vfli.dypLine = 0; ;* vfli.dypAfter = 0; ;* vfli.dypFont = 0; ;* vfli.dypBase = 0; ;* ; *** macro bltc destroys ax,es,cx bltc <OFFSET VFLI>,0,c_cwFLIBase mov WORD PTR VFLI.fSplatNext, 0 ; Line 141 ;* Rest of FormatLine loads up cache with current data *****
mov ax,doc mov WORD PTR VFLI.doc_Fli,ax mov ax,flm mov WORD PTR VFLI.flm_Fli,ax ; Line 142 ; *********** Register variables ******************** rax_OFF_cp EQU ax rdx_SEG_cp EQU dx ; **************************************************** mov rax_OFF_cp,OFF_cp mov rdx_SEG_cp,SEG_cp mov WORD PTR VFLI.cpMin_OFF,rax_OFF_cp mov WORD PTR VFLI.cpMin_SEG,rdx_SEG_cp ; Line 143 mov cx,ichCp mov WORD PTR VFLI.ichCpMin,cx ; Line 145 ; *** if (cp > cpMac) cmp rdx_SEG_cp,SEG_cpMac jl $initRunTbl jg $spAftEnd cmp rax_OFF_cp,OFF_cpMac jbe $initRunTbl $spAftEnd: ;/* Space after the endmark. Reset the cache because the footnotes come ;at the same cp in the footnote window */ ; Line 149 mov WORD PTR VFLI.doc_Fli,c_docNil ; Line 150 mov WORD PTR VFLI.cpMac_OFF,rax_OFF_cp mov WORD PTR VFLI.cpMac_SEG,rdx_SEG_cp ; Line 151 mov WORD PTR VFLI.rgdxp,0 ; Line 159 ; /* Line after end mark is taller than screen */ mov ax,DYPMAX mov WORD PTR VFLI.dypLine,ax sar ax,1 mov WORD PTR VFLI.dypFont,ax mov WORD PTR VFLI.dypBase,ax jmp $ScribRet ; Scribble and return ; ; *************** EXIT POINT ********************************************** ;
$initRunTbl: ;/* Initialize run tables */ mov WORD PTR $S784_ichpFormat,0 ; Line 185 ;/* Cache section and paragraph properties */ push doc push SEG_cp push OFF_cp call FAR PTR CACHESECT ; Line 188 mov psep,OFFSET VSEPABS ; Line 190 push doc push SEG_cp push OFF_cp call FAR PTR CACHEPARA ; Line 191 mov ppap,OFFSET VPAPABS
;/* Now we have: ;ppap paragraph properties ;psep division properties ;*/
; Line 198 ; *** if (ppap->fGraphics) mov bx,ppap test WORD PTR [bx].fGraphics_Pap,mask_0001_0000 je $I851 ; Line 201 ;*** Format a picture paragraph in a special way (see picture.c) push doc push SEG_cp push OFF_cp push ichCp push SEG_cpMac push OFF_cpMac push flm call FAR PTR FORMATGRAPHICS jmp $ScribRet ; Scribble and return ; ; *************** EXIT POINT ********************************************** ; $I851: ; *** /* Assure we have a good memory DC for font stuff */ call FAR PTR VALIDATEMEMORYDC cmp VHMDC,0 je $L20000 cmp VHDCPRINTER,0 jne $L20001 $L20000: call FAR PTR WINFAILURE jmp $ScribRet ; Scribble and return ; ; *************** EXIT POINT ********************************************** ; $L20001:
; Line 216 ; *** bltc(&ifi, 0, cwIFI); ; ***/* This means: ; ***ifi.ich = 0; ; ***ifi.ichPrev = 0; ; ***ifi.ichFetch = 0; ; ***ifi.cchSpace = 0; ; ***ifi.ichLeft = 0; ; ****/
; *** macro bltc destroys ax,es,cx lea dx,ifi bltc dx,0,c_cwIFI ; Line 225 mov ifi._jc,c_jcTabLeft ; Line 226 mov ifi.fPrevSpace,c_True ; Line 230 ; *** /* Set up some variables that have different value depending on ; *** whether we are printing or not */
; *** if (fFlmPrinting)
cmp fFlmPrinting,0 je $NoPrint ; Line 232 mov ax,DXAPRPAGE mov dxaFormat,ax ; Line 233 mov ax,DYAPRPAGE mov dyaFormat,ax ; Line 234 mov ax,DXPPRPAGE mov dxpFormat,ax ; Line 235 mov ax,DYPPRPAGE mov dypFormat,ax ; Line 236 mov ax,YPSUBSUPERPR jmp SHORT $CalcHgt
$NoPrint: ; Line 240 mov ax,c_czaInch mov dyaFormat,ax mov dxaFormat,ax ; Line 241 mov ax,DXPLOGINCH mov dxpFormat,ax ; Line 242 mov ax,DYPLOGINCH mov dypFormat,ax ; Line 243 mov ax,YPSUBSUPER
$CalcHgt: mov ypSubSuperFormat,ax
; *** /* Calculate line height and width measures. Compute ; *** xaLeft left indent 0 means at left margin ; *** xaRight width of column measured from left ; *** margin (not from left indent). ; *** */ ; *** xaLeft = ppap->dxaLeft;
; Line 251 ; *********** Register variables ******************** rbx_ppap EQU bx ; **************************************************** mov rbx_ppap,ppap mov ax,[rbx_ppap].dxaLeft mov xaLeft,ax ; Line 255
; *** /* If this is the first line of a paragraph, ; *** adjust xaLeft for the first ; *** line indent. (Also, set dypBefore, since its handy.) */ ; *** if (cp == vcpFirstParaCache)
mov ax,WORD PTR VCPFIRSTPARACACHE mov dx,WORD PTR VCPFIRSTPARACACHE+2 cmp SEG_cp,dx jne $setMargins cmp OFF_cp,ax jne $setMargins ; Line 257 mov ax,[rbx_ppap].dxaLeft1 add xaLeft,ax ; Line 273 $setMargins: ; Line 274 ; *** /* Now, set xaRight (width measured in twips). */
IFDEF CASHMERE test WORD PTR [rbx_ppap].rhc,15 je $L20005 mov ax,WORD PTR VSEPPAGE.xaMac sub ax,WORD PTR VSEPPAGE.dxaGutter jmp SHORT $L20006 $L20005: ENDIF
mov si,psep mov ax,[si].dxaText $L20006: sub ax,[rbx_ppap].dxaRight mov xaRight,ax ; Line 277 ; *** /* Do necessary checks on xaLeft and xaRight */
; *********** Register variables ******************** rcx_xaRightMax EQU cx ; **************************************************** mov rcx_xaRightMax,c_xaRightMax cmp ax,rcx_xaRightMax jbe $I859 ; Line 279 mov xaRight,rcx_xaRightMax ; Line 281 $I859: ; *********** Register variables ******************** rax_xaLeft EQU ax ; **************************************************** mov rax_xaLeft,xaLeft cmp rax_xaLeft,rcx_xaRightMax jbe $I861 ; Line 283 mov xaLeft,rcx_xaRightMax ; Line 285 $I861: cmp rax_xaLeft,0 jge $I863 ; Line 287 xor rax_xaLeft,rax_xaLeft mov xaLeft,rax_xaLeft ; Line 289 $I863: cmp xaRight,rax_xaLeft jae $I865 ; Line 291 inc rax_xaLeft mov xaRight,rax_xaLeft ; Line 294 $I865: push xaLeft push dxpFormat push dxaFormat call FAR PTR MULTDIV mov ifi.xpLeft_Ifi,ax mov ifi.xp,ax mov WORD PTR VFLI.xpLeft_Fli,ax ; Line 295 push xaLeft push DXPPRPAGE push DXAPRPAGE call FAR PTR MULTDIV mov ifi.xpPr,ax ; Line 296 push xaRight push dxpFormat push dxaFormat call FAR PTR MULTDIV mov ifi.xpRight_Ifi,ax mov WORD PTR VFLI.xpMarg,ax ; Line 297 push xaRight push DXPPRPAGE push DXAPRPAGE call FAR PTR MULTDIV mov ifi.xpPrRight,ax ; Line 300 ; *** /* Get a pointer to the tab-stop table. */ mov ax,ppap add ax,rgtbd mov ptbd,ax ; Line 303 ; *** /* Turn off justification. */ cmp fFlmPrinting,0 je $L20007 mov ax,VHDCPRINTER jmp SHORT $L20008 $L20007: mov ax,VHMDC $L20008: push ax xor ax,ax push ax push ax call FAR PTR SETTEXTJUSTIFICATION ; Line 306 ; *** /* Initialize the line height information. */ xor ax,ax mov dypDescentMac,ax mov dypAscentMac,ax ; Line 309 ; *** /* To tell if there were any tabs */ mov ifi.ichLeft,65535 ; Line 312 ; *** /* Get the first run, and away we go... */ push doc push SEG_cp push OFF_cp push ichCp jmp SHORT $L20037
$NullRun: ; Line 357 mov ax,c_cpNil push ax push ax ; high word of cpNil push ax xor ax,ax push ax $L20037: mov ax,11 push ax call FAR PTR FETCHCP $FirstCps: ; Line 360 mov cchUsed,0 ; Line 364 ; *** /* Continue fetching runs until a run is found with a nonzero ; *** length */ mov ax,VCCHFETCH mov cch,ax or ax,ax je $NullRun mov ax,VPCHFETCH mov pch,ax ; Line 371 mov ax,WORD PTR VCPFETCH mov dx,WORD PTR VCPFETCH+2 cmp SEG_cpMac,dx jg $I886 jl $L20009 cmp OFF_cpMac,ax jbe $L20009 cmp fFlmPrinting,0 jne $I886 mov bx,pch cmp BYTE PTR [bx],c_chSect jne $I886 $L20009: ; Line 374 ; *** /* Force end mark to be in standard system font */ ; *** macro blt destroys ax,bx,cx,es blt <OFFSET VCHPNORMAL>,<OFFSET VCHPABS>,c_cwCHP ; Line 375 IFDEF SYSENDMARK ; *** vchpAbs.ftc = ftcSystem; mov BYTE PTR VCHPABS.ftc,248 ; 0x3e << 2 == 0xF8 == 248 ELSE ; *** vchpAbs.ftc = 0; and BYTE PTR VCHPABS.ftc,3 ENDIF ; Line 376 ; *** vchpAbs.ftcXtra = 0; and BYTE PTR VCHPABS.ftcXtra,248
; *** vchpAbs.hps = hpsDefault; mov BYTE PTR VCHPABS.hps,c_hpsDefault ; Line 394 $I886: ; *** not from original c code: copy VCHPABS into chpLocal ; *** and use chpLocal hereafter *********** ; *** macro blt destroys ax,bx,cx,es lea dx,chpLocal blt <OFFSET VCHPABS>,dx,c_cwCHP ; Line 375 ; *** vchpAbs.ftc = 0; cmp fFlmPrinting,0 je $I888 ; Line 396 push doc lea ax,chpLocal push ax mov ax,3 push ax call FAR PTR LOADFONT ; Line 397 mov ax,WORD PTR VFMIPRINT.dypAscent_Fmi add ax,WORD PTR VFMIPRINT.dypLeading mov dypAscent,ax ; Line 398 mov ax,WORD PTR VFMIPRINT.dypDescent_Fmi jmp SHORT $L20038 $I888: ; Line 402 push doc lea ax,chpLocal push ax mov ax,2 push ax call FAR PTR LOADFONT ; Line 403 mov ax,WORD PTR VFMISCREEN.dypAscent_Fmi add ax,WORD PTR VFMISCREEN.dypLeading mov dypAscent,ax ; Line 404 mov ax,WORD PTR VFMISCREEN.dypDescent_Fmi $L20038: mov dypDescent,ax
ifdef ENABLE /* BRYANL 8/27/27; see comment in C source */ ; *** /* Bail out if there is a memory failure. */ cmp VFOUTOFMEMORY,0 je $I889 jmp $DoBreak $I889: endif ; ENABLE
; Line 408 ; lines 408-417 removed ; Line 418 ; *** /* Floating line size algorithm */ ; *** if (chpLocal.hpsPos != 0)
test BYTE PTR chpLocal.hpsPos,-1 je $I895 ; Line 421 ; *** /* Modify font for subscript/superscript */ ; *** if (chpLocal.hpsPos < hpsNegMin)
mov al,BYTE PTR chpLocal.hpsPos cmp al,c_hpsNegMin jae $I894 ; Line 423 mov ax,ypSubSuperFormat add dypAscent,ax ; Line 425 jmp SHORT $I895 $I894: ; Line 427 mov ax,ypSubSuperFormat add dypDescent,ax ; Line 428 $I895: ; *** /* Update the maximum ascent and descent of the line. */ ; Line 432 mov fSizeChanged,0 ; Line 433 mov ax,dypDescent cmp dypDescentMac,ax jge $I896 ; Line 435 mov dypDescentMac,ax ; Line 436 mov fSizeChanged,1 ; Line 438 $I896: mov ax,dypAscent cmp dypAscentMac,ax jge $I897 ; Line 440 mov dypAscentMac,ax ; Line 441 mov fSizeChanged,1 ; Line 444 ; dypUser EQU bp-88 ; dypAuto EQU bp-90 ; *********** Register variables ******************** rsi_dypAuto EQU si rdi_dypUser EQU di ; **************************************************** $I897: cmp fSizeChanged,0 je $OldRun ; Line 485 mov rsi_dypAuto,dypDescentMac add rsi_dypAuto,dypAscentMac ; Line 487 mov bx,ppap mov ax,WORD PTR [bx].dyaLine cmp ax,c_czaLine jle $I898 push ax push dypFormat push dyaFormat call FAR PTR MULTDIV push ax mov ax,1 push ax call FAR PTR IMAX mov rdi_dypUser,ax ; Line 490 cmp rsi_dypAuto,rdi_dypUser jle $L20011 $I898: mov ifi.dypLineSize,rsi_dypAuto jmp SHORT $L20012 $L20011: mov ifi.dypLineSize,rdi_dypUser $L20012: ; Line 496 $OldRun: ; Line 498 ; *** /* Calculate length of the run but no greater than 256 */ mov ax,WORD PTR VCPFETCH sub ax,WORD PTR VFLI ; Line 499 cmp ax,255 jl $I902 ; Line 501 mov ax,254 ; Line 503 $I902: mov iichNew,ax sub ax,ifi.ich_Ifi mov dich,ax ; Line 509 ; *** /* Ensure that all tab and non-required ; *** hyphen characters start at ; *** beginning of run */ cmp WORD PTR $S784_ichpFormat,0 jle $L20013 or ax,ax jg $L20013 lea ax,chpLocal push ax mov ax,10 imul WORD PTR $S784_ichpFormat mov bx,VHGCHPFORMAT add ax,[bx] sub ax,10 push ax mov ax,7 push ax call FAR PTR CCHDIFFER or ax,ax jne $L20013 mov bx,pch cmp BYTE PTR [bx],9 je $L20013 cmp BYTE PTR [bx],31 je $+5 jmp $I905 ; pchp EQU bp-92 ; register si=pchp $L20013: ; Line 511 mov ax,ICHPMACFORMAT cmp WORD PTR $S784_ichpFormat,ax jne $L20014 call FGrowFormatHeap or ax,ax jne $+5 jmp $I905 $L20014: ; Line 514 ; *********** Register variables ******************** rsi_pchp EQU si ; **************************************************** mov ax,10 imul WORD PTR $S784_ichpFormat mov rsi_pchp,ax sub rsi_pchp,10 mov bx,VHGCHPFORMAT add rsi_pchp,[bx] ; si = pch ; Line 516 cmp WORD PTR $S784_ichpFormat,0 jle $I907 ; Line 518 mov ax,ifi.ich_Ifi sub ax,ifi.ichPrev mov BYTE PTR [rsi_pchp].cchRun,al ; Line 519 mov al,BYTE PTR (ifi.ichPrev) mov BYTE PTR [rsi_pchp].ichRun,al ; Line 521 $I907: add rsi_pchp,10 ; *** macro blt destroys ax,bx,cx,es mov dx,rsi_pchp lea ax,chpLocal ; ax not destroyed in blt until after value used blt ax,dx,c_cwCHP
; Line 529 or BYTE PTR [rsi_pchp].cchRun,255 ; Line 530 cmp dich,0 jg $I908 ; Line 532 mov al,BYTE PTR (ifi.ich_Ifi) jmp SHORT $L20048 $I908: ; Line 537 ; *** bltc (&vfli.rgdxp[ifi.ich],0,dich)
mov dx,ifi.ich_Ifi shl dx,1 add dx,OFFSET VFLI.rgdxp ; *** macro bltc destroys ax,es,cx bltc dx,0,dich ; Line 538 ; *** bltbc (&vfli.rgch[ifi.ich],0,dich) mov dx,ifi.ich_Ifi add dx,OFFSET VFLI.rgch ;*** macro bltbc destroys ax,es,cx bltbc dx,0,dich
; Line 539 mov ax,iichNew mov ifi.ich_Ifi,ax $L20048: mov BYTE PTR [rsi_pchp].ichRun,al ; Line 541 mov ax,ifi.ich_Ifi mov ifi.ichPrev,ax ; Line 542 inc WORD PTR $S784_ichpFormat ; Line 544 $I905: ; Line 546 mov ax,WORD PTR VCPFETCH mov dx,WORD PTR VCPFETCH+2 cmp SEG_cpMac,dx jle $+5 jmp $I911 jl $L20016 cmp OFF_cpMac,ax jbe $+5 jmp $I911 $L20016: ; Line 549 cmp ifi.fPrevSpace,0 je $L20015 ; *** note ax:dx still holds vcpFetch cmp SEG_cp,dx jne $I912 cmp OFF_cp,ax jne $I912 $L20015: ; Line 551 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichReal,ax ; Line 552 mov ax,ifi.xp mov ifi.xpReal_Ifi,ax mov WORD PTR VFLI.xpReal_Fli,ax ; Line 554 $I912: cmp fFlmPrinting,0 jne $I913 ;mov ax,DOCHELP ;cmp doc,ax ;je $I913 ; Line 556 mov bx,ifi.ich_Ifi mov BYTE PTR VFLI.rgch[bx],c_chEmark ; Line 558 mov ax,c_chEmark push ax xor ax,ax push ax call FAR PTR DxpFromCh mov bx,ifi.ich_Ifi inc ifi.ich_Ifi shl bx,1 mov WORD PTR VFLI.rgdxp[bx],ax add WORD PTR VFLI.xpReal_Fli,ax ; Line 560 $I913: mov ax,ifi.dypLineSize mov WORD PTR VFLI.dypLine,ax ; Line 561 mov ax,dypDescentMac mov WORD PTR VFLI.dypBase,ax ; Line 562 mov ax,dypAscentMac add ax,dypDescentMac mov WORD PTR VFLI.dypFont,ax ; Line 563 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichReal,ax mov WORD PTR VFLI.ichMac,ax ; Line 564 mov ax,OFF_cpMac mov dx,SEG_cpMac add ax,1 adc dx,0 mov WORD PTR VFLI.cpMac_OFF,ax mov WORD PTR VFLI.cpMac_SEG,dx ; Line 565 jmp $JustEol $I911: mov ax,ifi.ich_Ifi add ax,cch cmp ax,255 jle $I916 ; Line 573 mov ax,255 sub ax,ifi.ich_Ifi mov cch,ax ; Line 574 mov fTruncated,1 ; Line 577 $I916: mov ifi.ichFetch,0 ; Line 603 ; *** if (chpLocal.fSpecial) test BYTE PTR chpLocal.fSpecial,mask_0100_0000 jne $+5 jmp $GetCh ; Line 605 lea ax,ifi push ax push flm mov ax,WORD PTR VSEPABS mov cl,11 shr ax,cl and ax,7 push ax call FAR PTR FFORMATSPECIALS or ax,ax je $+5 jmp $GetCh ; Line 607 cmp ifi.chBreak,0 jne $+5 jmp $Unbroken $I986: mov ax,ifi.ichFetch sub ax,WORD PTR VFLI.cpMac_OFF add ax,WORD PTR VCPFETCH mov WORD PTR VFLI.dcpDepend,ax ; Line 1026 $JustBreak: ; Line 1027 cmp WORD PTR ifi.chBreak,31 je $+5 jmp $I992 ; Line 1032 mov ax,45 push ax push fFlmPrinting call FAR PTR DxpFromCh ; *** ax will have width of hyphen
; **** up to line 1036 rearranged bz mov bx,WORD PTR VFLI.ichReal ; Line 1035 mov WORD PTR VFLI.ichMac,bx ; ** ichMac = ichReal
dec bx ; ichReal - 1 mov BYTE PTR VFLI.rgch[bx],45 ; ** rgch[ichReal-1] = "-
shl bx,1 mov WORD PTR VFLI.rgdxp[bx],ax add ifi.xpReal_Ifi,ax ; Line 1033 mov ax,ifi.xpReal_Ifi mov WORD PTR VFLI.xpReal_Fli,ax mov WORD PTR VFLI.xpRight,ax
; Line 1036 mov ax,WORD PTR $S784_ichpFormat dec ax cmp ichpNRH,ax jge $I992 ; pchp EQU bp-112 ; *********** Register variables ******************** rdi_pchp EQU di ; **************************************************** ; register di=pchp ; =-114 ; =-116 ; Line 1039 ; ** register struct CHP *pchp=&(**vhgchpFormat)[ichpNRH] mov ax,10 imul ichpNRH mov rdi_pchp,ax mov bx,VHGCHPFORMAT add rdi_pchp,[bx] ; Line 1041 ; ** pchp->cchRun++; inc BYTE PTR [rdi_pchp].cchRun ; Line 1042 ; ** if (pchp->ichRun >= vfli.ichMac) mov dx,WORD PTR VFLI.ichMac cmp BYTE PTR [rdi_pchp].ichRun,dl jb $I992 ; Line 1044 ; ** pchp->ichRun = vfli.ichMac - 1; dec dx mov BYTE PTR [rdi_pchp].ichRun,dl ; Line 1046 $I992: ; Line 1049 cmp fFlmPrinting,0 je $I993 ; Line 1051 mov ax,WORD PTR VFLI.ichReal mov WORD PTR VFLI.ichMac,ax ; Line 1057 $I993: cmp ifi._jc,c_jcTabLeft jne $+5 jmp $I994 ; Line 1061 $L20051: lea ax,ifi push ax push xpTab jmp $L20046 ; ch=-94 ; *********** Register variables ******************** rsi_ch EQU si ; **************************************************** ; register si=ch $I877: ; Line 625 mov bx,ifi.ichFetch inc ifi.ichFetch mov di,pch mov al,[bx][di] sub ah,ah mov rsi_ch,ax ; Line 627 $NormChar: ; Line 628 cmp rsi_ch,c_chSpace jne $NotSpace ; Line 632 cmp fFlmPrinting,0 je $L20017 mov ax,WORD PTR VFMIPRINT+2 jmp SHORT $L20018 $L20017: mov ax,WORD PTR VFMISCREEN+2 $L20018: mov dxp,ax mov bx,ifi.ich_Ifi shl bx,1 mov WORD PTR VFLI.rgdxp[bx],ax add ifi.xp,ax ; Line 633 mov ax,WORD PTR VFMIPRINT+2 mov dxpPr,ax add ifi.xpPr,ax ; Line 634 mov bx,ifi.ich_Ifi inc ifi.ich_Ifi mov BYTE PTR VFLI.rgch[bx],c_chSpace
; Line 635 jmp $BreakOppr
$NotSpace: ; Line 641 cmp rsi_ch,c_chSpace jl $L20019 cmp rsi_ch,128 jge $L20019 mov bx,WORD PTR VFMIPRINT shl rsi_ch,1 mov ax,WORD PTR [bx][rsi_ch] shr rsi_ch,1 mov dxpPr,ax cmp ax,dxpNil jne $I928 $L20019: ; Line 643 push rsi_ch mov ax,1 push ax call FAR PTR DxpFromCh mov dxpPr,ax ; Line 646 $I928: cmp fFlmPrinting,0 je $I929 ; Line 650 mov ax,dxpPr jmp SHORT $L20045 $I929: ; Line 653 cmp rsi_ch,c_chSpace jl $L20020 cmp rsi_ch,128 jge $L20020 mov bx,WORD PTR VFMISCREEN shl rsi_ch,1 mov ax,WORD PTR [bx][rsi_ch] shr rsi_ch,1 mov dxp,ax cmp ax,dxpNil jne $I931 $L20020: ; Line 654 push rsi_ch xor ax,ax push ax call FAR PTR DxpFromCh $L20045: mov dxp,ax ; Line 656 $I931: mov bx,ifi.ich_Ifi shl bx,1 ; *** here ax = dxp from above mov WORD PTR VFLI.rgdxp[bx],ax add ifi.xp,ax ; Line 657 mov ax,dxpPr add ifi.xpPr,ax ; Line 658 mov bx,ifi.ich_Ifi inc ifi.ich_Ifi mov ax,rsi_ch mov BYTE PTR VFLI.rgch[bx],al ; Line 662 cmp rsi_ch,45 jle $SwitchCh ; Line 1001 $DefaultCh: ; Line 1002 mov ax,ifi.xpPrRight cmp ifi.xpPr,ax jle $PChar ; Line 1003 $DoBreak: ; Line 1005 cmp ifi.chBreak,0 je $+5 jmp $I986 ; Line 1006 $Unbroken: ; Line 1011 mov ax,ifi.ich_Ifi dec ax push ax call FFirstIch or ax,ax jne $+5 jmp $I987 cmp ifi.ich_Ifi,255 jl $+5 jmp $I987 ; Line 1013 $PChar: ; Line 1087 mov ifi.fPrevSpace,0 ; Line 1089 jmp SHORT $GetCh
; ***** end for default case ************** $SwitchCh: mov ax,rsi_ch cmp ax,c_chSect jne $+5 jmp $SC942 jle $+5 jmp $L20028 cmp ax,c_chTab jne $+5 jmp $SC951 cmp ax,c_chEol jl $DefaultCh cmp ax,c_chNewLine jg $+5 jmp $SC971 jmp SHORT $DefaultCh $SC938: ; Line 671 dec ifi.ich_Ifi ; Line 672 mov ax,dxp sub ifi.xp,ax ; Line 673 mov ax,dxpPr sub ifi.xpPr,ax
page ; Line 674 $GetCh: ; ****** START of main FOR loop ******************** ; Line 335 mov ax,cch cmp ifi.ichFetch,ax je $+5 jmp $I877 ; Line 341 cmp ifi.ich_Ifi,255 jge $DoBreak ; Line 344 cmp fTruncated,0 jne $+5 jmp $NullRun ; Line 349 add cchUsed,ax ; Line 350 mov ax,cchUsed add ax,VPCHFETCH mov pch,ax ; Line 351 mov ax,VCCHFETCH sub ax,cchUsed mov cch,ax ; Line 352 mov fTruncated,0 ; Line 353 jmp $OldRun $SC939: ; Line 679 dec ifi.ich_Ifi ; Line 680 mov ax,dxp sub ifi.xp,ax ; Line 681 mov ax,dxpPr sub ifi.xpPr,ax ; Line 683 mov ax,WORD PTR $S784_ichpFormat dec ax mov ichpNRH,ax ; Line 684 mov ax,c_chHyphen push ax mov ax,1 push ax call FAR PTR DxpFromCh add ax,ifi.xpPr cmp ax,ifi.xpPrRight jle $+5 jmp $DoBreak ; Line 687 mov ax,ifi.xp mov xpPrev,ax ; Line 700 mov bx,ifi.ich_Ifi mov BYTE PTR VFLI.rgch[bx],c_chTab ; Line 701 jmp $Tab0 $SC942: ; Line 705 dec ifi.ich_Ifi ; Line 706 mov ax,dxp sub ifi.xp,ax ; Line 707 mov ax,dxpPr sub ifi.xpPr,ax ; Line 710 mov ax,dypDescentMac mov WORD PTR VFLI.dypBase,ax add ax,dypAscentMac mov WORD PTR VFLI.dypLine,ax mov WORD PTR VFLI.dypFont,ax ; Line 711 mov ax,ifi.ichFetch cwd add ax,WORD PTR VCPFETCH adc dx,WORD PTR VCPFETCH+2 mov WORD PTR VFLI.cpMac_OFF,ax mov WORD PTR VFLI.cpMac_SEG,dx ; Line 712 push ifi.ich_Ifi call FFirstIch or ax,ax jne $+5 jmp $I943 ; Line 715 mov ax,WORD PTR VFLI.fSplat mov al,1 mov WORD PTR VFLI.fSplat,ax ; Line 716 cmp fFlmPrinting,0 je $+5 jmp $I944 ;chT EQU bp-96 ;cch EQU bp-98 ;dxpCh EQU bp-100 ; Line 723 mov chT,c_chSplat ; Line 726 push chT xor ax,ax push ax call FAR PTR DxpFromCh mov dxpCh,ax ; Line 730 mov ax,17 imul DXPLOGINCH cwd sub ax,dx sar ax,1 cwd mov cx,dxpCh idiv cx cmp ax,223 jge $L20021 jmp SHORT $L20022 $L20021: mov ax,223 $L20022: mov cch2,ax ; Line 732 ; *** bltbc(&vfli.rgch[ifi.ich], chT, cch); mov dx,ifi.ich_Ifi add dx,OFFSET VFLI.rgch ;*** macro bltbc destroys ax,es,cx bltbc dx,<BYTE PTR (chT)>,cch2 ; Line 733 ; *** bltc(&vfli.rgdxp[ifi.ich], dxpCh, cch); mov dx,ifi.ich_Ifi shl dx,1 add dx,OFFSET VFLI.rgdxp ; *** macro bltc destroys ax,es,cx bltc dx,dxpCH,cch2 ; Line 734 mov ax,ifi.ich_Ifi add ax,cch2 mov WORD PTR VFLI.ichMac,ax ; Line 736 push VHMDC mov ax,OFFSET VFLI.rgch push ds push ax push cch2 call FAR PTR GETTEXTEXTENT mov WORD PTR VFLI.xpReal_Fli,ax ; Line 737 mov WORD PTR VFLI.xpLeft_Fli,0 ; Line 739 jmp $EndFormat $I944: ; Line 741 mov WORD PTR VFLI.ichMac,0 ; Line 743 jmp $EndFormat $I943: mov WORD PTR VFLI.fSplatNext, 1
mov ax,cchUsed dec ax cwd add WORD PTR VFLI.cpMac_OFF,ax adc WORD PTR VFLI.cpMac_SEG,dx ; Line 749 mov WORD PTR VFLI.dcpDepend,1 ; Line 750 cmp ifi.fPrevSpace,0 jne $I950 ; Line 752 mov ax,ifi.cchSpace mov ifi.cBreak_Ifi,ax ; Line 753 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichReal,ax ; Line 754 mov ax,ifi.xp mov ifi.xpReal_Ifi,ax mov WORD PTR VFLI.xpReal_Fli,ax ; Line 756 $I950: mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichMac,ax ; Line 757 mov ax,ifi.dypLineSize mov WORD PTR VFLI.dypLine,ax ; Line 758 jmp $JustBreak $SC951: ; Line 762 dec ifi.ich_Ifi ; Line 763 mov ax,dxp sub ifi.xp,ax ; Line 764 mov ax,dxpPr sub ifi.xpPr,ax ;xaTab EQU bp-102 ;xaPr EQU bp-104 ; pchp EQU bp-106 ; register di=pchp ; Line 766 mov ax,ifi.xpPrRight cmp ifi.xpPr,ax jl $+5 jmp $I952 ; Line 772 cmp ifi.fPrevSpace,0 jne $I956 ; Line 776 mov ax,ifi.cchSpace mov ifi.cBreak_Ifi,ax ; Line 777 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichReal,ax ; Line 778 mov ax,ifi.xp mov ifi.xpReal_Ifi,ax ; Line 781 $I956: cmp ifi._jc,c_jcTabLeft je $I957 ; Line 783 lea ax,ifi push ax push xpTab push flm call Justify ; Line 785 $I957: mov ax,ifi.xp mov xpPrev,ax ; Line 788 push ifi.xpPr push DXAPRPAGE push DXPPRPAGE call FAR PTR MULTDIV mov xaPr,ax ; Line 789 jmp SHORT $L20041 $WC958: mov ax,xaRight cmp xaTab,ax jb $I959 mov xaTab,ax $I959: ; Line 791 mov ax,xaPr cmp xaTab,ax jb $I960 ; Line 799 add ptbd,4 mov al, [bx].jc_Tbd sub ah,ah and ax,7 add ax,c_jcTabMin ;#ifdef ENABLE /* we do the mapping in HgtbdCreate */ ; cmp ax,c_jcTabDecimal ; je $I1958 ; mov ax,c_jcTabLeft ;#endif $I1958: mov ifi._jc,ax ; Line 800 jmp SHORT $TabFound $I960: add ptbd,4 ; Line 803 $L20041: mov bx,ptbd mov ax,[bx] mov xaTab,ax or ax,ax jne $WC958 ; Line 806 mov ax,xaPr sub dx,dx mov cx,WORD PTR VZATABDFLT div cx mul cx add ax,cx mov xaTab,ax ; Line 812 mov ifi._jc,c_jcTabLeft ; Line 814 $TabFound: ; Line 815 push xaTab push dxpFormat push dxaFormat call FAR PTR MULTDIV cmp ifi.xp,ax jle $I1961 mov ax,ifi.xp $I1961: mov xpTab,ax ; Line 822 cmp ifi._jc,c_jcTabLeft jne $I962 ; Line 825 mov ifi.xp,ax ; Line 826 push xaTab push DXPPRPAGE push DXAPRPAGE call FAR PTR MULTDIV mov ifi.xpPr,ax ; Line 828 $I962: mov ax,ifi.xp mov ifi.xpLeft_Ifi,ax ; Line 829 mov ax,ifi.ich_Ifi mov ifi.ichLeft,ax ; Line 830 mov ifi.cchSpace,0 ; Line 831 mov ifi.chBreak,0 ; Line 832 $Tab0: ; Line 833 mov ifi.fPrevSpace,0 ; Line 834 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichMac,ax ; Line 835 mov ax,ifi.xp mov WORD PTR VFLI.xpReal_Fli,ax ; Line 836 mov ax,ifi.dypLineSize mov WORD PTR VFLI.dypLine,ax ; Line 837 mov ax,dypDescentMac mov WORD PTR VFLI.dypBase,ax ; Line 838 mov ax,dypAscentMac add ax,dypDescentMac mov WORD PTR VFLI.dypFont,ax ; Line 841 cmp ifi.ichFetch,1 je $I963 mov ax,ICHPMACFORMAT cmp WORD PTR $S784_ichpFormat,ax jne $L20023 call FGrowFormatHeap or ax,ax je $I963 $L20023: ; Line 845 ; *********** Register variables ******************** ; rdi_pchp EQU di ; **************************************************** ; register di=pchp mov ax,10 imul WORD PTR $S784_ichpFormat mov rdi_pchp,ax sub rdi_pchp,10 mov bx,VHGCHPFORMAT add rdi_pchp,[bx] ; Line 846 cmp WORD PTR $S784_ichpFormat,0 jle $I964 ; Line 849 mov al,BYTE PTR (ifi.ichPrev) mov BYTE PTR [rdi_pchp].ichRun,al ; Line 850 mov ax,ifi.ich_Ifi sub ax,ifi.ichPrev mov BYTE PTR [rdi_pchp].cchRun,al ; Line 853 $I964: add rdi_pchp,10 ; ** ++pchp lea ax,chpLocal ; ax not destroyed in blt until after value used ;*** macro blt destroys ax,bx,cx,es blt ax,rdi_pchp,c_cwCHP
; Line 854 inc WORD PTR $S784_ichpFormat ; Line 856 jmp SHORT $I965 $I963: ; Line 858 mov ax,10 imul WORD PTR $S784_ichpFormat mov rdi_pchp,ax sub rdi_pchp,10 mov bx,VHGCHPFORMAT add rdi_pchp,[bx] ; Line 859 $I965: ; Line 860 mov al,BYTE PTR (ifi.ich_Ifi) mov BYTE PTR [rdi_pchp].ichRun,al ; Line 861 or BYTE PTR [rdi_pchp].cchRun,255
; Line 867 mov bx,ifi.ich_Ifi inc ifi.ich_Ifi mov ifi.ichPrev,bx shl bx,1 mov ax,ifi.xp sub ax,xpPrev mov WORD PTR VFLI.rgdxp[bx],ax ; Line 869 cmp rsi_ch,c_chTab jne $BreakOppr jmp $GetCh $I952: ; Line 878 mov rsi_ch,160 ; Line 879 jmp $NormChar $SC968: ; Line 883 mov ax,ifi.xpPrRight cmp ifi.xpPr,ax jle $+5 jmp $DoBreak ; Line 885 $BreakOppr: ; Line 891 cmp ifi.ich_Ifi,255 jl $+5 jmp $Unbroken ; Line 893 $SC971: ; Line 898 mov ifi.chBreak,rsi_ch ; Line 899 mov ax,ifi.ichFetch add ax,cchUsed cwd add ax,WORD PTR VCPFETCH adc dx,WORD PTR VCPFETCH+2 mov WORD PTR VFLI.cpMac_OFF,ax mov WORD PTR VFLI.cpMac_SEG,dx ; Line 900 mov ax,ifi.xp mov WORD PTR VFLI.xpReal_Fli,ax ; Line 901 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichMac,ax ; Line 902 mov ax,ifi.dypLineSize mov WORD PTR VFLI.dypLine,ax ; Line 904 mov ax,dypDescentMac mov WORD PTR VFLI.dypBase,ax add ax,dypAscentMac mov WORD PTR VFLI.dypFont,ax ; Line 906 cmp rsi_ch,45 je $L20024 cmp rsi_ch,31 jne $I972 $L20024: ; Line 908 mov ax,ifi.cchSpace mov ifi.cBreak_Ifi,ax ; Line 909 mov ax,ifi.ich_Ifi mov WORD PTR VFLI.ichReal,ax ; Line 910 mov ax,ifi.xp mov ifi.xpReal_Ifi,ax mov WORD PTR VFLI.xpReal_Fli,ax ; Line 912 jmp $GetCh $I972: ; Line 914 cmp ifi.fPrevSpace,0 jne $I974 ; Line 916 mov ax,ifi.cchSpace mov ifi.cBreak_Ifi,ax ; Line 917 mov ax,ifi.ich_Ifi dec ax mov WORD PTR VFLI.ichReal,ax ; Line 918 mov ax,ifi.xp mov WORD PTR VFLI.xpReal_Fli,ax sub ax,dxp mov ifi.xpReal_Ifi,ax ; Line 920 ;chT EQU bp-108 ;dxpNew EQU bp-110 $I974: cmp rsi_ch,10 je $L20025 cmp rsi_ch,11 jne $I975 $L20025: ; Line 943 mov chT2,c_chSpace ; Line 946 push chT2 push fFlmPrinting call FAR PTR DxpFromCh ; *** ax will contain dxpNew at this point **** ; Line 948 mov bx,ifi.ich_Ifi mov dl,BYTE PTR (chT2) mov BYTE PTR VFLI.rgch[bx-1],dl ; Line 950 shl bx,1 ;** difference was -1 in c - shifted to get -2 mov WORD PTR VFLI.rgdxp[bx-2],ax ; ax has dxpNew
cmp ifi.fPrevSpace,0 ; only reset vfli.xp/ich real if not prev sp jne $TestEol
sub ax,dxp add WORD PTR VFLI.xpReal_Fli,ax ; Line 956 mov ax,ifi.ich_Ifi dec ax mov WORD PTR VFLI.ichReal,ax ; Line 961 $TestEol: cmp rsi_ch,10 je $+5 jmp $JustBreak ; Line 963 $JustEol: ; Line 964 cmp fFlmPrinting,0 je $I979 ; Line 966 mov ax,WORD PTR VFLI.ichReal mov WORD PTR VFLI.ichMac,ax ; Line 972 $I979: cmp ifi._jc,c_jcTabLeft je $+5 jmp $L20051 ; Line 980 mov bx,ppap mov al,BYTE PTR [bx].jc_Pap and ax,3 ; pick up low 2 bits in ax mov ifi._jc,ax cmp ax,3 je $I996 jmp SHORT $L20050 $I975: inc ifi.cchSpace ; Line 995 mov ifi.fPrevSpace,1 ; Line 1093 jmp $GetCh $I987: mov ax,ifi.ichFetch add ax,cchUsed cwd add ax,WORD PTR VCPFETCH adc dx,WORD PTR VCPFETCH+2 sub ax,1 sbb dx,0 mov WORD PTR VFLI.cpMac_OFF,ax mov WORD PTR VFLI.cpMac_SEG,dx ; Line 1016 mov ax,ifi.ich_Ifi dec ax mov WORD PTR VFLI.ichMac,ax mov WORD PTR VFLI.ichReal,ax ; Line 1017 mov ax,ifi.dypLineSize mov WORD PTR VFLI.dypLine,ax ; Line 1019 mov ax,dypDescentMac mov WORD PTR VFLI.dypBase,ax add ax,dypAscentMac mov WORD PTR VFLI.dypFont,ax ; Line 1020 mov WORD PTR VFLI.dcpDepend,1 ; Line 1021 mov ax,ifi.xp sub ax,dxp mov ifi.xpReal_Ifi,ax mov WORD PTR VFLI.xpReal_Fli,ax $I994: mov bx,ppap mov al,BYTE PTR [bx].jc_Pap and ax,3 mov ifi._jc,ax $L20050: or ax,ax je $I996 ; Line 1065 lea ax,ifi push ax push ifi.xpRight_Ifi $L20046: push flm call Justify ; Line 1067 $I996: mov ax,ifi.xpRight_Ifi $L20043: mov WORD PTR VFLI.xpRight,ax ; Line 1068 $EndFormat: ; Line 1069 mov ax,ifi.ichLeft mov WORD PTR VFLI.ichLastTab,ax jmp SHORT $ScribRet ; Scribble and return $L20028: cmp ax,13 jne $+5 jmp $SC938 cmp ax,31 jne $+5 jmp $SC939 cmp ax,45 jne $+5 jmp $SC968 jmp $DefaultCh $ScribRet: IFDEF DEBUG IFDEF SCRIBBLE mov ax,5 push ax mov ax,c_chSpace push ax call FAR PTR FNSCRIBBLE ENDIF ENDIF ; Line 1096 $RetFormat: cEnd FormatLine
subttl Justify() page ; *** ; Function Justify ; ; near Justify(pifi, xpTab, flm) ; struct IFI *pifi; ; unsigned xpTab; ; int flm; ; ; ***
; Line 1101 cProc Justify,<PUBLIC,NEAR>,<di,si> parmDP pifi parmW xpTab parmW flm
LocalW cWideSpaces LocalW cxpQuotient ; *********** Register variables ******************** rbx_pifi EQU bx rdx_dxp EQU dx ; **************************************************** cBegin Justify ; Line 1109 mov rbx_pifi,pifi ; Line 1110 mov ax,[rbx_pifi]._jc cmp ax,c_jcBoth je $JcBothCase cmp ax,c_jcCenter je $JcCenterCase cmp ax,c_jcRight je $JcRightCase cmp ax,c_jcTabDecimal jne $JustCaseBrk ; Line 1130 JcTabDecCase: ; *********** Register variables ******************** rsi_ichT EQU si ; **************************************************** mov rdx_dxp,xpTab sub rdx_dxp,[rbx_pifi].xpLeft_Ifi ; Line 1132 mov rsi_ichT,[rbx_pifi].ichLeft inc rsi_ichT $TabDecFor: cmp rsi_ichT,WORD PTR VFLI.ichReal jge $JustCaseBrk mov al,VCHDECIMAL cmp BYTE PTR VFLI.rgch[rsi_ichT],al je $JustCaseBrk ; Line 1134 shl rsi_ichT,1 sub rdx_dxp,WORD PTR VFLI.rgdxp[rsi_ichT] shr rsi_ichT,1 ; Line 1135 inc rsi_ichT jmp SHORT $TabDecFor
$JcCenterCase: ; Line 1139 mov rdx_dxp,xpTab sub rdx_dxp,[rbx_pifi].xpReal_Ifi or rdx_dxp,rdx_dxp jg $+5 jmp $JustifyRet ; **** EXIT POINT ***************************** ; Line 1141 sar rdx_dxp,1 ; Line 1144
$JustCaseBrk: ; Line 1212 cmp rdx_dxp,0 jle $+5 jmp $JustCleanup ; Line 1215 jmp $JustifyRet ; **** EXIT POINT *****************************
$JcRightCase: ; Line 1147 mov rdx_dxp,xpTab sub rdx_dxp,[rbx_pifi].xpReal_Ifi ; Line 1148 jmp SHORT $JustCaseBrk
$JcBothCase: ; *********** Register variables ******************** rdi_pch EQU di rsi_pdxp EQU si ; *************************************************** ; **** NOTE: the only way out of this section of code ; **** is through a RETURN of function Justify ; Line 1151 cmp WORD PTR [rbx_pifi].cBreak_Ifi,0 jne $+5 jmp $JustifyRet ; **** EXIT POINT ***************************** ; Line 1154 mov rdx_dxp,xpTab sub rdx_dxp,[rbx_pifi].xpReal_Ifi or rdx_dxp,rdx_dxp jg $+5 jmp $JustifyRet ; **** EXIT POINT ***************************** ; Line 1160 add [rbx_pifi].xp,rdx_dxp ; Line 1164 add WORD PTR VFLI.xpReal_Fli,rdx_dxp ; Line 1165 ; Line 1176 ; register CHAR *pch = &vfli.rgch[vfli.ichReal] ; register int *pdxp = &vfli.rgdxp[vfli.ichReal]
mov rdi_pch,WORD PTR VFLI.ichReal mov rsi_pdxp,rdi_pch
add rdi_pch,OFFSET VFLI.rgch
shl rsi_pdxp,1 add rsi_pdxp,OFFSET VFLI.rgdxp
; ************ dx /(dxp) will be wiped out and restored here !!!!!!!!!!!!!!! push dx ; save for use as dxpT
mov ax,dx ; ** set up division cwd mov cx,[rbx_pifi].cBreak_Ifi idiv cx mov WORD PTR VFLI.dxpExtra,ax ; ** at this point: ; ** ax = quotient, dx = remainder, cx = cbreak inc ax
; *********** Register variables ******************** rdx_dxpT EQU dx ; ***************************************************
mov cxpQuotient,ax mov cWideSpaces,dx
pop dx ; restore for use as dxpT
; Line 1183 mov BYTE PTR VFLI.fAdjSpace,c_True ; Line 1185 ; ***** NOTE: the only way out of this loop is via a RETURN out of ; ***** function Justify ; * the immediately following loop accomplishes about the same thing as ; ** Loop: ; dec rdi_pch ; sub rsi_pdxp,2 ; cmp BYTE PTR [rdi_pch],c_chSpace ; jne Loop ; * it should be faster for strings of > 2 characters.
dec rdi_pch ; since predecrement to start pch correctly mov ax,ds mov es,ax ; set up for string instruction std ; use reverse direction for decrementing di $JstForLoop: mov cx,-1 ; counter set up 1 below (trick) mov al,c_chSpace ; comparison value repnz scasb ; dec di while not = space inc cx ; restore from original -1 shl cx,1 ; si is a word ptr - double offset add rsi_pdxp,cx ; at this point, pch points 1 below ; the character containing the space, ; pdxp points to the entry for the space char ; Line 1192 mov ax,cWideSpaces dec cWideSpaces or ax,ax jne $I1032 ; Line 1194 dec cxpQuotient ; Line 1195 push rsi_pdxp ; find first nonzero ich after pch cld $FindIch1: inc rsi_pdxp inc rsi_pdxp cmp WORD PTR [rsi_pdxp],0 je $FindIch1 mov ax,rsi_pdxp sub ax,OFFSET VFLI + rgdxp shr ax,1 std pop rsi_pdxp
mov BYTE PTR VFLI.ichFirstWide,al
; Line 1197 $I1032: mov ax,cxpQuotient add [rsi_pdxp],ax ; Line 1198 sub rdx_dxpT,ax cmp rdx_dxpT,0 jg $I1033 ; Line 1200 cmp WORD PTR [rbx_pifi].cBreak_Ifi,1 jle $JustifyRet ; **** EXIT POINT ***************************** ; Line 1202 push rsi_pdxp ; find first nonzero ich after pch cld $FindIch2: inc rsi_pdxp inc rsi_pdxp cmp WORD PTR [rsi_pdxp],0 je $FindIch2 mov ax,rsi_pdxp sub ax,OFFSET VFLI + rgdxp shr ax,1 pop rsi_pdxp
mov BYTE PTR VFLI.ichFirstWide,al ; Line 1204 jmp SHORT $JustifyRet ; **** EXIT POINT ***************************** $I1033: dec WORD PTR [rbx_pifi].cBreak_Ifi ; Line 1208 jmp SHORT $JstForLoop ; *** end of for loop **********
; *********** Register variables ******************** rbx_pifi EQU bx rdx_dxp EQU dx ; ****************************************************
$JustCleanup: add [rbx_pifi],rdx_dxp mov ax,rdx_dxp ; Line 1220 test flm,1 ;* if (flm & flmPrinting) jne $L20052 ; Line 1228 push rdx_dxp ; save - wiped out by multiply
push rdx_dxp mov ax,c_czaInch push ax push DXPLOGINCH call FAR PTR MULTDIV push ax push DXPPRPAGE push DXAPRPAGE call FAR PTR MULTDIV
mov rbx_pifi,pifi ; restore in case multdiv wipes out bx pop rdx_dxp ; restore - wiped out by multdiv $L20052: add [rbx_pifi].xpPr,ax ; Line 1231 cmp WORD PTR [rbx_pifi].ichLeft,0 jge $I1038 ; Line 1234 add WORD PTR VFLI.xpLeft_Fli,rdx_dxp ; Line 1236 jmp SHORT $I1039 $I1038: ; Line 1239 mov bx,[rbx_pifi].ichLeft ; *** here, bx is no longer pifi **** shl bx,1 add WORD PTR VFLI.rgdxp[bx],rdx_dxp ; Line 1240 $I1039: ; Line 1241 add WORD PTR VFLI.xpReal_Fli,rdx_dxp ; Line 1242 $JustifyRet: cld ; reset to be nice to later routines cEnd Justify
; Line 1247 subttl FGrowFormatHeap() page
; *** ; Function FGrowFormatHeap ; ; int near FGrowFormatHeap() ; /* Grow vhgchpFormat by 20% */ ; ; ***
cProc FGrowFormatHeap,<PUBLIC,NEAR> cBegin FGrowFormatHeap
; *********** Register variables ******************** rsi_cchpIncr EQU si ; ****************************************************
; Line 1249 mov ax,ICHPMACFORMAT cwd mov cx,5 idiv cx inc ax mov rsi_cchpIncr,ax ; Line 1255 push VHGCHPFORMAT add ax,ICHPMACFORMAT imul cx push ax xor ax,ax push ax call FAR PTR FCHNGSIZEH or ax,ax jne $I1043 ; Line 1260 xor ax,ax jmp SHORT $EX1040 $I1043: add ICHPMACFORMAT,rsi_cchpIncr ; Line 1263 mov ax,1 $EX1040: cEnd FGrowFormatHeap
; Line 1269 subttl DxpFromCh() page
; *** ; Function DxpFromCh ; ; int DxpFromCh(ch, fPrinter) ; int ch; ; int fPrinter; ; ; ***
cProc DxpFromCh,<PUBLIC,FAR> parmW chIn parmW fPrinter
LocalW dxpDummy LocalW dxp cBegin DxpFromCh
; *********** Register variables ******************** rbx_pdxp EQU bx ; ****************************************************
; Line 1276 cmp chIn,c_chSpace jg $L20029 cmp chIn,c_chNRHFile jge $L20026 cmp chIn,c_chTab jl $L2029A cmp chIn,c_chReturn jg $L2029A $L20026: cmp fPrinter,0 je $L20027 mov rbx_pdxp,OFFSET VFMIPRINT+2 jmp SHORT $I1050 $L20027: mov rbx_pdxp,OFFSET VFMISCREEN+2 jmp SHORT $I1050 $L20029: cmp chIn,256 ; prev 128 (chFmiMax) ..pault ; We now make sure the whole character set width ; table is queried initially via GetCharWidth() jl $I1049 ; Line 1279 $L2029A: lea rbx_pdxp,dxpDummy ; Line 1280 mov WORD PTR [rbx_pdxp],dxpNil ; Line 1282 jmp SHORT $I1050 $I1049: ; Line 1285 cmp fPrinter,0 je $L20030 mov rbx_pdxp,WORD PTR VFMIPRINT jmp SHORT $L20031 $L20030: mov rbx_pdxp,WORD PTR VFMISCREEN $L20031: mov ax,chIn shl ax,1 add rbx_pdxp,ax ; Line 1286 $I1050: ; Line 1288 cmp WORD PTR [rbx_pdxp],dxpNil jne $I1051 ; Line 1295 push bx ; save pdxp
cmp fPrinter,0 je $L20032 push VHDCPRINTER lea ax,chIn push ss push ax mov ax,1 push ax call FAR PTR GETTEXTEXTENT sub ax,WORD PTR VFMIPRINT+4 jmp SHORT $L20033 $L20032: push VHMDC lea ax,chIn push ss push ax mov ax,1 push ax call FAR PTR GETTEXTEXTENT sub ax,WORD PTR VFMISCREEN+4 $L20033: pop bx ; restore pdxp ; Line 1297 ;or ax,ax ; ax == dxp ;jl $I1053 ;cmp ax,dxpNil ;jge $I1053 ; Line 1300 mov [rbx_pdxp],ax ; Line 1303 $I1053: jmp SHORT $DxpRet $I1051: mov ax,WORD PTR [rbx_pdxp] $DxpRet: cEnd DxpFromCh
subttl FFirstIch() page ; Line 1312
; *** ; Function FFirstIch ; ; int near FFirstIch(ich) ; int ich; ; { ; /* Returns true iff ich is 0 or preceded only by 0 width characters */ ; ; REGISTER USAGE ****************************** ; uses and restores: di ; uses and destroys: ax, cx, es ; ax = temp, return ; cx = ich ; di = pdxp ; ; Note: this implements, in a different manner, the c code: ; ; for (ichT = 0; ichT < ich; ichT++) ; { ; if (*pdxp++) ; return false ; } ; return true; ; ***
cProc FFirstIch,<PUBLIC,NEAR>,<di> parmW ich
cBegin FFirstIch
; *********** Register variables ******************** rdi_pdxp EQU di rcx_ich EQU cx ; **************************************************** ; Line 1316 mov ax,ds ; set es=ds for string ops mov es,ax
mov rdi_pdxp,OFFSET VFLI.rgdxp mov rcx_ich,ich ; loop count in cx cld
xor ax,ax ; this does 3 things: ; - sets up the compare value for scasb ; - sets a 0 (false) default return value ; - sets the zero flag on. This will allow ; a zero value of ich to correctly return ; true. This instruction MUST immediately ; precede the repz scasw instruction. repz scasw ; test *pdxp = 0 jnz $FFRet ; non zero char found - return false inc ax ; return TRUE if all 0 or ich = 0 $FFRet: cEnd FFirstIch
subttl ValidateMemoryDC() page
; ValidateMemoryDC()
cProc ValidateMemoryDC,<PUBLIC,FAR> cBegin ValidateMemoryDC
; /* Attempt to assure that vhMDC and vhDCPrinter are valid. If we have not ; already run out of memory, then vhDCPrinter is guaranteed, but vhMDC may ; fail due to out of memory -- it is the callers responsibility to check for ; vhMDC == NULL. */
; /* If we are out of memory, then we shouldn't try to gobble it up by getting ; DC's. */ cmp VFOUTOFMEMORY,0 jne $I862 cmp VHMDC,0 jne $I858 mov bx,PWWDCUR push WORD PTR [bx+50] call FAR PTR CREATECOMPATIBLEDC mov VHMDC,ax ; /* Callers are responsible for checking for vhMDC == NULL case */ or ax,ax je $I858 ; /* Put the memory DC in transparent mode. */ push ax mov ax,1 push ax call FAR PTR SETBKMODE ; /* If the display is a monochrome device, then set the text color for the ; memory DC. Monochrome bitmaps will not be converted to the foreground and ; background colors in this case, we must do the conversion. */ mov bx,PWWDCUR push WORD PTR [bx+50] mov ax,24 push ax call FAR PTR GETDEVICECAPS cmp ax,2 jne $I854 mov ax,1 jmp SHORT $I856 $I854: xor ax,ax $I856: mov VFMONOCHROME,ax or ax,ax je $I858 push VHMDC push WORD PTR RGBTEXT+2 push WORD PTR RGBTEXT call FAR PTR SETTEXTCOLOR $I858: ; /* If the printer DC is NULL then we need to restablish it. */ cmp VHDCPRINTER,0 jne $I862 xor ax,ax push ax call FAR PTR GETPRINTERDC $I862: cEnd ValidateMemoryDC
sEnd FORM1_TEXT END
|