load 'macros.dump' include 'driver.equ' include 'pl.equ' ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT D_BeachBall IMPORT X_CopyOneHandle IMPORT D_Deref IMPORT D_FastMult IMPORT D_GrowHandle IMPORT D_NeedHand IMPORT P_CheckHand IMPORT P_FixMenus IMPORT T_ClearRulers IMPORT T_CopyParEnd IMPORT T_CurColor IMPORT T_CurFont IMPORT T_CurParHdl IMPORT T_CurStyle IMPORT T_DeletePars IMPORT T_DotLine IMPORT T_DotOffset IMPORT T_DotParag IMPORT T_FixParag IMPORT T_GetObjBound IMPORT T_GetParPtr IMPORT T_GetParSize IMPORT T_GetTextPtr IMPORT T_InvSelect IMPORT T_JunkLeft IMPORT T_JunkRight IMPORT T_LessRoom IMPORT T_MarkOffset IMPORT T_MarkParag IMPORT T_MulParag IMPORT T_NewParHdl IMPORT T_NewPars IMPORT T_PastePar IMPORT T_SetRulers IMPORT T_TextSelect IMPORT T_TrackFont IMPORT T_UnuseRuler IMPORT T_UpdatePars IMPORT P_RedoFlag IMPORT T_InsertFont ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY T_ClearPrim ENTRY T_CopyPrim ENTRY T_CopyText ENTRY T_MakeParStyle ;------------------------------------------------------------------------------ ; ; T_Clear () ; T_Clear PROC EXPORT ;Using T_Data ;Using T_TextEqu LOCAL CharCount:w,Temp:w,Ptr:l,StyleCount:w,DotPtr:l BEGIN jsl T_InvSelect pushword T_DotOffSet lda T_TextSelect jeq Exit jsl T_MakeParStyle cmpw T_DotOffset,#T_ParHeader beq NoJunk rcall T_JunkLeft,in=(T_MarkParag:a,T_MarkOffset:x) sta T_MarkOffset NoJunk rcall T_JunkRight,in=(T_DotParag:a,T_DotOffset:x) sta T_DotOffset in T_DotParag:w,T_DotOffset:w,T_MarkParag:w,T_MarkOffset:w out CharCount:w xcall T_ClearPrim bcs Exit stz T_TextSelect call T_FixParag,in=(T_DotParag:w,T_DotLine:w,CharCount:w) jsl P_FixMenus Exit pullword T_DotOffSet RETURN ENDP ******************************************************************** * * * T_MakeParStyle * This routine takes any style changes at the end of a selection (T_MarkOffSet) * and puts them in the parheader. * * Wednesday, September 6, 1989 4:44:21 PM (SFS) ******************************************************************** T_MakeParStyle PROC EXPORT LOCAL Temp:w,Ptr:l,StyleCount:w,DotPtr:l BEGIN cmpw T_DotOffset,#T_ParHeader bne Exit moveword T_MarkOffSet,Temp rcall T_JunkRight,in=(T_MarkParag:a,T_MarkOffset:x) sta T_MarkOffSet cmp Temp beq Exit subword T_MarkOffSet,Temp,StyleCount rcall T_GetTextPtr,in=(T_MarkParag:a),out=(Ptr:ax) rcall T_GetTextPtr,in=(T_DotParag:a),out=(DotPtr:ax) FontLoop ldy Temp lda [ptr],y jsr MakeMasterFont lda StyleCount bne FontLoop Exit Return MakeMasterFont and #$ff Shortm asl a tax iny lda [Ptr],y ;get the change value jmp (JumpTable,x) DoFont ldy #T_ParFont sta [DotPtr],y iny inc temp phy ldy temp iny lda [Ptr],y ply dec StyleCount bra AllDone DoStyle ldy #T_ParStyle bra AllDone DoSize ldy #T_ParSize bra AllDone DoColor ldy #T_ParColor AllDone sta [DotPtr],y inc temp inc temp dec StyleCount dec StyleCount Next longm rts JumpTable ds.b 2 ;nothing dc.w DoFont dc.w DoStyle dc.w DoSize dc.w Docolor EndP ;------------------------------------------------------------------------------ ; ; T_Paste (PasteHdl:l,MoveDot:w) ; T_Paste PROC EXPORT ;Using T_Data ;Using T_TextEqu INPUT PasteHdl:l,MoveDot:w LOCAL Ptr:l,NewTextHdl:l,RulerHdl:l,FirstRuler:l,NewPCount:w LOCAL Hdl:l,Dest:l,CharCount:w,BytesLess:w,CopySize:w LOCAL ParagPtr:l,TextBlock:l,TPtr:l,Offset:w LOCAL SPar:w,NewParag:w,NewOffset:w LOCAL ParagPtr1:l,ParagPtr2:l,ParOffset1:w,ParOffset2:w,ParagNo:w LOCAL TextHdl1:l,TextHdl2:l,TextPtr1:l,TextPtr2:l,OldTextHdl:l LOCAL TextSize1:w,TextSize2:w,ParDiff:w LOCAL TempHdl:l,TempPtr:l,OldDot:w ERROR Err BEGIN stz Err jsl T_Clear * This prevents style changes from leaking over into other text. (SFS 8/30/89) DoJunk moveword T_DotOffSet,OldDot rcall T_JunkRight,in=(T_DotParag:a,T_DotOffset:x) sta T_DotOffset NoJunk moveword T_DotParag,SPar movelong [PasteHdl],Ptr movelong [Ptr]:#T_TextBlock,NewTextHdl movelong [Ptr]:#T_RulerHdl,FirstRuler cmpw T_DotOffset,#T_ParHeader bne NotStart rcall T_GetParPtr,in=(SPar:a),out=(ParagPtr:ax) movelong [ParagPtr]:#T_RulerHdl,RulerHdl movelong FirstRuler,[ParagPtr]:#T_RulerHdl rcall T_UnuseRuler,in=(RulerHdl:ax) bra DoIt NotStart rcall T_UnuseRuler,in=(FirstRuler:ax) DoIt movelong [PasteHdl],Ptr subword [Ptr],#1,NewPCount bne MakeNew in SPar:w,T_DotOffset:w,NewTextHdl:l out CharCount:w xcall T_PastePar addword a,T_DotOffset,T_MarkOffset lda MoveDot beq NoMove moveword T_MarkOffset,T_DotOffset NoMove call T_FixParag,in=(SPar:w,T_DotLine:w,CharCount:w) brl Exit MakeNew lda SPar inc a sta NewParag movelong T_CurParHdl,TempHdl movelong [TempHdl],TempPtr moveword [TempPtr],a dec a cmp NewParag bge ValidPar dec NewParag ValidPar ; Make sure that the text from the paragraph with the insertion point ; is in a different text block than the text from the next paragraph. rcall T_GetParPtr,in=(SPar:a),out=(ParagPtr1:ax) rcall T_GetParPtr,in=(NewParag:a),out=(ParagPtr2:ax) movelong [ParagPtr1]:#T_TextBlock,TextHdl1 movelong [ParagPtr2]:#T_TextBlock,TextHdl2 moveword [ParagPtr1]:#T_ParOffset,ParOffset1 moveword [ParagPtr2]:#T_ParOffset,ParOffset2 cmpl TextHdl1,TextHdl2 jne Okay ; Allocate the new text block movelong [TextHdl1],TextPtr1 moveword [TextPtr1]:#T_TextSize,TextSize1 subword a,ParOffset2,TextSize2 subword TextSize1,TextSize2,TextSize1 addword TextSize2,#T_BlockHdrSize,TextSize2 call D_NeedHand,in=(#0:w,TextSize2:w),out=(TextHdl2:l) ; Fill in the new text block movelong [TextHdl2],TextPtr2 moveword TextSize2,[TextPtr2] moveword a,[TextPtr2]:#T_TextSize movelong [TextHdl1],TextPtr1 addwl ParOffset2,TextPtr1 addwl #T_BlockHdrSize,TextPtr2 subword TextSize2,#4,TextSize2 tool _BlockMove,in=(TextPtr1:l,TextPtr2:l,#0:w,TextSize2:w) ; Adjust the paragraphs starting at NewParag subword ParOffset2,#T_BlockHdrSize,ParDiff moveword NewParag,ParagNo Loop rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr2:ax) movelong [ParagPtr2]:#T_TextBlock,OldTextHdl cmpl TextHdl1,OldTextHdl bne EndLoop movelong TextHdl2,[ParagPtr2]:#T_TextBlock subword [ParagPtr2]:#T_ParOffset,ParDiff,[ParagPtr2]:#T_ParOffset inc ParagNo bra Loop EndLoop ; Shrink the old text block movelong [TextHdl1],TextPtr1 moveword TextSize1,[TextPtr1] moveword a,[TextPtr1]:#T_TextSize tool _SetHandleSize,in=(#0:w,TextSize1:w,TextHdl1:l) Okay ; Handle the first paragraph ; Copy the end of it, delete it, and paste in D_New stuff. call T_CopyParEnd,in=(SPar:w,T_DotOffset:w),out=(Hdl:l) rcall T_GetParSize,in=(SPar:a),out=(a:a) subword a,T_DotOffset,a dec a ;Keep CR sta BytesLess call T_LessRoom,in=(SPar:w,T_DotOffset:w,BytesLess:w) in SPar:w,T_DotOffset:w,NewTextHdl:l out a:w xcall T_PastePar ; Make room for D_New paragraphs and copy them in moveword SPar,NewParag inc NewParag call T_NewPars,in=(NewParag:w,NewPCount:w) movelong [PasteHdl],Ptr addlong Ptr,#T_ParInfoSize+2,s rcall T_GetParPtr,in=(NewParag:a),out=(Dest:ax) addlong Dest,#2,s rcall D_FastMult,in=(NewPCount:x,#T_ParInfoSize:y),out=(CopySize:a) pushword #0 pushword a _BlockMove ; Handle the paragraph part that got put into Hdl by appending it to the ; last paragraph addword SPar,NewPCount,NewParag rcall T_GetParPtr,in=(NewParag:a),out=(ParagPtr:ax) movelong [ParagPtr]:#T_TextBlock,TextBlock movelong [TextBlock],TPtr subword [TPtr]:#T_TextSize,#5,NewOffset ;No CR call T_PastePar,in=(NewParag:w,NewOffset:w,Hdl:l),out=(a:w) lda P_RedoFlag bne N1 moveword NewParag,T_MarkParag moveword NewOffset,T_MarkOffset N1 lda MoveDot beq NoMove1 moveword NewParag,T_DotParag moveword NewOffset,T_DotOffset bra NoMove2 NoMove1 moveword OldDot,T_DotOffSet NoMove2 call T_UpdatePars,in=(SPar:w,NewParag:w) Exit tool _DisposeHandle,in=(PasteHdl:l) stz P_RedoFlag RETURN ENDP ;------------------------------------------------------------------------------; ; ; T_Copy () : CopyHdl:l ; T_Copy PROC EXPORT ;Using P_ObjData ;Using T_Data OUTPUT CopyHdl:l LOCAL Start:w,End:w,Amount:w,Ptr:l ERROR Err BEGIN stzl CopyHdl lda T_TextSelect beq Exit pushword T_DotOffset * this garruantees that the correct style changes are always copied (SFS 8/30/89) rcall T_JunkRight,in=(T_DotParag:a,T_DotOffset:x) sta T_DotOffset in T_CurParHdl:l,T_DotParag:w,T_DotOffset:w in T_MarkParag:w,T_MarkOffset:w out CopyHdl:l xerr Err xcall T_CopyPrim pullword T_DotOffset Exit RETURN ENDP ;------------------------------------------------------------------------------ ; ; T_ClearPrim (SPar:w,SOffset:w,EPar:w,EOffset:w) : CharCount:w ; T_ClearPrim PROC EXPORT ;Using T_TextEqu ;Using T_Data INPUT SPar:w,SOffset:w,EPar:w,EOffset:w OUTPUT CharCount:w ERROR Err LOCAL ParCount:w,Hdl:l LOCAL Bytes:w,ParagPtr:l BEGIN stz Err subword EPar,SPar,ParCount bne Case2 ; No CRs are being deleted. Just use LessRoom subword EOffset,SOffset,Bytes call T_LessRoom,in=(SPar:w,SOffset:w,Bytes:w) brl Exit Case2 call T_CopyParEnd,in=(EPar:w,EOffset:w),out=(Hdl:l),err=(Err) bcs Exit addword SPar,#1,s pushword ParCount jsl T_DeletePars rcall T_GetParSize,in=(SPar:a),out=(a:a) dec a ; remove CR subword a,SOffset,Bytes call T_LessRoom,in=(SPar:w,SOffset:w,Bytes:w) call T_PastePar,in=(SPar:w,SOffset:w,Hdl:l),out=(CharCount:w) Exit RETURN ENDP ;--------------------------------------------------------------------------- ; ; T_CopyPrim (SrcHdl:l,SPar:w,SOffset:w,EPar:w,EOffset:w): ParagHdl:l ; T_CopyPrim PROC EXPORT ;Using T_TextEqu ;Using T_Data INPUT SrcHdl:l,SPar:w,SOffset:w,EPar:w,EOffset:w OUTPUT ParagHdl:l ERROR Err LOCAL ParagPtr:l,SrcPtr:l,TextBlock:l,RulerHdl:l,NewRuler:l LOCAL CurBlock:l,Ptr:l,CurPar:w,NPar:w,LPar:w LOCAL ByteCount:w,Size:w,PCount:w,StartOffset:w LOCAL DotBlock:l,MarkBlock:l,ParSize:w,ParOffset:w LOCAL Estimate:l BEGIN stzl ParagHdl moveword SPar,CurPar moveword #100,Estimate stz Estimate+2 EstLoop rcall T_GetParSize,in=(SPar:a),out=(a:a) addword a,#78,a addwl a,Estimate inc CurPar cmpw EPar,CurPar bge EstLoop call P_CheckHand,in=(Estimate:l),err=(Err) jcs Exit subword EPar,SPar,LPar inc a sta PCount jsl T_MulParag sta ByteCount addword a,#2,a call D_NeedHand,in=(#0:w,a:w),out=(ParagHdl:l) rcall D_Deref,in=(ParagHdl:ax),out=(ParagPtr:ax) moveword PCount,[ParagPtr] ;set ParagCount movelong [SrcHdl],SrcPtr lda SPar jsl T_MulParag addword a,#2,a addlong a,SrcPtr,s addlong #2,ParagPtr,s pushword #0 pushword ByteCount _BlockMove rcall T_GetTextPtr,in=(SPar:a),out=(ax:ax) call T_TrackFont,in=(ax:l,SOffset:w) ; Make room for paragraph header subword SOffset,#T_ParHeader,SOffset cmpw PCount,#1 bne NotOne in SPar:w,SOffset:w,EOffset:w,#0:l,#1:w out DotBlock:l,a:w xcall T_CopyText brl Cont NotOne rcall T_GetParSize,in=(SPar:a),out=(ParSize:a) in SPar:w,SOffset:w,ParSize:w,#0:l,#0:w out DotBlock:l,a:w xcall T_CopyText in EPar:w,#0:w,EOffset:w,#0:l,#1:w out MarkBlock:l,a:w xcall T_CopyText Cont movelong [DotBlock],Ptr moveword T_CurFont,[Ptr]:#4 moveword T_CurStyle,[Ptr]:#6 movebyte T_CurColor,[Ptr]:#8 movelong DotBlock,[ParagPtr]:#T_TextBlock moveword #4,[ParagPtr]:#T_ParOffset moveword SPar,CurPar stzl CurBlock ParLoop jsl D_BeachBall ; Copy the Q_Text if not the first or last par lda CurPar cmp SPar beq CopyRuler cmp EPar beq DoLast rcall T_GetParSize,in=(CurPar:a),out=(ParSize:a) in CurPar:w,#0:w,ParSize:w,CurBlock:l,#0:w out CurBlock:l,ParOffset:w xcall T_CopyText movelong CurBlock,[ParagPtr]:#T_TextBlock moveword ParOffset,[ParagPtr]:#T_ParOffset bra CopyRuler DoLast movelong MarkBlock,[ParagPtr]:#T_TextBlock moveword #4,[ParagPtr]:#T_ParOffset ; Copy the ruler if necessary CopyRuler movelong [ParagPtr]:#T_RulerHdl,RulerHdl lda RulerHdl+2 and #$8000 bne Copied call X_CopyOneHandle,in=(RulerHdl:l),out=(NewRuler:l) pushlong T_CurParHdl movelong ParagHdl,T_CurParHdl subword CurPar,SPar,NPar call T_SetRulers,in=(NewRuler:l,RulerHdl:l,NPar:w,LPar:w,#0:w) pulllong T_CurParHdl Copied movelong #0,[ParagPtr]:#T_LinesHdl addwl #T_ParInfoSize,ParagPtr inc CurPar cmpw CurPar,EPar jle ParLoop tool _HUnlock,in=(ParagHdl:l) ; Clean up marks pushlong T_CurParHdl movelong ParagHdl,T_CurParHdl call T_ClearRulers,in=(#0:w,LPar:w) pulllong T_CurParHdl Exit RETURN ENDP ;------------------------------------------------------------------------------ ; ; T_CopyText (ParagNo:w,Start:w,End:w,TextBlock:l,AddCR:w) : D_NewText:l ; ; Only works on the current Q_Text thread. ; Assumes the Q_Text fits in the block. T_CopyText PROC EXPORT INPUT ParagNo:w,Start:w,End:w INPUT TextBlock:l,AddCR:w OUTPUT D_NewText:l,ParOffset:w LOCAL TextPtr:l,BPtr:l,AddSize:w,OldSize:w,NewSize:w BEGIN subword End,Start,a ldy AddCR beq No inc a No sta AddSize cpzl TextBlock bne Made NewBlock call D_NeedHand,in=(#4:l),out=(TextBlock:l) jcs Exit moveword #4,OldSize bra AddIt Made movelong [TextBlock],BPtr moveword [BPtr],OldSize addword a,AddSize,a bcs NewBlock cmp #$C00 bge NewBlock AddIt addword AddSize,OldSize,NewSize call D_GrowHandle,in=(#0:w,a:w,TextBlock:l) bcs Exit rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax) lda Start addlong a,TextPtr,s ;Src movelong [TextBlock],BPtr lda OldSize addlong a,BPtr,s ;Dest pushword #0 pushword AddSize _BlockMove moveword NewSize,[BPtr] moveword a,[BPtr]:#2 lda AddCR beq No2 ldy NewSize dey movebyte #CR,[BPtr]:y No2 movelong TextBlock,D_NewText subword NewSize,AddSize,ParOffset Exit RETURN ENDP ;------------------------------------------------------------------------------- ; ; T_CpyOrClrObj (ObjPtr:l,D_DoCopy:w) : CopyHdl:l ; ; Makes a copy of the Q_Text for the object or clears it from the Q_Text thread, ; depending on whether D_DoCopy is set or not. T_CpyOrClrObj PROC EXPORT ;Using P_ObjData ;Using T_Data INPUT ObjPtr:l,D_DoCopy:w OUTPUT CopyHdl:l ERROR Err LOCAL SPar:w,SOffset:w,EPar:w,EOffset:w,IsEmpty:w BEGIN +B stz Err pushlong T_CurParHdl movelong [ObjPtr]:#P_ParagHdl,T_CurParHdl call T_GetObjBound,in=(ObjPtr:l,#1:w),out=(SPar:w,SOffset:w) call T_GetObjBound,in=(ObjPtr:l,#0:w),out=(EPar:w,EOffset:w) stz IsEmpty cmpw SPar,EPar bne NotEmpty cmpw SOffset,EOffset bne NotEmpty inc IsEmpty NotEmpty lda D_DoCopy bne @Copy lda IsEmpty bne Exit call T_ClearPrim,in=(SPar:w,SOffset:w,EPar:w,EOffset:w),out=(a:w) bra Exit @Copy lda IsEmpty bne MakeNew in T_CurParHdl:l,SPar:w,SOffset:w,EPar:w,EOffset:w out CopyHdl:l xerr Err xcall T_CopyPrim bra Exit MakeNew call T_NewParHdl,out=(CopyHdl:l) Exit pulllong T_CurParHdl RETURN ENDP END