mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-04 04:31:04 +00:00
1 line
23 KiB
Plaintext
Executable File
1 line
23 KiB
Plaintext
Executable File
|
|
LOAD 'Macros.dump'
|
|
|
|
INCLUDE 'SS.equ'
|
|
|
|
INCLUDE 'Driver.equ'
|
|
INCLUDE 'Heap.aii.i'
|
|
INCLUDE 'Eval.aii.i'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT D_FastMult
|
|
IMPORT D_Set4Pat
|
|
IMPORT D_DrawText
|
|
IMPORT D_DrawString
|
|
|
|
IMPORT X_FormatValue
|
|
|
|
IMPORT S_Cell2Str
|
|
IMPORT S_CellWidth
|
|
IMPORT S_ClipHandle
|
|
IMPORT S_ColLab2Text
|
|
IMPORT S_ColLabRect
|
|
IMPORT S_CurBRSelect
|
|
IMPORT S_CurBRTitle
|
|
IMPORT S_CurContHt
|
|
IMPORT S_CurContWd
|
|
IMPORT S_CurContXpt
|
|
IMPORT S_CurContYpt
|
|
IMPORT S_CurEditFlag
|
|
IMPORT S_CurPrinting
|
|
IMPORT S_CurTLCell
|
|
IMPORT S_CurTLSelect
|
|
IMPORT S_CurTLTitle
|
|
IMPORT S_DashMask
|
|
IMPORT S_GetCellPtr
|
|
IMPORT S_NormalMask
|
|
IMPORT S_RowLabRect
|
|
IMPORT S_WhereCell
|
|
IMPORT S_WhichCell
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY S_BackPat
|
|
ENTRY S_DrawRegion
|
|
ENTRY S_FindLeftContent
|
|
ENTRY S_FindRightContent
|
|
|
|
;----------------------------------------------------------------------------
|
|
; S_DrawBorders (OffRight:w,OffBottom:w,Xpt:w,Ypt:w)
|
|
;
|
|
|
|
S_DrawBorders PROC EXPORT
|
|
|
|
input OffRight:w,OffBottom:w,Xpt:w,Ypt:w
|
|
local Rect:r
|
|
BEGIN
|
|
|
|
lda OffRight
|
|
beq chkBottom
|
|
|
|
Tool _SetPenPat,in=(#S_BackPat:l)
|
|
|
|
MoveWord #S_EditHeight+2,Rect
|
|
MoveWord Xpt,Rect+2
|
|
AddWord Ypt,#S_RowHeight,Rect+4
|
|
AddWord Xpt,#S_MaxCellWidth,Rect+6
|
|
Tool _PaintRect,in=(!Rect:l)
|
|
|
|
Tool _SetPenPat,in=(#S_NormalPat:l)
|
|
|
|
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+2:w)
|
|
Tool _LineTo,in=(Xpt:w,Ypt:w)
|
|
|
|
inc Xpt
|
|
inc Xpt
|
|
|
|
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+2:w)
|
|
Tool _LineTo,in=(Xpt:w,Ypt:w)
|
|
|
|
chkBottom
|
|
lda OffBottom
|
|
beq Exit
|
|
|
|
Tool _SetPenPat,in=(#S_BackPat:l)
|
|
|
|
MoveWord Ypt,Rect
|
|
MoveWord #0,Rect+2
|
|
AddWord Ypt,#S_RowHeight,Rect+4
|
|
AddWord Xpt,#S_MaxCellWidth,Rect+6
|
|
Tool _PaintRect,in=(!Rect:l)
|
|
|
|
Tool _SetPenPat,in=(#S_NormalPat:l)
|
|
|
|
Tool _MoveTo,in=(#0:w,Ypt:w)
|
|
Tool _LineTo,in=(Xpt:w,Ypt:w)
|
|
|
|
inc Ypt
|
|
|
|
Tool _MoveTo,in=(#0:w,Ypt:w)
|
|
Tool _LineTo,in=(Xpt:w,Ypt:w)
|
|
|
|
Exit RETURN
|
|
|
|
EXPORT S_BackPat
|
|
|
|
S_BackPat
|
|
DC.W $F3F3,$3F3F,$F3F3,$3F3F
|
|
DC.W $F3F3,$3F3F,$F3F3,$3F3F
|
|
DC.W $F3F3,$3F3F,$F3F3,$3F3F
|
|
DC.W $F3F3,$3F3F,$F3F3,$3F3F
|
|
|
|
S_NormalPat
|
|
DC.W 0,0,0,0
|
|
DC.W 0,0,0,0
|
|
DC.W 0,0,0,0
|
|
DC.W 0,0,0,0
|
|
|
|
ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; S_DrawCell(Cell:l,Xpt:w,Ypt:w)
|
|
;
|
|
; This routine will draw the given cell's value at the given x,y
|
|
; coordinates, and bounded by the given width. It clips to appropriate
|
|
; rectangle.
|
|
|
|
S_DrawCell PROC EXPORT
|
|
;Using S_CurrentData
|
|
;Using D_GlobalData
|
|
|
|
input Cell:l,Xpt:w,Ypt:w
|
|
local CellPtr:l,StringPtr:l
|
|
local Format:l,Rect:r,ChkPtr:l
|
|
local Offset:w,ContCell:l,Color:w
|
|
local ClipRight:w,ClipLeft:w,Justify:w
|
|
error ErrorFlag
|
|
BEGIN
|
|
|
|
stz ErrorFlag
|
|
stz Offset
|
|
|
|
in Cell:l
|
|
out CellPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
ora CellPtr
|
|
jeq Quit
|
|
|
|
; Cell exists ;
|
|
|
|
MoveWord #1,ClipRight
|
|
sta ClipLeft
|
|
|
|
MoveLong Cell,ContCell
|
|
|
|
MoveLong [CellPtr]:#S_CellFormat,Format
|
|
|
|
lda Format
|
|
and #S_CellType
|
|
cmp #S_CellTypeEmpty
|
|
jeq Quit
|
|
|
|
Tool _GetTextFace,out=(:w) ; leave on stack for 'Exit'
|
|
|
|
; Is it an overlap cell ;
|
|
|
|
lda Format
|
|
and #S_CellType
|
|
jmi doOverlap
|
|
|
|
lda Format
|
|
and #S_CellBold
|
|
beq textFaceSet
|
|
|
|
lda 1,s
|
|
ora #$01 ; set bold bit on
|
|
Tool _SetTextFace,in=(a:w)
|
|
|
|
textFaceSet
|
|
lda Format
|
|
and #S_CellTypeValue ; either constant or function
|
|
bne doNumber
|
|
|
|
; Cell is of type Text ;
|
|
|
|
lda S_CurEditFlag
|
|
and #S_ViewFormulaBit
|
|
beq doText
|
|
|
|
lda Format
|
|
and #S_CellTypeTextForm
|
|
bne doFormula
|
|
|
|
doText
|
|
lda Format+2
|
|
and #S_CellCircular
|
|
jne circularCell
|
|
|
|
jsr ClrLeft
|
|
jsr ClrRight
|
|
|
|
jsr SetText
|
|
jsr DrawString
|
|
|
|
brl Exit
|
|
|
|
doFormula
|
|
MoveWord #4,Offset
|
|
|
|
H_GetBlockPtr [CellPtr]:#S_CellContent,StringPtr
|
|
|
|
in Cell:l,StringPtr:l
|
|
out StringPtr:l
|
|
XCall E_ExpandFormula
|
|
|
|
jsr DrawString
|
|
|
|
brl Exit
|
|
|
|
doNumber
|
|
lda S_CurEditFlag
|
|
and #S_ViewFormulaBit
|
|
beq doValue
|
|
|
|
lda Format
|
|
and #S_CellTypeTextForm
|
|
bne doFormula
|
|
|
|
doValue
|
|
lda Format+2
|
|
and #S_CellCircular
|
|
beq notCirc2
|
|
|
|
circularCell
|
|
MoveWord #DarkRed,Color
|
|
MoveLong #CircStr,StringPtr
|
|
PushWord #40
|
|
bra drawNumber
|
|
|
|
notCirc2
|
|
SpaceWord ; string length
|
|
SpaceLong ; string ptr
|
|
SpaceWord ; color
|
|
Call S_CellWidth,in=(Cell+2:w),out=(:w)
|
|
PushLong Format
|
|
AddLong CellPtr,#S_CellValue,s
|
|
|
|
Call X_FormatValue ;in=(:w,:l,:l),out=(:w,:l,:w)
|
|
bcc OKvalue
|
|
|
|
lda 9,s
|
|
and #$FFFE ; turn any bold off.
|
|
Tool _SetTextFace,in=(a:w)
|
|
|
|
OKvalue
|
|
PullWord Color
|
|
PullLong StringPtr
|
|
|
|
drawNumber
|
|
lda Color
|
|
pha
|
|
xba
|
|
ora 1,s
|
|
sta 1,s
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
ora 1,s
|
|
sta 1,s
|
|
Tool _SetForeColor,in=(:w)
|
|
|
|
Call S_CellWidth,in=(Cell+2:w),out=(a:w)
|
|
SubWord a,s,Offset
|
|
|
|
jsr DrawString
|
|
|
|
Tool _SetForeColor,in=(#0:w)
|
|
|
|
brl Exit
|
|
|
|
doOverlap
|
|
cmp #S_CellTypeLeftPad
|
|
beq fromRight
|
|
|
|
in Cell:l
|
|
out ContCell:l,Offset:w
|
|
XCall S_FindLeftContent
|
|
|
|
stz ClipLeft
|
|
jsr ClrRight
|
|
bra overCont
|
|
|
|
fromRight
|
|
in Cell:l
|
|
out ContCell:l,Offset:w
|
|
XCall S_FindRightContent
|
|
|
|
stz ClipRight
|
|
jsr ClrLeft
|
|
|
|
overCont
|
|
in ContCell:l
|
|
out CellPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
MoveLong [CellPtr]:#S_CellFormat,Format
|
|
|
|
lda Format
|
|
and #S_CellBold
|
|
beq textFaceSet2
|
|
|
|
lda 1,s
|
|
ora #$01 ; set bold bit on
|
|
Tool _SetTextFace,in=(a:w)
|
|
|
|
textFaceSet2
|
|
jsr SetText
|
|
jsr DrawString
|
|
|
|
Exit
|
|
jsr DrawUnder
|
|
|
|
Tool _SetTextFace,in=(:w)
|
|
|
|
Quit
|
|
RETURN
|
|
|
|
;----------------------
|
|
|
|
CircStr
|
|
str 'Circ.'
|
|
|
|
;----------------------
|
|
|
|
SetText
|
|
H_GetBlockPtr [CellPtr]:#S_CellValue,StringPtr
|
|
|
|
lda Format
|
|
and #S_CellJustify
|
|
sta Justify
|
|
beq LeftJust
|
|
|
|
; Get String width for right and center justified text ;
|
|
|
|
Tool _StringWidth,in=(StringPtr:l),out=(:w)
|
|
|
|
; Calculate relative position to start text from front of cell ;
|
|
|
|
Call S_CellWidth,in=(ContCell+2:w),out=(a:w)
|
|
SubWord a,s,a
|
|
|
|
; If Right justified, this is all ;
|
|
|
|
ldx Justify
|
|
cpx #S_CellCenterJustify
|
|
bne justified
|
|
|
|
; If Center justified, there's more to do ;
|
|
|
|
CenterJust
|
|
tay
|
|
bmi setC
|
|
|
|
; If current value is positive, zero must be in top bit after
|
|
; divide.
|
|
|
|
clc
|
|
bra divide
|
|
|
|
; If current value is negative, one must be in top bit after
|
|
; divide.
|
|
|
|
setC
|
|
sec
|
|
|
|
divide
|
|
|
|
; Since we are centering around 1/2 of cell width, and the present
|
|
; value is (cell width - string width), dividing by 2 gives us
|
|
; (cell width)/2 - (string width)/2, which is what we want.
|
|
|
|
ror a
|
|
bra justified
|
|
|
|
LeftJust
|
|
lda #4
|
|
|
|
justified
|
|
AddWord a,Offset,Offset
|
|
rts
|
|
|
|
;----------------------
|
|
|
|
ClrRight
|
|
lda Cell+2
|
|
inc a
|
|
tax
|
|
cmp #$02BF
|
|
bge srDone
|
|
|
|
in x:w,Cell:w
|
|
out ChkPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
ora ChkPtr
|
|
beq srDone
|
|
|
|
MoveWord [ChkPtr]:#S_CellFormat,a
|
|
bpl srDone
|
|
|
|
and #S_CellType
|
|
cmp #S_CellTypeRightPad
|
|
bne srDone
|
|
|
|
clrClipR
|
|
stz ClipRight
|
|
|
|
srDone
|
|
rts
|
|
|
|
;----------------------
|
|
|
|
ClrLeft
|
|
lda Cell+2
|
|
inc a
|
|
tax
|
|
cmp #10000
|
|
blt slDone
|
|
|
|
in x:w,Cell:w
|
|
out ChkPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
ora ChkPtr
|
|
beq slDone
|
|
|
|
MoveWord [ChkPtr]:#S_CellFormat,a
|
|
bpl slDone
|
|
|
|
and #S_CellType
|
|
cmp #S_CellTypeLeftPad
|
|
bne slDone
|
|
|
|
clrClipL
|
|
stz ClipLeft
|
|
|
|
slDone
|
|
rts
|
|
|
|
;----------------------
|
|
|
|
DrawString
|
|
lda Ypt
|
|
inc a
|
|
sta Rect
|
|
AddWord a,#S_TextOffset,Rect+4
|
|
Moveword Xpt,Rect+2
|
|
pha
|
|
|
|
Call S_CellWidth,in=(Cell+2:w),out=(a:w)
|
|
AddWord a,s,a
|
|
inc a
|
|
inc a
|
|
sta Rect+6
|
|
|
|
lda ClipRight
|
|
beq chkClipLeft
|
|
|
|
dec Rect+6
|
|
dec Rect+6
|
|
|
|
chkClipLeft
|
|
lda ClipLeft
|
|
beq contDraw
|
|
|
|
inc Rect+2
|
|
inc Rect+2
|
|
|
|
contDraw
|
|
Tool _ClipRect,in=(!Rect:l)
|
|
Tool _GetClipHandle,out=(:l)
|
|
PushLong S_ClipHandle
|
|
PushLong 5:s
|
|
Tool _SectRgn,in=(:l,:l,:l)
|
|
|
|
|
|
; LaserWriter hack-around --- GS/OS laserwriter driver doesn't do
|
|
; EraseRect correctly.
|
|
|
|
; Tool _EraseRect,in=(!Rect:l)
|
|
|
|
Call D_Set4Pat,in=(#White:w)
|
|
Tool _PaintRect,in=(!Rect:l)
|
|
Call D_Set4Pat,in=(#Black:w)
|
|
|
|
|
|
|
|
AddWord Xpt,Offset,s
|
|
lda Rect+4
|
|
dec a
|
|
pha
|
|
Tool _MoveTo,in=(:w,:w)
|
|
call D_DrawString,in=(StringPtr:l)
|
|
rts
|
|
|
|
;----------------------
|
|
|
|
DrawUnder
|
|
lda Format
|
|
and #S_CellULine
|
|
beq DidUnder
|
|
|
|
Tool _SetClip,in=(S_ClipHandle:l)
|
|
|
|
; AddWord Xpt,#2,s
|
|
PushWord Xpt ; this hangs off both ends
|
|
|
|
AddWord Ypt,#S_RowHeight,s
|
|
_MoveTo
|
|
|
|
Call S_CellWidth,in=(Cell+2:w),out=(:w)
|
|
|
|
; SubWord 1:s,#2,1:s ; pen is 2 pixels wide
|
|
|
|
Tool _Line,in=(:w,#0:w)
|
|
|
|
DidUnder
|
|
rts
|
|
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_DrawColLabels(Xpt:w,FCol:w,LCol:w)
|
|
;
|
|
; This routine draws the column labels in the given range starting at the
|
|
; given x coordinate (y = constant).
|
|
|
|
S_DrawColLabels PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input Xpt:w,FCol:w,LCol:w
|
|
local Wcnt:w,Length:w,TextWd:w
|
|
local Rect:r
|
|
BEGIN
|
|
|
|
; Calculate the total length of the New labels ;
|
|
|
|
MoveWord Xpt,Length
|
|
MoveWord FCol,Wcnt
|
|
bra AddWidth
|
|
|
|
loop4
|
|
inc a
|
|
sta Wcnt
|
|
|
|
AddWidth
|
|
Call S_CellWidth,in=(a:w),out=(a:w)
|
|
AddWord a,Length,Length
|
|
|
|
CmpWord Wcnt,LCol
|
|
bne loop4
|
|
|
|
; Paint the background light yellow ;
|
|
|
|
lengthKnown
|
|
Call D_Set4Pat,in=(#LightYellow:w)
|
|
|
|
MoveWord S_ColLabRect,Rect
|
|
MoveWord Xpt,Rect+2
|
|
MoveWord S_ColLabRect+4,Rect+4
|
|
MoveWord Length,Rect+6
|
|
Tool _PaintRect,in=(!Rect:l)
|
|
|
|
Call D_Set4Pat,in=(#Black:w)
|
|
|
|
; Frame the New area ;
|
|
|
|
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+S_ColLabelHeight:w)
|
|
Tool _LineTo,in=(Length:w,#S_EditHeight+S_ColLabelHeight:w)
|
|
|
|
Tool _MoveTo,in=(Length:w,#S_EditHeight:w)
|
|
Tool _LineTo,in=(Length:w,#S_EditHeight+S_ColLabelHeight:w)
|
|
|
|
; Draw the labels centered in the columns, with dividers ;
|
|
|
|
MoveWord FCol,Wcnt
|
|
|
|
lda LCol
|
|
Call S_ColLab2Text
|
|
sta LCol
|
|
|
|
lda FCol
|
|
Call S_ColLab2Text
|
|
sta Buffer
|
|
|
|
loop
|
|
Tool _MoveTo,in=(Xpt:w,#S_EditHeight:w)
|
|
Tool _LineTo,in=(Xpt:w,#S_EditHeight+S_ColLabelHeight:w)
|
|
|
|
; Draw label ;
|
|
|
|
Tool _TextWidth,in=(#Buffer:l,#2:w),out=(TextWd:w)
|
|
Call S_CellWidth,in=(Wcnt:w),out=(x:w)
|
|
|
|
SubWord x,TextWd,a
|
|
lsr a
|
|
AddWord a,Xpt,s
|
|
|
|
AddWord x,Xpt,Xpt
|
|
|
|
Tool _MoveTo,in=(:w,#S_EditHeight+S_TextOffset+1:w)
|
|
|
|
Call D_DrawText,in=(#Buffer:l,#2:w)
|
|
|
|
; Increment label by one ;
|
|
|
|
skip
|
|
CmpWord Buffer,LCol
|
|
beq done
|
|
|
|
inc Wcnt
|
|
|
|
AddWord #$0100,Buffer,Buffer
|
|
and #$FF00
|
|
cmp #$5B00 ; hex for 'Z' + 1
|
|
jlt loop
|
|
|
|
lda Buffer
|
|
and #$001F
|
|
ora #$4140 ; keep most sig letter
|
|
inc a
|
|
sta Buffer
|
|
brl loop
|
|
|
|
done
|
|
RETURN
|
|
|
|
Buffer DS.B 2
|
|
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_DrawGrid(X2:w,Y2:w,X1:w,Y1:w,LCol:w)
|
|
;
|
|
; This routine will draw the grid in the content area of the spreadsheet
|
|
; starting at the x1,y1 cordinates and drawing to the x2,y2
|
|
; coordinates.
|
|
|
|
S_DrawGrid PROC EXPORT
|
|
;Using S_CurrentData
|
|
;Using S_ConstantData
|
|
|
|
input X2:w,Y2:w,X1:w,Y1:w,LCol:w
|
|
local Count:w,Wcnt:w
|
|
BEGIN
|
|
|
|
lda S_CurEditFlag
|
|
and #S_GridOff
|
|
jne Exit
|
|
|
|
lda S_CurPrinting
|
|
bne maskSet
|
|
|
|
Tool _SetPenMask,in=(#S_DashMask:l)
|
|
maskSet
|
|
|
|
; Draw the horizontal lines ;
|
|
|
|
MoveWord Y1,Count
|
|
|
|
loop3
|
|
Tool _MoveTo,in=(X1:w,Count:w)
|
|
Tool _LineTo,in=(X2:w,Count:w)
|
|
|
|
step3
|
|
AddWord #S_RowHeight,Count,Count
|
|
|
|
CmpWord Y2,Count
|
|
bge loop3
|
|
|
|
; Draw the vertical lines ;
|
|
|
|
MoveWord LCol,Wcnt
|
|
MoveWord X1,Count
|
|
|
|
loop4
|
|
Tool _MoveTo,in=(Count:w,Y1:w)
|
|
Tool _LineTo,in=(Count:w,Y2:w)
|
|
|
|
step4
|
|
Call S_CellWidth,in=(Wcnt:w),out=(a:w)
|
|
|
|
AddWord a,Count,Count
|
|
|
|
inc Wcnt
|
|
|
|
CmpWord X2,Count
|
|
bge loop4
|
|
|
|
Tool _SetPenMask,in=(#S_NormalMask:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_DrawRowLabels(Ypt:w,FRow:w,LRow:w)
|
|
;
|
|
; This routine draws the row labels in the given range starting at the given
|
|
; y coordinate. (x = constant).
|
|
|
|
S_DrawRowLabels PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input Ypt:w,FRow:w,LRow:w
|
|
local Rect:r
|
|
BEGIN
|
|
|
|
; Calculate the total length of the New labels ;
|
|
|
|
SubWord LRow,FRow,a
|
|
inc a
|
|
|
|
tax
|
|
ldy #S_RowHeight
|
|
Call D_FastMult
|
|
|
|
AddWord a,Ypt,Rect+4
|
|
|
|
; Paint the background light yellow ;
|
|
|
|
Call D_Set4Pat,in=(#LightYellow:w)
|
|
|
|
MoveWord Ypt,Rect
|
|
MoveWord S_RowLabRect+2,Rect+2
|
|
MoveWord S_RowLabRect+6,Rect+6
|
|
Tool _PaintRect,in=(!Rect:l)
|
|
|
|
Call D_Set4Pat,in=(#Black:w)
|
|
|
|
; Frame the New area ;
|
|
|
|
Tool _MoveTo,in=(#S_NumLabelWidth:w,Ypt:w)
|
|
Tool _LineTo,in=(#S_NumLabelWidth:w,Rect+4:w)
|
|
|
|
Tool _MoveTo,in=(#0:w,Rect+4:w)
|
|
Tool _LineTo,in=(#S_NumLabelWidth:w,Rect+4:w)
|
|
|
|
; Draw the labels with dividers ;
|
|
|
|
loop
|
|
Tool _MoveTo,in=(#0:w,Ypt:w)
|
|
Tool _LineTo,in=(#S_NumLabelWidth:w,Ypt:w)
|
|
|
|
Tool _Int2Dec,in=(FRow:w,#Buffer:l,#4:w,#0:w)
|
|
|
|
in #S_NumLabOffSet-S_NumLabelWidth:w,#S_TextOffset:w
|
|
XTool _Move
|
|
Call D_DrawText,in=(#Buffer:l,#4:w)
|
|
|
|
inc FRow
|
|
AddWord Ypt,#S_RowHeight,Ypt
|
|
|
|
CmpWord LRow,FRow
|
|
bge loop
|
|
|
|
RETURN
|
|
|
|
Buffer DS.B 4
|
|
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_HiliteCells
|
|
;
|
|
|
|
S_HiliteCells PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
local Rect:r
|
|
BEGIN
|
|
|
|
in S_CurTLSelect:l
|
|
out a:w,a:w,Rect:l
|
|
XCall S_WhereCell
|
|
|
|
in S_CurBRSelect:l
|
|
out Rect+4:l,a:w,a:w
|
|
XCall S_WhereCell
|
|
|
|
lda Rect
|
|
bne cont1
|
|
|
|
MoveWord S_CurContYpt,Rect
|
|
bra chk2
|
|
|
|
cont1
|
|
cmp S_CurContHt
|
|
bge Exit
|
|
|
|
chk2
|
|
lda Rect+2
|
|
bne cont2
|
|
|
|
MoveWord S_CurContXpt,Rect+2
|
|
bra chk3
|
|
|
|
cont2
|
|
cmp S_CurContWd
|
|
bge Exit
|
|
|
|
chk3
|
|
inc Rect
|
|
inc Rect+2
|
|
inc Rect+2
|
|
|
|
lda Rect+4
|
|
beq Exit
|
|
|
|
inc a
|
|
cmp S_CurContHt
|
|
blt cont3
|
|
|
|
lda S_CurContHt
|
|
|
|
cont3
|
|
sta Rect+4
|
|
|
|
chk4
|
|
lda Rect+6
|
|
beq Exit
|
|
|
|
inc a
|
|
inc a
|
|
|
|
cmp S_CurContWd
|
|
blt cont4
|
|
|
|
lda S_CurContWd
|
|
|
|
cont4
|
|
sta Rect+6
|
|
|
|
CmpWord Rect,Rect+4
|
|
bge Exit
|
|
|
|
CmpWord Rect+2,Rect+6
|
|
bge Exit
|
|
|
|
Tool _InvertRect,in=(!Rect:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_FindLeftContent( CurCell:l ): ContCell:l,Offset:w
|
|
;
|
|
;
|
|
|
|
S_FindLeftContent PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input CurCell:l
|
|
output ContCell:l,Offset:w
|
|
local CellPtr:l
|
|
BEGIN
|
|
|
|
stz Offset
|
|
|
|
overlapLoop
|
|
dec CurCell+2
|
|
|
|
Call S_CellWidth,in=(CurCell+2:w),out=(:w)
|
|
SubWord Offset,s,Offset
|
|
|
|
in CurCell:l
|
|
out CellPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
MoveWord [CellPtr]:#S_CellFormat,a
|
|
bmi overlapLoop
|
|
|
|
MoveLong CurCell,ContCell
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_FindRightContent( CurCell:l ): ContCell:l,Offset:w
|
|
;
|
|
; It may be the first cell.
|
|
|
|
S_FindRightContent PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input CurCell:l
|
|
output ContCell:l,Offset:w
|
|
local CellPtr:l
|
|
BEGIN
|
|
|
|
stz Offset
|
|
|
|
overlapLoop
|
|
Call S_CellWidth,in=(CurCell+2:w),out=(a:w)
|
|
AddWord a,Offset,Offset
|
|
|
|
inc CurCell+2
|
|
|
|
in CurCell:l
|
|
out CellPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
MoveWord [CellPtr]:#S_CellFormat,a
|
|
bmi overlapLoop
|
|
|
|
MoveLong CurCell,ContCell
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
;--------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_DrawLocation PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
local StrPtr:l,TextWd:w
|
|
BEGIN
|
|
|
|
Tool _EraseRect,in=(#LocRect:l)
|
|
|
|
CmpLong S_CurTLSelect,S_CurBRSelect
|
|
bne doRangeStr
|
|
|
|
MoveLong #Buffer,StrPtr
|
|
Call S_Cell2Str,in=(#Buffer:l,S_CurTLSelect:l)
|
|
bra doDraw
|
|
|
|
doRangeStr
|
|
MoveLong #RangeStr,StrPtr
|
|
|
|
doDraw
|
|
Tool _StringWidth,in=(StrPtr:l),out=(TextWd:w)
|
|
|
|
SubWord #S_NumLabelWidth,TextWd,a
|
|
lsr a
|
|
|
|
Tool _MoveTo,in=(a:w,#S_EditHeight+S_TextOffset+1:w)
|
|
Call D_DrawString,in=(StrPtr:l)
|
|
|
|
RETURN
|
|
|
|
LocRect DC.W S_EditHeight+2,0
|
|
DC.W S_EditHeight+S_ColLabelHeight,S_NumLabelWidth
|
|
RangeStr str 'Range'
|
|
Buffer DS.B 7
|
|
|
|
ENDP
|
|
|
|
;--------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_DrawBothTitles PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
local DoDrawRegion:w
|
|
BEGIN
|
|
|
|
stz DoDrawRegion
|
|
|
|
Call S_DrawLocation
|
|
|
|
CmpWord S_CurContXpt,#S_NumLabelWidth
|
|
beq chkRowLabels
|
|
|
|
inc DoDrawRegion
|
|
|
|
in #S_NumLabelWidth:w
|
|
in S_CurTLTitle+2:w,S_CurBRTitle+2:w ; only cols
|
|
XCall S_DrawColLabels
|
|
|
|
chkRowLabels
|
|
CmpWord S_CurContYpt,#S_EditHeight+S_ColLabelHeight
|
|
beq Exit
|
|
|
|
in #S_EditHeight+S_ColLabelHeight:w
|
|
in S_CurTLTitle:w,S_CurBRTitle:w ; only rows
|
|
XCall S_DrawRowLabels
|
|
|
|
lda DoDrawRegion
|
|
beq Exit
|
|
|
|
in S_CurContXpt:w,S_CurContYpt:w
|
|
in #S_NumLabelWidth:w,#S_EditHeight+S_ColLabelHeight:w
|
|
in S_CurTLTitle:l,S_CurBRTitle:l,#0:w
|
|
in #S_NumLabelWidth:w
|
|
XCall S_DrawRegion
|
|
|
|
in S_CurContXpt:w,#S_EditHeight+S_ColLabelHeight:w
|
|
XTool _MoveTo
|
|
Tool _LineTo,in=(S_CurContXpt:w,S_CurContYpt:w)
|
|
|
|
Tool _MoveTo,in=(#S_NumLabelWidth:w,S_CurContYpt:w)
|
|
Tool _LineTo,in=(S_CurContXpt:w,S_CurContYpt:w)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;--------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_DrawColTitles PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input Xpt:w,FCol:w,LCol:w
|
|
local Xpt2:w
|
|
BEGIN
|
|
|
|
CmpWord S_CurContYpt,#S_EditHeight+S_ColLabelHeight
|
|
beq Exit
|
|
|
|
in LCol:w,S_CurTLCell:w
|
|
out Xpt2:w,a:w,a:w,a:w
|
|
XCall S_WhereCell
|
|
|
|
in Xpt2:w,S_CurContYpt:w
|
|
in Xpt:w,#S_EditHeight+S_ColLabelHeight:w
|
|
in FCol:w,S_CurTLTitle:w,LCol:w,S_CurBRTitle:w,#0:w
|
|
in S_CurContXpt:w
|
|
XCall S_DrawRegion
|
|
|
|
Tool _MoveTo,in=(S_CurContXpt:w,S_CurContYpt:w)
|
|
Tool _LineTo,in=(S_CurContWd:w,S_CurContYpt:w)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;--------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_DrawRowTitles PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input Ypt:w,FRow:w,LRow:w
|
|
local Ypt2:w
|
|
BEGIN
|
|
|
|
CmpWord S_CurContXpt,#S_NumLabelWidth
|
|
beq Exit
|
|
|
|
in S_CurTLCell+2:w,LRow:w
|
|
out a:w,Ypt2:w,a:w,a:w
|
|
XCall S_WhereCell
|
|
|
|
in S_CurContXpt:w,Ypt2:w
|
|
in #S_NumLabelWidth:w,Ypt:w
|
|
in S_CurTLTitle+2:w,FRow:w,S_CurBRTitle+2:w,LRow:w,#0:w
|
|
in #S_NumLabelWidth:w
|
|
XCall S_DrawRegion
|
|
|
|
Tool _MoveTo,in=(S_CurContXpt:w,S_CurContYpt:w)
|
|
Tool _LineTo,in=(S_CurContXpt:w,S_CurContHt:w)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_DrawRegion PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input Xpt2:w,Ypt2:w,Xpt:w,Ypt:w
|
|
input TLCell:l,BRCell:l,DoHilite:w
|
|
input LeftEdge:w
|
|
local Rect:r,RectPtr:l,OldClip:l
|
|
local Ycnt:w,Xcnt:w,CurCol:w
|
|
BEGIN
|
|
|
|
inc Ypt2
|
|
inc Xpt2
|
|
inc Xpt2
|
|
|
|
; Set the clip area ;
|
|
|
|
lda Ypt
|
|
inc a
|
|
sta Rect
|
|
|
|
AddWord LeftEdge,#2,Rect+2
|
|
|
|
MoveWord S_CurContHt,Rect+4
|
|
MoveWord S_CurContWd,Rect+6
|
|
|
|
MoveLong !Rect,RectPtr
|
|
Tool _SectRect,in=(RectPtr:l,!Ypt:l,RectPtr:l),out=(a:w)
|
|
|
|
Tool _NewRgn,out=(OldClip:l)
|
|
Tool _GetClip,in=(OldClip:l)
|
|
|
|
Tool _NewRgn,out=(S_ClipHandle:l)
|
|
Tool _RectRgn,in=(S_ClipHandle:l,RectPtr:l)
|
|
Tool _SectRgn,in=(OldClip:l,S_ClipHandle:l,S_ClipHandle:l)
|
|
Tool _SetClip,in=(S_ClipHandle:l)
|
|
|
|
|
|
; Erase, but don't get any border lines. ;
|
|
|
|
CmpWord BRCell,#9999
|
|
blt ChkCol
|
|
|
|
dec Ypt2
|
|
|
|
Tool _MoveTo,in=(#0:w,Ypt2:w)
|
|
Tool _LineTo,in=(Xpt2:w,Ypt2:w)
|
|
|
|
chkCol
|
|
CmpWord BRCell+2,#$02BE
|
|
blt doErase
|
|
|
|
dec Xpt2
|
|
dec Xpt2
|
|
|
|
Tool _MoveTo,in=(Xpt2:w,#S_EditHeight+2:w)
|
|
Tool _LineTo,in=(Xpt2:w,Ypt2:w)
|
|
|
|
doErase
|
|
Tool _EraseRect,in=(!Ypt:l)
|
|
|
|
|
|
; Draw grid, the moved endpts are okay. ;
|
|
|
|
in Xpt2:w,Ypt2:w,Xpt:w,Ypt:w,TLCell+2:w
|
|
XCall S_DrawGrid
|
|
|
|
|
|
MoveWord Ypt,Ycnt
|
|
bra skip5
|
|
|
|
; Outer loop, for each row in the range, .... ;
|
|
|
|
loop2
|
|
AddWord #S_RowHeight,Ycnt,Ycnt
|
|
inc TLCell
|
|
|
|
skip5
|
|
MoveWord TLCell+2,CurCol
|
|
|
|
MoveWord Xpt,Xcnt
|
|
bra skip6
|
|
|
|
; Inner loop, for each cell in the current row, .... ;
|
|
|
|
loop1
|
|
Call S_CellWidth,in=(CurCol:w),out=(a:w)
|
|
AddWord a,Xcnt,Xcnt
|
|
|
|
inc CurCol
|
|
|
|
skip6
|
|
in CurCol:w,TLCell:w,Xcnt:w,Ycnt:w
|
|
XCall S_DrawCell
|
|
|
|
CmpWord CurCol,BRCell+2
|
|
blt loop1
|
|
|
|
CmpWord TLCell,BRCell
|
|
blt loop2
|
|
|
|
lda DoHilite
|
|
beq resetClip
|
|
|
|
Tool _SetClip,in=(S_ClipHandle:l)
|
|
Call S_HiliteCells
|
|
|
|
resetClip
|
|
Tool _SetClip,in=(OldClip:l)
|
|
Tool _DisposeRgn,in=(OldClip:l)
|
|
Tool _DisposeRgn,in=(S_ClipHandle:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_PrintPage (TLCell:l,BRCell:l,Rect:r) BRCellPrinted:l
|
|
;
|
|
;
|
|
|
|
S_PrintPage PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
input TLCell:l,BRCell:l
|
|
input BRPoint:l,TLPoint:l
|
|
output NextCol:w,NextRow:w
|
|
local BRPointPrinted:l,GetBRLoc:w
|
|
BEGIN
|
|
|
|
stz GetBRLoc
|
|
|
|
; Determine the range to Update, and their coordinates ;
|
|
|
|
in BRPoint:l
|
|
out NextRow:l,BRPointPrinted:l
|
|
XCall S_WhichCell
|
|
|
|
CmpWord NextRow,TLCell ; rows only
|
|
bne BRowOk
|
|
|
|
sta BRCell
|
|
inc a
|
|
sta NextRow
|
|
|
|
AddWord BRPointPrinted,#S_RowHeight+1,BRPoint
|
|
bra chkRCol
|
|
|
|
BRowOk
|
|
cmp BRCell
|
|
beq doAllVert
|
|
blt doAllVert
|
|
|
|
inc GetBRLoc
|
|
bra chkRCol
|
|
|
|
doAllVert
|
|
lda BRPointPrinted
|
|
inc a
|
|
sta BRPoint
|
|
|
|
lda NextRow
|
|
dec a
|
|
sta BRCell
|
|
|
|
chkRCol
|
|
CmpWord NextCol,TLCell+2 ; cols only
|
|
bne RColOk
|
|
|
|
sta BRCell+2
|
|
inc a
|
|
sta NextCol
|
|
|
|
dec a
|
|
Call S_CellWidth,in=(a:w),out=(a:w)
|
|
|
|
inc a
|
|
inc a
|
|
AddWord a,BRPointPrinted+2,BRPoint+2
|
|
bra gotBRCell
|
|
|
|
RColOk
|
|
cmp BRCell+2
|
|
beq doAllHorz
|
|
blt doAllHorz
|
|
|
|
inc GetBRLoc
|
|
bra gotBRCell
|
|
|
|
doAllHorz
|
|
lda BRPointPrinted+2
|
|
inc a
|
|
inc a
|
|
sta BRPoint+2
|
|
|
|
lda NextCol
|
|
dec a
|
|
sta BRCell+2
|
|
|
|
gotBRCell
|
|
lda GetBRLoc
|
|
beq gotBRLoc
|
|
|
|
in BRCell:l
|
|
out :w,:w,a:w,a:w
|
|
XCall S_WhereCell
|
|
|
|
pla
|
|
inc a
|
|
sta BRPoint
|
|
|
|
pla
|
|
inc a
|
|
inc a
|
|
sta BRPoint+2
|
|
|
|
gotBRLoc
|
|
Tool _ClipRect,in=(!TLPoint:l)
|
|
|
|
dec BRPoint
|
|
dec BRPoint+2
|
|
dec BRPoint+2
|
|
|
|
lda S_CurEditFlag
|
|
and #S_GridOff
|
|
bne skipTLlines
|
|
|
|
Tool _MoveTo,in=(#0:w,#0:w)
|
|
Tool _LineTo,in=(S_CurContWd:w,#0:w)
|
|
|
|
Tool _MoveTo,in=(#0:w,#0:w)
|
|
Tool _LineTo,in=(#0:w,S_CurContHt:w)
|
|
|
|
skipTLlines
|
|
lda S_CurContYpt
|
|
beq doneTopTitle
|
|
|
|
lda S_CurContXpt
|
|
beq doneBothTitle
|
|
|
|
in S_CurContXpt:w,S_CurContYpt:w
|
|
in #0:w,#0:w
|
|
in S_CurTLTitle:l,S_CurBRTitle:l,#0:w
|
|
in #0:w
|
|
XCall S_DrawRegion
|
|
|
|
doneBothTitle
|
|
in BRPoint+2:w,S_CurContYpt:w
|
|
in S_CurContXpt:w,#0:w
|
|
in TLCell+2:w,S_CurTLTitle:w
|
|
in BRCell+2:w,S_CurBRTitle:w,#0:w
|
|
in S_CurContXpt:w
|
|
XCall S_DrawRegion
|
|
|
|
Tool _MoveTo,in=(#0:w,S_CurContYpt:w)
|
|
Tool _LineTo,in=(S_CurContWd:w,S_CurContYpt:w)
|
|
|
|
doneTopTitle
|
|
lda S_CurContXpt
|
|
beq doneLeftTitle
|
|
|
|
in S_CurContXpt:w,BRPoint:w
|
|
in #0:w,S_CurContYpt:w
|
|
in S_CurTLTitle+2:w,TLCell:w
|
|
in S_CurBRTitle+2:w,BRCell:w,#0:w
|
|
in #0:w
|
|
XCall S_DrawRegion
|
|
|
|
Tool _MoveTo,in=(S_CurContXpt:w,#0:w)
|
|
Tool _LineTo,in=(S_CurContXpt:w,S_CurContHt:w)
|
|
|
|
doneLeftTitle
|
|
in BRPoint:l,S_CurContXpt:w,S_CurContYpt:w
|
|
in TLCell:l,BRCell:l,#0:w
|
|
in S_CurContXpt:w
|
|
XCall S_DrawRegion
|
|
|
|
RETURN
|
|
ENDP
|
|
END
|
|
|