
		LOAD		'Macros.dump'

		INCLUDE	'SS.equ'

		INCLUDE	'Driver.equ'
		INCLUDE	'Heap.aii.i'

;-----------------------------------------------
;
;	Imported addresses
;
;-----------------------------------------------

		IMPORT	D_AlertBox
		IMPORT	D_CloseDialog
		IMPORT	D_DigitsOnly
		IMPORT	D_DisableMItems
		IMPORT	D_EnableMItems
		IMPORT	D_GetNewModalDialog
		IMPORT	D_MemoryError

		IMPORT	X_DialogFromScrap
		IMPORT	X_DialogToScrap
		IMPORT	X_GetScrap
		IMPORT	X_SSScTypes

		IMPORT	S_ActiveWindow
		IMPORT	S_BuildSimpleUndo
		IMPORT	S_CurBRSelect
		IMPORT	S_CurChartCount
		IMPORT	S_CurDefFormat
		IMPORT	S_CurEditFlag
		IMPORT	S_CurFormat
		IMPORT	S_CurTLSelect
		IMPORT	S_CurWindow
		IMPORT	S_GetCellPtr
		IMPORT	S_InsertLeftPadCells
		IMPORT	S_InsertRightPadCells
		IMPORT	S_PasteFormatMsg
		IMPORT	S_QTraverse
		IMPORT	S_RedrawCellRange
		IMPORT	S_RemovePadCells
		IMPORT	S_SetFixDlog
		IMPORT	S_SetUndoOff
		IMPORT	S_SetUndoOn
		IMPORT	S_SfCountNum
		IMPORT	S_SfCountTxt
		IMPORT	S_SwapIn

;-----------------------------------------------
;
;	Forward addresses and entries
;
;-----------------------------------------------

		ENTRY	S_CheckCount
		ENTRY	S_CheckTraverse
		ENTRY	S_DoChecks
		ENTRY	S_DoFormat
		ENTRY	S_DoFormatChange
		ENTRY	S_FixAlign
		ENTRY	S_FormatAndMask1
		ENTRY	S_FormatAndMask2
		ENTRY	S_FormatBRCell
		ENTRY	S_FormatOrMask1
		ENTRY	S_FormatOrMask2
		ENTRY	S_FormatPadFlag
		ENTRY	S_FormatTLCell
		ENTRY	S_JustifyType
		ENTRY	S_ToggleFormat

;-------------------------------------------------------------------------;
; S_PasteFormat ()
;

S_PasteFormat	PROC		EXPORT
			;Using	X_ClipData
			;Using	S_AttrData
			;Using	S_CurrentData
			;Using	S_FormatData
			;Using	S_ErrorData

			local	ScrapHandle:l,ScrapPtr:l,Format:l,SFlag:w
			error	ErrFlag
			BEGIN	+b

			stz		ErrFlag

			Call		X_GetScrap,in=(#X_SSScTypes:l),out=(SFlag:w,ScrapHandle:l)
			bcc		chkScrap

cantStart
			Call		D_MemoryError
			brl		Quit

chkScrap
			beq		needScrap

	;	Got a Scrap	;

			MoveLong	[ScrapHandle],ScrapPtr

			MoveWord	[ScrapPtr]:#S_ScrapParseCode,a
			bne		needScrap

			lda		#1
			CmpWord	a,[ScrapPtr]:#S_ScrapRows
			bne		needScrap

			CmpWord	a,[ScrapPtr]:#S_ScrapCols
			beq		goodScrap

needScrap
			Call		D_AlertBox,in=(#OkBox:w,#S_PasteFormatMsg:l),out=(a:w)

			lda		SFlag
			jeq		Quit
			brl		Exit

goodScrap
			Call		S_SwapIn,in=(S_ActiveWindow:l)

			CmpLong	[ScrapPtr]:#S_ScrapSize,#S_ScrapCells
			beq		useDefault

			MoveLong	[ScrapPtr]:#S_ScrapCells+S_ScrapFormat,Format
			bra		doPaste

useDefault
			MoveLong	S_CurDefFormat,Format

	;	Determine where to paste format	;

doPaste
			lda		S_CurEditFlag
			and		#S_EditingBit
			beq		notEditing

			MoveLong	Format,S_CurFormat
			brl		doChecks

notEditing
AndMask1		equ		S_CellType+S_CellInvalid+S_CellError+S_CellJustify
AndMask2		equ		S_CellProtect+S_CellCircular

			MoveLong	S_CurTLSelect,S_FormatTLCell
			MoveLong	S_CurBRSelect,S_FormatBRCell

			in		S_CurTLSelect:l,S_CurBRSelect:l
			XCall	S_BuildSimpleUndo,err=ErrFlag
			bcs		memError

	;	Fix alignment	;

			lda		Format
			and		#S_CellJustify
			sta		S_JustifyType

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_FixAlign:l
			XCall	S_QTraverse
			bcs		memError

	;	Change all but alignment formatting	;

			lda		Format
			and		#$FFFF-AndMask1
			sta		S_FormatOrMask1

			iny
			iny
			lda		Format+2
			and		#$FFFF-AndMask2
			sta		S_FormatOrMask2

			MoveWord	#AndMask1,S_FormatAndMask1
			MoveWord	#AndMask2,S_FormatAndMask2

			MoveWord	#S_BoldItem,S_FormatPadFlag

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_DoFormat:l
			XCall	S_QTraverse
			bcc		redraw

memError
			Call		D_MemoryError

redraw
			Call		S_RedrawCellRange,in=(S_FormatTLCell:l,S_FormatBRCell:l)
			Call		S_SetUndoOn,in=(#S_UndoPasteFormatType:w)

doChecks
			Call		S_DoChecks

Exit
			Tool		_DisposeHandle,in=(ScrapHandle:l)

Quit
			RETURN
			ENDP


;		*******************	Alignments	******************
;-------------------------------------------------------------------------;
; S_AlignLeft
;

S_AlignLeft	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_FormatData

			BEGIN	+b

			Call		S_SwapIn,in=(S_ActiveWindow:l)
			Call		S_SetUndoOff

			lda		S_CurEditFlag
			and		#S_EditingBit
			beq		notEditing

			lda		S_CurFormat
			and		#-1-S_CellJustify
;			ora		#S_CellLeftJustify				; = 0
			sta		S_CurFormat

			bra		Exit

notEditing
			Tool		_SetPort,in=(S_CurWindow:l)

			stz		S_JustifyType
			MoveLong	S_CurTLSelect,S_FormatTLCell
			MoveLong	S_CurBRSelect,S_FormatBRCell

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_FixAlign:l
			XCall	S_QTraverse
			bcc		redraw

			Call		D_MemoryError

redraw
			Call		S_RedrawCellRange,in=(S_FormatTLCell:l,S_FormatBRCell:l)

Exit
			jsl		S_DoChecks
			RETURN
			ENDP

;-------------------------------------------------------------------------;
; S_AlignRight
;

S_AlignRight	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_FormatData

			BEGIN	+b

			Call		S_SwapIn,in=(S_ActiveWindow:l)
			Call		S_SetUndoOff

			lda		S_CurEditFlag
			and		#S_EditingBit
			beq		notEditing

			lda		S_CurFormat
			and		#-1-S_CellJustify
			ora		#S_CellRightJustify
			sta		S_CurFormat

			bra		Exit

notEditing
			Tool		_SetPort,in=(S_CurWindow:l)

			MoveWord	#S_CellRightJustify,S_JustifyType
			MoveLong	S_CurTLSelect,S_FormatTLCell
			MoveLong	S_CurBRSelect,S_FormatBRCell

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_FixAlign:l
			XCall	S_QTraverse
			bcc		redraw

			Call		D_MemoryError

redraw
			Call		S_RedrawCellRange,in=(S_FormatTLCell:l,S_FormatBRCell:l)

Exit
			jsl		S_DoChecks
			RETURN
			ENDP

;-------------------------------------------------------------------------;
; S_AlignCenter
;

S_AlignCenter	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_FormatData

			BEGIN	+b

			Call		S_SwapIn,in=(S_ActiveWindow:l)
			Call		S_SetUndoOff

			lda		S_CurEditFlag
			and		#S_EditingBit
			beq		notEditing

			lda		S_CurFormat
			and		#-1-S_CellJustify
			ora		#S_CellCenterJustify
			sta		S_CurFormat

			bra		Exit

notEditing
			Tool		_SetPort,in=(S_CurWindow:l)

			MoveWord	#S_CellCenterJustify,S_JustifyType
			MoveLong	S_CurTLSelect,S_FormatTLCell
			MoveLong	S_CurBRSelect,S_FormatBRCell

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_FixAlign:l
			XCall	S_QTraverse
			bcc		redraw

			Call		D_MemoryError

redraw
			Call		S_RedrawCellRange,in=(S_FormatTLCell:l,S_FormatBRCell:l)

Exit
			jsl		S_DoChecks
			RETURN
			ENDP

;----------------------------------------------------------------------------
;
;

S_FixAlign	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_FormatData

			input	Cell:l,CellIndex:l
			local	CellPtr:l,Format:w
			error	ErrFlag
			BEGIN

			stz		ErrFlag

			H_GetBlockPtr	CellIndex,CellPtr

			MoveWord	[CellPtr]:#S_CellFormat,Format
			bmi		Exit

	;	Is it already justified correctly	;

			lda		Format
			and		#S_CellJustify

			cmp		S_JustifyType
			jeq		Exit

	;	Set the Justification	;

			lda		Format
			and		#-1-S_CellJustify
			ora		S_JustifyType
			MoveWord	a,[CellPtr]:#S_CellFormat

	;	Is the cell of type text	;

			and		#S_CellType
			jne		Exit					; text type = 0

	;	Remove old pad cells	;

			in		Cell:l
			out		:l,:l
			XCall	S_RemovePadCells,err=ErrFlag

			pla
			plx

			cpx		S_FormatBRCell+2
			blt		chkLeft1

			stx		S_FormatBRCell+2

chkLeft1
			pla
			plx

			cpx		S_FormatTLCell+2
			bge		chkRight2

			stx		S_FormatTLCell+2

	;	Insert New pad cells	;

chkRight2
			lda		ErrFlag
			bne		Exit

			in		Cell:l
			out		ax:l
			XCall	S_InsertRightPadCells,err=ErrFlag
			bcs		Exit

			cpx		S_FormatBRCell+2
			blt		chkLeft2

			stx		S_FormatBRCell+2

chkLeft2
			in		Cell:l
			out		ax:l
			XCall	S_InsertLeftPadCells,err=ErrFlag
			bcs		Exit

			cpx		S_FormatTLCell+2
			bge		Exit

			stx		S_FormatTLCell+2

Exit
			RETURN
			ENDP

;------------------------------------------------------------------------
; S_FormatData
;

S_FormatData	PROC		EXPORT

		EXPORT	S_FormatItem
		EXPORT	S_FormatPadFlag
		EXPORT	S_FormatAndMask1
		EXPORT	S_FormatAndMask2
		EXPORT	S_FormatOrMask1
		EXPORT	S_FormatOrMask2
		EXPORT	S_JustifyType
		EXPORT	S_FormatTLCell
		EXPORT	S_FormatBRCell

S_FormatItem		DS.B 	2
S_FormatPadFlag	DC.W		0

S_FormatAndMask1	DS.B 	2				; low word mask
S_FormatAndMask2	DS.B 	2				; high word mask

S_FormatOrMask1	DS.B 	2				; low word mask
S_FormatOrMask2	DS.B 	2				; high word mask

S_JustifyType		DS.B 	2

S_FormatTLCell		DS.B 	4
S_FormatBRCell		DS.B 	4

			ENDP


;	;***************	Formatting Options ;************
;-------------------------------------------------------------------------;
; S_FormatBold
; S_FormatULine
; S_FormatComma
; S_FormatRedNeg
; S_FormatParenNeg
; S_DataProtect
;

S_FormatBold	PROC		EXPORT
			;Using	S_AttrData
			;Using	S_CurrentData
			;Using	S_FormatData

		EXPORT	S_FormatULine
		EXPORT	S_FormatComma
		EXPORT	S_FormatRedNeg
		EXPORT	S_FormatParenNeg
		EXPORT	S_DataProtect

			MoveWord	#S_BoldItem,>S_FormatItem
			sta		>S_FormatPadFlag
			MoveWord	#S_CellBold,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			jmp		S_ToggleFormat

S_FormatULine
			MoveWord	#S_UnderlineItem,>S_FormatItem
			sta		>S_FormatPadFlag
			MoveWord	#S_CellULine,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			jmp		S_ToggleFormat

S_FormatComma
			MoveWord	#S_CommaItem,>S_FormatItem
			MoveWord	#S_CellComma,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			jmp		S_ToggleFormat

S_FormatRedNeg
			MoveWord	#S_RedNegItem,>S_FormatItem
			MoveWord	#S_CellRedNeg,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			jmp		S_ToggleFormat

S_FormatParenNeg
			MoveWord	#S_ParenItem,>S_FormatItem
			MoveWord	#S_CellParenNeg,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			jmp		S_ToggleFormat

S_DataProtect
			MoveWord	#S_ProtectItem,>S_FormatItem
			MoveWord	#0,>S_FormatOrMask1
			MoveWord	#S_CellProtect,>S_FormatOrMask2
			jmp		S_ToggleFormat

			ENDP

;---------------------------------------------------------------------------
;
; S_FormatToggle 
;

S_ToggleFormat	PROC		EXPORT
			;Using	S_FormatData

			pha
			lda		>S_FormatItem
			pha
			Tool		_GetMItemMark	; in=(:w),out=(a:w)
			pla
			beq		SetIt

ResetIt
			lda		>S_FormatOrMask1
			eor		#-1
			sta		>S_FormatAndMask1
			lda		>S_FormatOrMask2
			eor		#-1
			sta		>S_FormatAndMask2
			MoveWord	#0,>S_FormatOrMask1
			MoveWord	a,>S_FormatOrMask2
			bra		DoTraverse

SetIt
			MoveWord	#-1,>S_FormatAndMask1
			MoveWord	a,>S_FormatAndMask2

DoTraverse
			jmp		S_DoFormatChange

			ENDP


;	;******************	Number Format	;******************
;-------------------------------------------------------------------------;
; S_FormatDollar
; S_FormatFixed
; S_FormatPercent
; S_FormatSciNote
; S_FormatGeneral
;

S_FormatDollar	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_FormatData

		EXPORT	S_FormatFixed
		EXPORT	S_FormatPercent
		EXPORT	S_FormatSciNote
		EXPORT	S_FormatGeneral

DollarMask1	equ	-1-S_CellPercent-S_CellSciNote-S_CellFixed
FixedMask1	equ	-1-S_CellPercent-S_CellSciNote-S_CellDollar
PercentMask1	equ	-1-S_CellDollar-S_CellSciNote-S_CellFixed
SciNoteMask1	equ	-1-S_CellPercent-S_CellDollar-S_CellFixed
GeneralMask1	equ	-1-S_CellPercent-S_CellSciNote-S_CellFixed-S_CellDollar

			MoveWord	#S_CellDollar,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			MoveWord	#DollarMask1,>S_FormatAndMask1
			MoveWord	#-1,>S_FormatAndMask2
			jmp		S_DoFormatChange

S_FormatFixed
			MoveWord	#S_CellFixed,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			MoveWord	#FixedMask1,>S_FormatAndMask1
			MoveWord	#-1,>S_FormatAndMask2
			jmp		S_DoFormatChange

S_FormatPercent
			MoveWord	#S_CellPercent,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			MoveWord	#PercentMask1,>S_FormatAndMask1
			MoveWord	#-1,>S_FormatAndMask2
			jmp		S_DoFormatChange

S_FormatSciNote
			MoveWord	#S_CellSciNote,>S_FormatOrMask1
			MoveWord	#0,>S_FormatOrMask2
			MoveWord	#SciNoteMask1,>S_FormatAndMask1
			MoveWord	#-1,>S_FormatAndMask2
			jmp		S_DoFormatChange

S_FormatGeneral
			MoveWord	#0,>S_FormatOrMask1
			MoveWord	a,>S_FormatOrMask2
			MoveWord	#GeneralMask1,>S_FormatAndMask1
			MoveWord	#-1,>S_FormatAndMask2
			jmp		S_DoFormatChange

			ENDP


; ;***********************************************************************
;---------------------------------------------------------------------------
;
; S_SetDecimal	
;

S_SetDecimal	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_WindowData
			;Using	S_FormatData

			local	TheDlog:l,Result:w,Text:l
			local	Topl:l,Botr:l
			BEGIN	+b

			Call		S_SwapIn,in=(S_ActiveWindow:l)

			stz		S_SfCountTxt

			lda		S_SfCountNum
			cmp		#-1
			beq		DoDlog

			xba
			ora		#$3001				; make it into a string
			sta		S_SfCountTxt

DoDlog
			Call		D_GetNewModalDialog,in=(#S_SetFixDlog:l),out=(TheDlog:l)
			Call		X_DialogFromScrap

Loop
			Tool		_ModalDialog,in=(#D_DigitsOnly+$80000000:l),out=(Result:w)

			cmp		#Cancel
			beq		QuitDlog

			cmp		#OK
			bne		Loop

QuitDlog
			Tool		_GetIText,in=(TheDlog:l,#5:w,!Text:l)

			Call		X_DialogToScrap
			Call		D_CloseDialog,in=(TheDlog:l)

			CmpWord	Result,#OK
			bne		Exit

			lda		Text
			and		#$00FF
			beq		setMasks				; a = 0 on branch

			lda		Text+1
			and		#$000F

setMasks
			sta		S_FormatOrMask2
			MoveWord	#-1-S_CellDecPlace,S_FormatAndMask2

			stz		S_FormatOrMask1
			MoveWord	#-1,S_FormatAndMask1

			Call		S_DoFormatChange

Exit
			RETURN
			ENDP


;---------------------------------------------------------------------------
; S_DoFormatChange
;
;

S_DoFormatChange	PROC		EXPORT
				;Using	S_CurrentData
				;Using	S_FormatData

			BEGIN	+b

			Call		S_SwapIn,in=(S_ActiveWindow:l)
			Call		S_SetUndoOff

			lda		S_CurEditFlag
			and		#S_EditingBit
			bne		Editting

			Tool		_SetPort,in=(S_CurWindow:l)

			MoveLong	S_CurTLSelect,S_FormatTLCell
			MoveLong	S_CurBRSelect,S_FormatBRCell

			in		S_CurTLSelect:l,S_CurBRSelect:l,#S_DoFormat:l
			XCall	S_QTraverse
			bcc		redraw

			Call		D_MemoryError

redraw
			Call		S_RedrawCellRange,in=(S_FormatTLCell:l,S_FormatBRCell:l)
			bra		Exit

Editting
			lda		S_CurFormat
			and		S_FormatAndMask1
			ora		S_FormatOrMask1
			sta		S_CurFormat

			lda		S_CurFormat+2
			and		S_FormatAndMask2
			ora		S_FormatOrMask2
			sta		S_CurFormat+2

Exit
			Call		S_DoChecks
			stz		S_FormatPadFlag

			RETURN
			ENDP


;---------------------------------------------------------------------------
;
; S_DoFormat -- traversal routine for above (dollar, percent, etc)
;

S_DoFormat	PROC		EXPORT
			;Using	S_AttrData
			;Using	S_CurrentData
			;Using	S_FormatData

			input	Cell:l,CellIndex:l
			local	CellPtr:l,Format:w,LCol:w,RCol:w
			error	ErrFlag
			BEGIN

			stz		ErrFlag

			H_GetBlockPtr	CellIndex,CellPtr

			MoveWord	[CellPtr]:#S_CellFormat,Format
			jmi		Exit

			and		S_FormatAndMask1
			ora		S_FormatOrMask1
			MoveWord	a,[CellPtr]:y

			iny
			iny
			lda		[CellPtr],y
			and		S_FormatAndMask2
			ora		S_FormatOrMask2
			sta		[CellPtr],y

			lda		S_FormatPadFlag
			jeq		Exit

	;	Check if the cell is text	;

			lda		Format
			and		#S_CellType
;			cmp		#S_CellTypeText			 ; = 0
			jne		Exit

			CmpWord	S_FormatPadFlag,#S_BoldItem
			jeq		adjustBold

			MoveWord	Cell+2,LCol
			sta		RCol

	;	Check the left side	;

lfLoop
			dec		LCol
			beq		lfDone

			in		LCol:w,Cell:w
			out		CellPtr:l
			XCall	S_GetCellPtr

			ora		CellPtr
			beq		lfDone

			MoveWord	[CellPtr]:#S_CellFormat,a
			and		#S_CellType
			cmp		#S_CellTypeLeftPad
			beq		lfLoop

lfDone
			inc		LCol

	;	Check the right side	;

rtLoop
			inc		RCol
			cmp		#703
			beq		rtDone

			in		RCol:w,Cell:w
			out		CellPtr:l
			XCall	S_GetCellPtr

			ora		CellPtr
			beq		rtDone

			MoveWord	[CellPtr]:#S_CellFormat,a
			and		#S_CellType
			cmp		#S_CellTypeRightPad
			beq		rtLoop

rtDone
			dec		RCol
			bra		fixLeftRight

adjustBold
			in		Cell:l
			out		LCol:w,a:w,RCol:w,a:w
			XCall	S_RemovePadCells,err=ErrFlag
			bcs		fixLeftRight

			in		Cell:l
			out		ax:l
			XCall	S_InsertLeftPadCells,err=ErrFlag
			bcs		fixLeftRight

			cpx		LCol
			bge		doRightInsert

			stx		LCol

doRightInsert
			in		Cell:l
			out		ax:l
			XCall	S_InsertRightPadCells,err=ErrFlag
			bcs		fixLeftRight

			cpx		RCol
			blt		fixLeftRight

			stx		RCol

fixLeftRight
			CmpWord	RCol,S_FormatBRCell+2
			blt		chkLeft

			sta		S_FormatBRCell+2

chkLeft
			CmpWord	LCol,S_FormatTLCell+2
			bge		Exit

			sta		S_FormatTLCell+2

Exit
			RETURN
			ENDP


;---------------------------------------------------------------------------
;
; S_DoChecks	-- general menu checkmarking routine (not just format menu)
;

S_DoChecks	PROC		EXPORT
			;Using	S_CurrentData
			;Using	S_WindowData
			;Using	S_AttrData
			;Using	S_FormatData

			local	TopLeft:l,BottomRight:l,DecPlaces:w
			BEGIN	+b

			lda		S_CurEditFlag
			and		#S_EditingBit
			beq		DoRange

			MoveWord	S_CurFormat,S_FormatOrMask1
			sta		S_FormatAndMask1

			MoveWord	S_CurFormat+2,S_FormatOrMask2
			sta		S_FormatAndMask2

			bra		GotMask

DoRange
			Call		D_EnableMItems,in=(#S_GotoMI:w,#6:w)
			Call		D_EnableMItems,in=(#S_DeleteMI:w,#3:w)
			Call		D_EnableMItems,in=(#S_InsertMI:w,#3:w)
			Call		D_EnableMItems,in=(#S_MoveMI:w,#3:w)

			MoveLong	S_CurTLSelect,TopLeft
			MoveLong	S_CurBRSelect,BottomRight

			MoveWord	#-1,S_FormatAndMask1
			MoveWord	#-1,S_FormatAndMask2
			stz		S_FormatOrMask1
			stz		S_FormatOrMask2
			stz		S_CheckCount

			in		TopLeft:l,BottomRight:l,#S_CheckTraverse:l
			XCall	S_QTraverse

			lda		S_CheckCount
			bne		GotMask

			MoveWord	S_CurDefFormat,S_FormatOrMask1
			sta		S_FormatAndMask1

			MoveWord	S_CurDefFormat+2,S_FormatOrMask2
			sta		S_FormatAndMask2
GotMask

			lda		S_FormatAndMask1
			and		#S_CellBold
			bne		DoBold

			Tool		_SetMItemMark,in=(#0:w,#S_BoldItem:w)
			bra		DidBold

DoBold		Tool		_SetMItemMark,in=(#18:w,#S_BoldItem:w)
DidBold

			lda		S_FormatAndMask1
			and		#S_CellULine
			bne		DoULine

			Tool		_SetMItemMark,in=(#0:w,#S_UnderlineItem:w)
			bra		DidULine

DoULine		Tool		_SetMItemMark,in=(#18:w,#S_UnderlineItem:w)
DidULine

			lda		S_FormatOrMask1
			and		#S_CellCenterJustify+S_CellRightJustify
			beq		DoAlignLeft

			Tool		_SetMItemMark,in=(#0:w,#S_AlignLeftItem:w)
			bra		DidAlignLeft

DoAlignLeft	Tool		_SetMItemMark,in=(#18:w,#S_AlignLeftItem:w)
DidAlignLeft

			lda		S_FormatAndMask1
			and		#S_CellCenterJustify
			bne		DoAlignCtr

			Tool		_SetMItemMark,in=(#0:w,#S_AlignCtrItem:w)
			bra		DidAlignCtr

DoAlignCtr	Tool		_SetMItemMark,in=(#18:w,#S_AlignCtrItem:w)
DidAlignCtr

			lda		S_FormatAndMask1
			and		#S_CellRightJustify
			bne		DoAlignRight

			Tool		_SetMItemMark,in=(#0:w,#S_AlignRightItem:w)
			bra		DidAlignRight

DoAlignRight	Tool		_SetMItemMark,in=(#18:w,#S_AlignRightItem:w)
DidAlignRight

			lda		S_FormatAndMask1
			and		#S_CellRedNeg
			bne		DoRed

			Tool		_SetMItemMark,in=(#0:w,#S_RedNegItem:w)
			bra		DidRed

DoRed		Tool		_SetMItemMark,in=(#18:w,#S_RedNegItem:w)
DidRed

			lda		S_FormatAndMask1
			and		#S_CellParenNeg
			bne		DoParen

			Tool		_SetMItemMark,in=(#0:w,#S_ParenItem:w)
			bra		DidParen

DoParen		Tool		_SetMItemMark,in=(#18:w,#S_ParenItem:w)
DidParen

			lda		S_FormatAndMask1
			and		#S_CellComma
			bne		DoComma

			Tool		_SetMItemMark,in=(#0:w,#S_CommaItem:w)
			bra		DidComma

DoComma		Tool		_SetMItemMark,in=(#18:w,#S_CommaItem:w)
DidComma

			lda		S_FormatAndMask1
			and		#S_CellFixed
			bne		DoFixed

			Tool		_SetMItemMark,in=(#0:w,#S_FixedItem:w)
			bra		DidFixed

DoFixed		Tool		_SetMItemMark,in=(#18:w,#S_FixedItem:w)
DidFixed

			lda		S_FormatAndMask1
			and		#S_CellDollar
			bne		DoDollar

			Tool		_SetMItemMark,in=(#0:w,#S_DollarItem:w)
			bra		DidDollar

DoDollar		Tool		_SetMItemMark,in=(#18:w,#S_DollarItem:w)
DidDollar

			lda		S_FormatAndMask1
			and		#S_CellPercent
			bne		DoPercent

			Tool		_SetMItemMark,in=(#0:w,#S_PercentItem:w)
			bra		DidPercent

DoPercent		Tool		_SetMItemMark,in=(#18:w,#S_PercentItem:w)
DidPercent

			lda		S_FormatAndMask1
			and		#S_CellSciNote
			bne		DoSciNote

			Tool		_SetMItemMark,in=(#0:w,#S_SciNoteItem:w)
			bra		DidSciNote

DoSciNote		Tool		_SetMItemMark,in=(#18:w,#S_SciNoteItem:w)
DidSciNote

			lda		S_FormatOrMask1
			and		#S_CellPercent+S_CellDollar+S_CellSciNote+S_CellFixed
			bne		NotGeneral

			Tool		_SetMItemMark,in=(#18:w,#S_GeneralItem:w)
			bra		DidGeneral

NotGeneral	Tool		_SetMItemMark,in=(#0:w,#S_GeneralItem:w)
DidGeneral

			lda		S_FormatAndMask2
			and		#S_CellProtect
			bne		DoProtect

			Tool		_SetMItemMark,in=(#0:w,#S_ProtectItem:w)
			bra		DidProtect

DoProtect		Tool		_SetMItemMark,in=(#18:w,#S_ProtectItem:w)
DidProtect

			CmpLong	S_CurTLSelect,S_CurBRSelect
			bne		setRangeMItems

			Call		D_EnableMItems,in=(#S_ListFormulasMI:w,#5:w)

			Call		D_DisableMItems,in=(#S_SortMI:w,#6:w)
			Call		D_DisableMItems,in=(#S_FillMI:w,#3:w)
			Call		D_DisableMItems,in=(#S_TransposeMI:w,#3:w)
			bra		didMItems

setRangeMItems

			Call		D_DisableMItems,in=(#S_ListFormulasMI:w,#5:w)

			Call		D_EnableMItems,in=(#S_SortMI:w,#6:w)
			Call		D_EnableMItems,in=(#S_FillMI:w,#3:w)
			Call		D_EnableMItems,in=(#S_TransposeMI:w,#3:w)
didMItems

			lda		S_FormatOrMask2
			and		#S_CellDecPlace
			sta		DecPlaces

			lda		S_FormatAndMask2
			and		#S_CellDecPlace
			cmp		DecPlaces
			beq		allSameDecPlaces

			lda		#-1				; default dec places

allSameDecPlaces
			sta		S_SfCountNum






			lda		S_CurChartCount
			bne		DoEnable
			Call		D_DisableMItems,in=(#S_ModChartMI:w,#6:w)
			bra		DidAble

DoEnable
			Call		D_EnableMItems,in=(#S_ModChartMI:w,#6:w)
DidAble

			return

			EXPORT	S_CheckCount
S_CheckCount
			DS.B		2

			ENDP


;---------------------------------------------------------------------------
;
; S_CheckTraverse	-- traversal routine for DoChecks
;

S_CheckTraverse	PROC		EXPORT
				;Using	S_CurrentData
				;Using	S_FormatData

			input	Cell:l,CellIndex:l
			local	CellPtr:l
			error	ErrFlag
			BEGIN

			stz		ErrFlag

			H_GetBlockPtr	CellIndex,CellPtr

			MoveWord	[CellPtr]:#S_CellFormat,a
			bmi		Exit

			ora		S_FormatOrMask1
			sta		S_FormatOrMask1

			MoveWord	[Cellptr]:y,a
			and		S_FormatAndMask1
			sta		S_FormatAndMask1

			MoveWord	[CellPtr]:#S_CellFormat+2,a
			ora		S_FormatOrMask2
			sta		S_FormatOrMask2

			MoveWord	[CellPtr]:y,a
			and		S_FormatAndMask2
			sta		S_FormatAndMask2

			MoveWord	#1,S_CheckCount

Exit
			RETURN
			ENDP
			END

