windows-nt/Source/XPSP1/NT/base/mvdm/wow16/write/format.asm
2020-09-26 16:20:57 +08:00

2995 lines
84 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;* ****************************************************************************
;*
;* 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