antoine-source/appleworksgs/WP/Src/Pixel.aii
2023-03-04 03:45:20 +01:00

1 line
21 KiB
Plaintext
Executable File

load 'macros.dump'
include 'driver.equ'
include 'wp.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT W_BotLine
IMPORT W_BotPB
IMPORT W_BotPar
IMPORT W_CalcDocRect
IMPORT W_CalcFonts
IMPORT W_CalcLineHeight
IMPORT W_CaretBot
IMPORT W_CaretTop
IMPORT W_CheckWidow
IMPORT W_CutLine
IMPORT W_DateStr
IMPORT D_Deref
IMPORT W_GetAddr
IMPORT W_GetLRecPtr
IMPORT W_GetLineRec
IMPORT W_GetPageSize
IMPORT W_GetParRec
IMPORT W_GetTopSpace
IMPORT D_GetWdth
IMPORT W_Indent
IMPORT W_JustBits
IMPORT W_JustExtra
IMPORT W_JustPtr
IMPORT W_lastline
IMPORT W_LastP
IMPORT W_LeftMargin
IMPORT W_MakeVisRuler
IMPORT W_PageStr
IMPORT W_PaperSize
IMPORT W_ParLock
IMPORT W_ParRec
IMPORT W_ParUnLock
IMPORT Q_Point
IMPORT W_Ptr
IMPORT W_PutOnScreen
IMPORT W_ReadRulerP
IMPORT W_RulBits
IMPORT W_STFont
IMPORT W_STPtr
IMPORT W_STColor
IMPORT W_STStyle
IMPORT D_SelectFont
IMPORT W_SetFullREct
IMPORT W_ShowRuler
IMPORT W_STLIne
IMPORT W_StartLine
IMPORT W_StartOffset
IMPORT W_StartPar
IMPORT W_StartRuler
IMPORT W_TimeStr
IMPORT W_TopLine
IMPORT W_TopPB
IMPORT W_TopPar
IMPORT W_TopParHeight
IMPORT W_TopPg
IMPORT W_TopPgLine
IMPORT W_TopPgPar
IMPORT W_TopPgPixel
IMPORT D_UnLock
IMPORT W_UseTab
IMPORT W_ValidLines
IMPORT W_Height
IMPORT Q_Line
IMPORT W_offset
IMPORT Q_Rect
IMPORT W_Selected
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY W_GetHPos
ENTRY JustCheck
ENTRY W_LineToPixel
ENTRY W_MakeCaretGuts
ENTRY W_PixelToLine
********************************************************************
*
* IncludesÉ
* Wednesday, May 3, 1989 12:47:59 AM
********************************************************************
****************************************************************
* W_SetBounds
W_SetBounds PROC EXPORT
;Using wpglobals
local Q_Rect:r
begin
pushlong !Q_Rect
jsl W_CalcDocRect
pha
pha
pha
pushword Q_Rect
jsl W_PixelToLine
pla
sta W_TopPB
cmp #1
bne NoProb2
lda #$ffff
sta 1,s
sta 3,s
NoProb2
pullword W_TopLine
pullword W_TopPar
pha
pha
pha
pushword Q_Rect+4
jsl W_PixelToLine
pla
sta W_BotPB
cmp #1
bne NoProb
lda #$ffff
sta 1,s
sta 3,s
NoProb
pullword W_BotLine
pullword W_BotPar
return
ENDP
****************************************************************
* W_MakeCaretNS - sets the W_Caret positions and menu for a D_New selection
* The D_New selection is the W_StartPar,W_StartLine,W_StartOffset
* Does not put W_Caret on screen
W_MakeCaretNS PROC EXPORT
begin
jsl W_MakeCaretGuts
jsl W_SetBounds
return
ENDP
****************************************************************
* W_MakeCaretGuts
W_MakeCaretGuts PROC EXPORT
;Using wpglobals
local W_Ptr:l,tempv:w
begin
lda W_Selected
bne NotOnScreen
stz W_CaretTop
stz W_CaretBot
pha
pushword W_StartPar
pushword W_StartLine
jsl W_LineToPixel
pla
bmi NotOnScreen
sta TempV
spacelong
pushword W_StartPar
pushword W_StartLine
jsl W_GetLRecPtr
PullLong W_Ptr
addword [W_Ptr]:#W_lDescent,TempV,W_CaretBot
subword TempV,[W_Ptr]:#W_lAscent,W_CaretTop
pha
pushword W_StartPar
pushword W_StartLine
pushword W_StartOffset
jsl W_GetHPos
pla
sta W_CaretTop+2
sta W_CaretBot+2
NotOnScreen
return
ENDP
****************************************************************
* W_MakeCaret - sets the W_Caret positions and menu for a D_New selection
* The D_New selection is the W_StartPar,W_StartLine,W_StartOffset
* Does put W_Caret on screen
W_MakeCaret PROC EXPORT
;Using wpglobals
local W_ParRec:l
begin +b
pushword W_StartPar
pushword W_StartLine
pushlong #0
jsl W_PutOnScreen
lda W_Selected
jne IsSel
jsl W_MakeCaretGuts
IsSel
lda W_StartPar
jsl W_GetParRec
movelong ax,W_ParRec
cmpw [W_ParRec]:#W_pAttr,#W_PgBrk
bne NoPB
addlong #W_pBytes,W_ParRec,W_ParRec
NoPB
jsl W_SetFullREct
movelong [W_ParRec]:#W_pRulerHand,W_StartRuler
lda W_ShowRuler
beq NoDrawVis
pushlong [W_ParRec]:#W_pRulerHand
jsl W_MakeVisRuler
NoDrawVis
jsl W_CalcFonts
jsl W_SetBounds
return
ENDP
****************************************************************
* W_LineToPixel(par,Q_Line)
* Possible bugs with W_TopParHeight,W_TopPgLine
* Not yet done: widowing and pictures
* Out of bounds checking
W_LineToPixel PROC EXPORT
;Using WPGlobals
;Using ScreenData
input par:w,Q_Line:w
local ParPtr:l,Page:w,LineHand:l,LinePtr:l,CurPar:w,CurLine:w
local StartPixel:w,PagePixs:w,CrossPage:w,TopParPix:w,SPixel:w
output pixel:w
begin
moveword #-1,pixel
cmpw Par,W_TopPar
bcc NoGood
bne NextCheck
cmpw Q_Line,W_TopLine
bcc NoGood
NextCheck cmpw W_BotPar,par
bcc NoGood
bne IsGood
cmpw W_BotLine,Q_Line
bcs IsGood
NoGood brl ErrExit
IsGood
moveword W_TopPg,Page
moveword W_TopPgPar,CurPar
jsl W_GetParRec
movelong ax,ParPtr
moveword [ParPtr]:#W_pPixels,TopParPix
sec
sbc W_TopParHeight
moveword a,[ParPtr]:#W_pPixels
stz CrossPage
lda Page
jsl W_GetTopSpace
sta pixel
sta SPixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
lda CurPar
jsl W_GetParRec
movelong ax,ParPtr
; this loop is for normal pars, drops into subloop for pars that cross Q_Line
AddLoop
cmpw Par,CurPar
jeq W_GotPar
moveword [ParPtr]:#W_pAttr,a
beq OkPar
and #W_PgBrk
beq OkPar
inc Page
lda CrossPage
beq TryMo
moveword #-1,pixel
brl LPExit
TryMo
inc CrossPage
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword Pixel,W_PaperSize,Pixel
sta SPixel
brl NextPar
OkPar
lda pixel
clc
ldy #W_pPixels
adc [ParPtr],y
cmp PagePixs
jcc GotNewPixel
ldy CrossPage
jne GotNewPixel
lda curpar
jsl W_CheckWidow
bcc NoWidow
cmpw pixel,SPixel
beq NoWidow
inc CrossPage
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword Pixel,W_PaperSize,Pixel
sta SPixel
brl addloop
NoWidow
inc CrossPage
pushword CurPar
jsl W_ValidLines
movelong ParPtr,ax
jsl W_ReadRulerP
movelong [ParPtr]:#W_pLineHand,LineHand
movelong LineHand,ax
jsl D_Deref
ldy CurPar
cpy W_TopPgPar
bne NoTop
ldy W_TopPgLine
bra IsTop
NoTop ldy #0
IsTop jsl W_GetLineRec
movelong ax,LinePtr
moveword Pixel,StartPixel
LineLoop
movelong LinePtr,ax
jsl W_CalcLineHeight
clc
adc Pixel
cmp PagePixs
bcs GotLine
sta Pixel
addlong #W_lBytes,LinePtr,LinePtr
bra LineLoop
GotLine
addword [ParPtr]:#W_pPixels,StartPixel,a
subword a,Pixel,StartPixel ; SP = [par]:#pix-(pixel-sp)
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
lda pixel
clc
adc W_PaperSize
adc StartPixel
sta pixel
sta SPixel
movelong LineHand,ax
jsl D_UnLock
bra NextPar
GotNewPixel sta Pixel
NextPar inc CurPar
addlong #W_pBytes,ParPtr,ParPtr
brl AddLoop
; got the par check that is not widowed
W_GotPar
ldy CrossPage
jne NoWidow2
lda pixel
clc
ldy #W_pPixels
adc [ParPtr],y
cmp PagePixs
jcc NoWidow2
cmpw pixel,spixel
beq NoWidow2
lda curpar
jsl W_CheckWidow
bcc NoWidow2
cmpw pixel,spixel
beq NoWidow2
inc CrossPage
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword Pixel,W_PaperSize,Pixel
sta SPixel
NoWidow2
pushword CurPar
jsl W_ValidLines
movelong ParPtr,ax
jsl W_ReadRulerP
stz CurLine
cmpw CurPar,W_TopPgPar
bne NoTTop2
moveword W_TopPgLine,CurLine
NotTop2
movelong [ParPtr]:#W_pLineHand,LineHand
movelong LineHand,ax
jsl D_Deref
ldy CurLine
jsl W_GetLineRec
movelong ax,LinePtr
LLoop
movelong LinePtr,ax
jsl W_CalcLineHeight
clc
adc Pixel
cmp PagePixs
bcc NoProb
ldy CrossPage
bne NoProb
inc CrossPage
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword W_PaperSize,pixel,pixel
sta SPixel
bra LLoop
NoProb
sta Pixel
inc CurLine
SLloop cmpw Q_Line,CurLine
bcc DoneLastStuff
addlong #W_lBytes,LinePtr,LinePtr
bra LLoop
DoneLastStuff
subword pixel,[LinePtr]:#W_lDescent,a
sbc W_TopPgPixel
sta pixel
movelong LineHand,ax
jsl D_UnLock
lda W_ShowRuler
beq LPExit
addword pixel,#W_RulerHt,pixel
LPExit
lda W_TopPgPar
jsl W_GetParRec
movelong ax,ParPtr
moveword TopParPix,[ParPtr]:#W_pPixels
ErrExit
return
ENDP
****************************************************************
* W_LineToTopPixel(par,Q_Line):pixel
* returns pixel above Q_Line
* Possible bugs with W_TopParHeight,W_TopPgLine
* Not yet done: widowing and pictures
W_LineToTopPixel PROC EXPORT
input par:w,Q_Line:w
output pixel:w,W_Height:w
begin
pha
pushword par
pushword Q_Line
jsl W_LineToPixel
pullword pixel
lda par
jsl W_GetParRec
jsl W_ReadRulerP
spacelong
pushword par
pushword Q_Line
jsl W_GetLRecPtr
pla
plx
jsl W_CalcLineHeight
sta W_Height
txa
clc
adc pixel
sec
sbc W_Height
sta pixel
return
ENDP
****************************************************************
* W_PixelToLine(V:w):par,Q_Line,dir
* dir is 1 for round down and -1 to round up, when between lines
* If par is 0 then pixel is below all Q_Text
W_PixelToLine PROC EXPORT
;Using WPGlobals
;Using ScreenData
input EndPixel:w
local ParPtr:l,Page:w,LineHand:l,LinePtr:l,LastPixel:w
local W_lastline:w,StartPixel:w,PagePixs:w,CrossPage:w,pixel:w
local TopParPix:w,CrossPage2:w,SPixel:w
output par:w,Q_Line:w,dir:w
begin
addword EndPixel,W_TopPgPixel,EndPixel
lda W_ShowRuler
beq NoSub
subword EndPixel,#W_RulerHt,EndPixel
NoSub
moveword W_TopPg,Page
moveword W_TopPgPar,par
jsl W_GetParRec
movelong ax,ParPtr
moveword [ParPtr]:#W_pPixels,TopParPix
sec
sbc W_TopParHeight
moveword a,[ParPtr]:#W_pPixels
stz CrossPage
stz CrossPage2
lda Page
jsl W_GetTopSpace
sta pixel
sta SPixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
lda par
jsl W_GetParRec
movelong ax,ParPtr
moveword pixel,LastPixel
moveword #-1,dir
moveword W_TopPgLine,Q_Line
cmpw Pixel,EndPixel
jcs LPExit
; this loop is for normal pars, drops into subloop for pars that cross Q_Line
AddLoop
moveword pixel,LastPixel
moveword CrossPage2,CrossPage
moveword [ParPtr]:#W_pAttr,a
beq OkPar
and #W_PgBrk
beq OkPar
inc Page
lda CrossPage
jne W_GotPar
inc CrossPage
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword Pixel,W_PaperSize,Pixel
sta SPixel
brl NextPar
OkPar
lda pixel
clc
ldy #W_pPixels
adc [ParPtr],y
cmp PagePixs
jcc GotNewPixel
ldy CrossPage
jne GotNewPixel
lda par
jsl W_CheckWidow
bcc NoWidow
cmpw pixel,SPixel
beq NoWidow
inc CrossPage2
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword Pixel,W_PaperSize,Pixel
sta SPixel
brl AddLoop
NoWidow
inc CrossPage2
pushword par
jsl W_ValidLines
movelong ParPtr,ax
jsl W_ReadRulerP
movelong [ParPtr]:#W_pLineHand,LineHand
movelong LineHand,ax
jsl D_Deref
ldy Par
cpy W_TopPgPar
bne NoTop
ldy W_TopPgLine
bra IsTop
NoTop ldy #0
IsTop jsl W_GetLineRec
movelong ax,LinePtr
moveword Pixel,StartPixel
LineLoop
movelong LinePtr,ax
jsl W_CalcLineHeight
clc
adc Pixel
cmp PagePixs
bcs GotLine
sta Pixel
addlong #W_lBytes,LinePtr,LinePtr
bra LineLoop
GotLine
addword [ParPtr]:#W_pPixels,StartPixel,a
subword a,Pixel,StartPixel ; SP = [par]:#pix-(pixel-sp)
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
lda pixel
clc
adc W_PaperSize
adc StartPixel
sta pixel
sta SPixel
movelong LineHand,ax
jsl D_UnLock
bra NextPar
GotNewPixel sta Pixel
NextPar
cmpw Pixel,EndPixel
bcs W_GotPar
inc Par
cmpw W_LastP,par
bcc PastAll
stz Q_Line
addlong #W_pBytes,ParPtr,ParPtr
brl AddLoop
PastAll
dec par
moveword #1,dir
moveword [ParPtr]:#W_pLastLine,a
dec a
sta Q_Line
brl LPExit
W_GotPar
stz Q_Line
cmpw [ParPtr]:#W_pAttr,#W_PgBrk
bne NoPB
inc par
moveword #2,dir
brl LPExit
NoPB
moveword LastPixel,pixel
moveword #-1,dir
pushword par
jsl W_ValidLines
movelong ParPtr,ax
jsl W_ReadRulerP
cmpw Par,W_TopPgPar
bne NoTTop2
moveword W_TopPgLine,Q_Line
NotTop2
movelong [ParPtr]:#W_pLineHand,LineHand
movelong LineHand,ax
jsl D_Deref
ldy Q_Line
jsl W_GetLineRec
movelong ax,LinePtr
LLoop
movelong LinePtr,ax
jsl W_CalcLineHeight
clc
adc Pixel
cmp PagePixs
bcc NoProb
ldy CrossPage
bne NoProb
inc CrossPage
inc Page
lda Page
jsl W_GetTopSpace
sta pixel
lda Page
jsl W_GetPageSize
addword a,Pixel,PagePixs
addword W_PaperSize,pixel,pixel
sta SPixel
cmp EndPixel
bcs LPExit
brl LLoop
NoProb
sta Pixel
cmp EndPixel
bcs DoneLastStuff
inc Q_Line
addlong #W_lBytes,LinePtr,LinePtr
bra LLoop
DoneLastStuff
stz dir
movelong LineHand,ax
jsl D_UnLock
LPExit
lda W_TopPgPar
jsl W_GetParRec
movelong ax,ParPtr
moveword TopParPix,[ParPtr]:#W_pPixels
return
ENDP
****************************************************************
* W_GetLeft(a:Q_Line number)a:left margin or W_Indent
W_GetLeft PROC EXPORT
;Using WPGlobals
tay
lda W_LeftMargin
tyx
bne GLExit
lda W_Indent
GLExit
rtl
ENDP
****************************************************************
* W_GetHPos(par,Q_Line,W_offset)
W_GetHPos PROC EXPORT
;Using wpglobals
EXPORT JustCheck
input par:w,Q_Line:w,W_offset:w
local W_ParRec:l,LineRecPtr:l,LineHand:l,changed:w,SetJust:w
local YStop2:w,YStop:w,Ptr2:l,Q_Point:l,ChrPtr:l,StopPtr:l
local FracBits:w,StringPtr:l
output CurH:w
begin
stz SetJust
stz FracBits
lda par
jsl W_GetParRec
jsl W_ReadRulerP
pushword par
jsl W_ParLock
pushword par
jsl W_ValidLines
lda par
jsl W_GetParRec
movelong ax,W_ParRec
movelong [W_ParRec]:#W_pLineHand,LineHand
movelong [LineHand],LineRecPtr
movelong LineRecPtr,ax
ldy Q_Line
jsl W_GetLineRec
movelong ax,LineRecPtr
moveword [LineRecPtr]:#W_lFont,W_STFont
moveword [LineRecPtr]:#W_lStyle,W_STStyle
moveword [LineRecPtr]:#W_lColor,W_STColor
moveword [LineRecPtr]:#W_lOffset,a
tax
lda par
jsl W_GetAddr
movelong ax,W_STPtr
movelong ax,ChrPtr
moveword Q_Line,W_STLIne
ldx W_offset
lda par
jsl W_GetAddr
movelong ax,W_JustPtr
movelong ax,StopPtr
lda W_RulBits
and #W_r_left
bne NoCut
jsl W_CutLine
NoCut
lda Q_Line
jsl W_GetLeft
sta CurH
lda W_RulBits
and #W_r_left+W_r_full
bne GotCurH
lda W_RulBits
and #W_r_center
bne ItsCenter
lda W_JustBits
bmi GotCurH
addword a,CurH,CurH
bra GotCurH
ItsCenter
lda W_JustBits
bmi GotCurH
lsr a
clc
adc CurH
sta CurH
GotCurH
NewChrPtr
moveword #1,changed
subword W_JustPtr,ChrPtr,YStop2
subword StopPtr,ChrPtr,YStop
jeq DLExit
ldy #0
PLoop
lda [ChrPtr],y
and #$ff
cmp #sp
bcc DumpIt
phy
pha
lda changed
beq NoChange
lda W_STFont
ldx W_STStyle
ldy W_STColor
jsl D_SelectFont
stz changed
NoChange
pla
tay ;get character
cmp #sp
bne DoReg
lda W_RulBits
and #W_r_full
beq DoReg
lda SetJust
beq DoReg
addword W_JustExtra,FracBits,FracBits
bcc NoBit
inc CurH
NoBit
addword W_JustExtra+2,CurH,CurH
ldy #sp
DoReg tya
jsl D_GetWdth
GotWidth
clc
adc CurH
sta CurH
ply
iny
cpy YStop2
bcc NoCheck
jsr JustCheck
NoCheck
cpy YStop
bcs DumpIt
brl PLoop
DumpIt
tya
clc
adc ChrPtr
sta Ptr2
lda ChrPtr+2
adc #0
sta Ptr2+2
cmpl ChrPtr,W_JustPtr
bcc NoExtra
jsr JustCheck
NoExtra
cmpl Ptr2,StopPtr
bcs DLExit
lda [Ptr2] ;change or cr
and #$ff
asl a
tax
jmp (ChrTable,x)
DLExit
pushword par
jsl W_ParUnLock
return
;--------------------------------------------
AdjustTab
pha
pushword W_STFont
pushword W_STStyle
pushword W_STColor
pushword CurH
pushlong Ptr2
jsl W_UseTab
pla
sta CurH
addlong Ptr2,#1,ChrPtr
brl NewChrPtr
PageWidth
movelong #W_PageStr,StringPtr
bra DoWidth
DateWidth
movelong #W_DateStr,StringPtr
bra DoWidth
TimeWidth
movelong #W_TimeStr,StringPtr
DoWidth
pha
pushlong StringPtr
_StringWidth
pla
addword a,CurH,CurH
addlong Ptr2,#1,ChrPtr
brl NewChrPtr
FChange
ldy #1
lda [Ptr2],y
sta W_STFont
addlong #3,Ptr2,ChrPtr
brl NewChrPtr
SizeChange
ldy #1
lda [Ptr2],y
shortm
sta W_STStyle+1
longm
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
StyleChange
ldy #1
lda [Ptr2],y
shortm
sta W_STStyle
longm
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
ColorChange
ldy #1
lda [Ptr2],y
and #$ff
sta W_STColor
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
JustCheck ;
phy
lda SetJust
bne JCExit
inc SetJust
JCExit ply
rts
ChrTable DC.W 0,FChange ;0,1
DC.W StyleChange,SizeChange ;2,3
DC.W ColorChange,PageWidth ;4,5
DC.W DateWidth,TimeWidth ;6,7
DC.W 0,AdjustTab ;8,9
ENDP
****************************************************************
* W_PixelToOffset(par,Q_Line,pixel) : W_offset
W_PixelToOffset PROC EXPORT
;Using wpglobals
input par:w,Q_Line:w,pixel:w
local W_ParRec:l,LineRecPtr:l,LineHand:l,changed:w,DoneFull:w
local YStop:w,Ptr2:l,ChrPtr:l,StopPtr:l,CurH:w,CurWidth:w
local YStop2:w,ExBits:w,tempCur:w,StringPtr:l
output W_offset:w
begin
stz ExBits
pushword par
jsl W_ValidLines
pushword par
jsl W_ParLock
lda par
jsl W_GetParRec
movelong ax,W_ParRec
jsl W_ReadRulerP
movelong [W_ParRec]:#W_pLineHand,LineHand
movelong [LineHand],LineRecPtr
movelong LineRecPtr,ax
ldy Q_Line
jsl W_GetLineRec
movelong ax,LineRecPtr
moveword [LineRecPtr]:#W_lFont,W_STFont
moveword [LineRecPtr]:#W_lStyle,W_STStyle
moveword [LineRecPtr]:#W_lColor,W_STColor
moveword [LineRecPtr]:#W_lOffset,a
tax
lda par
jsl W_GetAddr
movelong ax,W_STPtr
movelong ax,ChrPtr
moveword Q_Line,W_STLIne
moveword [LineRecPtr]:#W_lOffset+W_lBytes,a
tax
lda par
jsl W_GetAddr
movelong ax,W_JustPtr
movelong ax,StopPtr
lda W_RulBits
and #W_r_left
bne NoCut
jsl W_CutLine
NoCut
lda Q_Line
jsl W_GetLeft
sta CurH
lda W_RulBits
and #W_r_left+W_r_full
bne GotCurH
lda W_RulBits
and #W_r_center
bne ItsCenter
lda W_JustBits
bmi GotCurH
addword a,CurH,CurH
bra GotCurH
ItsCenter
lda W_JustBits
bmi GotCurH
lsr a
clc
adc CurH
sta CurH
GotCurH
stz CurWidth ;last used W_Char width
stz DoneFull
NewChrPtr
ldy #0
moveword #1,changed
subword W_JustPtr,ChrPtr,YStop2
subword StopPtr,ChrPtr,YStop
jeq GotOffset
PLoop
cmpw CurH,Pixel
jcs GotOffset
lda [ChrPtr],y
and #$ff
cmp #sp
bcc DumpIt
phy
pha
lda changed
beq NoChange
lda W_STFont
ldx W_STStyle
ldy W_STColor
jsl D_SelectFont
stz changed
NoChange
pla
tay
cmp #sp
bne DoReg
lda W_RulBits
and #W_r_full
beq DoReg
lda DoneFull
beq DoReg
moveword CurH,TempCur
addword W_JustExtra+2,CurH,CurH
addword W_JustExtra,ExBits,ExBits
bcc NoCInc
inc CurH
NoCInc
lda #sp
jsl D_GetWdth
clc
adc CurH
sta CurH
subword CurH,TempCur,CurWidth
bra DoneAdjust
DoReg tya
jsl D_GetWdth
sta CurWidth
clc
adc CurH
sta CurH
DoneAdjust
ply
iny
cpy YStop2
bcc NoCheck
jsr JustCheck
NoCheck
cpy YStop
bcs GotOffset
brl PLoop
DumpIt
tya
clc
adc ChrPtr
sta Ptr2
lda ChrPtr+2
adc #0
sta Ptr2+2
cmpl ChrPtr,W_JustPtr
bcc NoExtra
lda DoneFull
bne NoExtra
jsr JustCheck
NoExtra
lda [Ptr2] ;change or cr
and #$ff
asl a
tax
jmp (ChrTable,x)
GotOffset
tya
clc
adc ChrPtr
sta ChrPtr
lda #0
adc ChrPtr+2
sta ChrPtr+2
subword CurH,CurWidth,a
cmp Pixel
bcs MakeOffset
lsr CurWidth
adc CurWidth
cmp Pixel
bcc MakeOffset
decL ChrPtr
MakeOffset
lda par
ldx #0
jsl W_GetAddr
pha
lda ChrPtr
sec
sbc 1,s
sta W_offset
pla
DLExit
pushword par
jsl W_ParUnLock
return
;--------------------------------------------
AdjustTab
pha
pushword W_STFont
pushword W_STStyle
pushword W_STColor
pushword CurH
pushlong Ptr2
jsl W_UseTab
subword 1:s,CurH,CurWidth
pla
sta CurH
addlong Ptr2,#1,ChrPtr
brl NewChrPtr
PageWidth
movelong #W_PageStr,StringPtr
bra DoWidth
DateWidth
movelong #W_DateStr,StringPtr
bra DoWidth
TimeWidth
movelong #W_TimeStr,StringPtr
DoWidth
pha
pushlong StringPtr
_StringWidth
pla
sta CurWidth
addword a,CurH,CurH
addlong Ptr2,#1,ChrPtr
brl NewChrPtr
FChange
ldy #1
lda [Ptr2],y
sta W_STFont
addlong #3,Ptr2,ChrPtr
brl NewChrPtr
SizeChange
ldy #1
lda [Ptr2],y
shortm
sta W_STStyle+1
longm
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
StyleChange
ldy #1
lda [Ptr2],y
shortm
sta W_STStyle
longm
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
ColorChange
ldy #1
lda [Ptr2],y
and #$ff
sta W_STColor
addlong #2,Ptr2,ChrPtr
brl NewChrPtr
JustCheck
lda DoneFull
bne JCExit
inc DoneFull
JCExit
rts
ChrTable DC.W 0,FChange ;0,1
DC.W StyleChange,SizeChange ;2,3
DC.W ColorChange,PageWidth ;4,5
DC.W DateWidth,TimeWidth ;6,7
DC.W 0,AdjustTab ;8,9
ENDP
END