load 'macros.dump' include 'driver.equ' include 'pl.equ' ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT D_CheckMenuFID IMPORT D_IsLetter IMPORT D_ToLowerTable IMPORT D_ToUpperTable IMPORT P_BuildUndo IMPORT P_SetFormat IMPORT T_BumpParags IMPORT T_CalcFBytes IMPORT T_CurColor IMPORT T_CurFont IMPORT T_CurSize IMPORT T_CurStyle IMPORT T_DoRoom IMPORT T_DotLine IMPORT T_DotObj IMPORT T_DotOffset IMPORT T_DotParag IMPORT T_FontFlags IMPORT T_GetParPtr IMPORT T_GetParSize IMPORT T_GetRulBits IMPORT T_GetTextPtr IMPORT T_JunkLeft IMPORT T_JunkRight IMPORT T_MarkLine IMPORT T_MarkObj IMPORT T_MarkOffset IMPORT T_MarkParag IMPORT T_NewAddStyle IMPORT T_NewColor IMPORT T_NewFont IMPORT T_NewSize IMPORT T_NewSubStyle IMPORT T_NextChar IMPORT T_Offset2Line IMPORT T_PrevChar IMPORT T_RecutParag IMPORT T_Refresh IMPORT T_TextSelect IMPORT T_TrackFont IMPORT T_WriteFBytes ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY T_ChangeCase ENTRY T_IsSpace ;------------------------------------------------------------------------------ ; ; T_UpdatePars (SPar:w,EPar:w) ; T_UpdatePars PROC EXPORT ;Using T_Data ;Using T_TextEqu input SPar:w,EPar:w local ParagPtr:l,ObjHdl:l,VertPos:w begin rcall T_GetParPtr,in=(SPar:a),out=(ParagPtr:ax) movelong [ParagPtr]:#T_ObjHdl,ObjHdl moveword [ParagPtr]:#T_ParStart,VertPos ParLoop in ObjHdl:l,SPar:w,VertPos:w out ObjHdl:l,VertPos:w xcall T_RecutParag rcall T_GetParPtr,in=(SPar:a),out=(ParagPtr:ax) tool _DisposeHandle,in=([ParagPtr]:#T_LinesHdl:l) movelong #0,[ParagPtr]:#T_LinesHdl inc SPar cmpw EPar,SPar bge ParLoop Bump call T_BumpParags,in=(SPar:w,ObjHdl:l,VertPos:w,#0:w) lda T_TextSelect beq No in T_DotParag:w,T_DotOffset:w out T_DotObj:l,T_DotLine:w xcall T_Offset2Line in T_MarkParag:w,T_MarkOffset:w out T_MarkObj:l,T_MarkLine:w xcall T_Offset2Line No call T_Refresh return ENDP ;------------------------------------------------------------------------------- ; ; T_DoChange (ChangeByte:w,Data:w,Data2:w) ; T_DoChange PROC EXPORT ;Using T_Data ;Using T_TextEqu input ChangeByte:w,Data:w,Data2:w local CurPar:w,TextPtr:l begin moveword T_DotParag,CurPar ldy T_DotOffset cpy #T_ParHeader+1 blt ParLoop rcall T_GetTextPtr,in=(CurPar:a),out=(TextPtr:ax) ldy T_DotOffset jsr FlipStuff inc CurPar ParLoop lda CurPar cmp T_MarkParag bgt EndLoop rcall T_GetTextPtr,in=(a:a),out=(TextPtr:ax) ldy #T_ParHeader jsr FlipStuff lda ChangeByte dec a asl a tax lda Table,x tay jsr (JumpTable,x) inc CurPar bra ParLoop EndLoop return FlipStuff CharLoop cmpw CurPar,T_MarkParag blt Skip cpy T_MarkOffset bge EndLoop2 Skip lda [TextPtr],y iny and #$ff cmp #CR beq EndLoop2 cmp ChangeByte beq FlipIt cmp #T_ColorChange+1 bge CharLoop iny cmp #T_FontChange bne CharLoop iny bra CharLoop EndLoop2 rts FlipIt lda ChangeByte dec a asl a tax jsr (JumpTable,x) iny bra CharLoop DoFont moveword Data,[TextPtr]:y iny rts DoStyle shortm lda Data ora Data2 beq SetStyle lda Data2 eor #$ff and [TextPtr],y ora Data SetStyle sta [TextPtr],y longm rts DoSize DoColor shortm moveword Data,[TextPtr]:y longm rts JumpTable DC.W DoFont DC.W DoStyle DC.W DoSize DC.W DoColor Table DC.W 0 DC.W 2 DC.W 3 DC.W 4 ENDP ;----------------------------------------------------------------------------- ; ; T_InsertFont (ParagNo:w,Offset:w,Mode:w) : Room:w ; ; If Mode is true, the style is set to T_NewAddStyle. Otherwise T_NewAddStyle ; is added and T_NewSubStyle is subtracted. T_InsertFont PROC EXPORT ;Using T_Data ;Using T_TextEqu input ParagNo:w,Offset:w,Mode:w OUTPUT Room:w local LeftOffset:w,RightOffset:w,SFlag:w,EFlag:w local LeftFont:l,RightFont:l,LeftColor:w,RightColor:w local TextPtr:l begin stz SFlag stz EFlag stz Room rcall T_JunkLeft,in=(ParagNo:a,Offset:x),out=(LeftOffset:a) cmp #T_ParHeader bne DoRight inc SFlag DoRight rcall T_JunkRight,in=(ParagNo:a,Offset:x),out=(RightOffset:a) rcall T_GetParSize,in=(ParagNo:a),out=(a:a) dec a cmp RightOffset bne DoTrack inc EFlag DoTrack rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax) call T_TrackFont,in=(TextPtr:l,LeftOffset:w) movelong T_CurFont,LeftFont moveword T_CurColor,LeftColor call T_TrackFont,in=(TextPtr:l,RightOffset:w) movelong T_CurFont,RightFont moveword T_CurColor,RightColor ; Check Font lda T_FontFlags and #T_FontFl beq DidFont moveword T_NewFont,RightFont ldy SFlag beq DidFont moveword a,[TextPtr]:#T_ParFont DidFont ; Check Style lda T_FontFlags and #T_StyleFl beq DidStyle shortm lda Mode beq Normal lda T_NewAddStyle bra StoreStyle Normal lda T_NewAddStyle ora T_NewSubStyle beq StoreStyle lda RightFont+2 ora T_NewAddStyle sta RightFont+2 lda T_NewSubStyle eor #$ff and RightFont+2 StoreStyle sta RightFont+2 ldy SFlag beq Long1 moveword a,[TextPtr]:#T_ParStyle Long1 longm DidStyle ; Check Size lda T_FontFlags and #T_SizeFl beq DidSize shortm moveword T_NewSize,RightFont+3 ldy SFlag beq Long2 moveword a,[TextPtr]:#T_ParSize Long2 longm DidSize ; Do color lda T_FontFlags and #T_ColorFl beq DidColor shortm moveword T_NewColor,RightColor ldy SFlag beq Long3 moveword a,[TextPtr]:#T_ParColor Long3 longm DidColor lda SFlag bne Exit lda EFlag bne Exit in LeftFont:l,LeftColor:w,RightFont:l,RightColor:w out a:w xcall T_CalcFBytes addword a,LeftOffset,a subword a,RightOffset,Room ;Room = Bytes-(RightOffset-LeftOffset) call T_DoRoom,in=(ParagNo:w,LeftOffset:w,Room:w) rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax) addwl LeftOffset,TextPtr in TextPtr:l,LeftFont:l,LeftColor:w,RightFont:l,RightColor:w xcall T_WriteFBytes Exit return ENDP ;------------------------------------------------------------------------------- ; ; T_ChangeFont () ; T_ChangeFont PROC EXPORT ;Using T_Data ;Using T_TextEqu local TextPtr:l,Offset:w,Room:w local EndFont:l,EndStyle:w,EndSize:w,EndColor:w begin call P_BuildUndo,in=(#0:w) rcall T_GetTextPtr,in=(T_MarkParag:a),out=(TextPtr:ax) rcall T_JunkRight,in=(T_MarkParag:a,T_MarkOffset:x),out=(Offset:a) call T_TrackFont,in=(TextPtr:l,Offset:w) moveword T_CurFont,EndFont shortm moveword T_CurStyle,EndStyle moveword T_CurSize,EndSize longm moveword T_CurColor,EndColor in T_DotParag:w,T_DotOffset:w,#0:w out Room:w xcall T_InsertFont addword a,T_DotOffset,T_DotOffset cmpw T_DotParag,T_MarkParag bne NotSame addword Room,T_MarkOffset,T_MarkOffset NotSame lda T_FontFlags and #T_FontFl beq TryStyle call T_DoChange,in=(#T_FontChange:w,T_NewFont:w,#0:w) TryStyle lda T_FontFlags and #T_StyleFl beq TrySize in #T_StyleChange:w,T_NewAddStyle:w,T_NewSubStyle:w xcall T_DoChange TrySize lda T_FontFlags and #T_SizeFl beq TryColor call T_DoChange,in=(#T_SizeChange:w,T_NewSize:w,#0:w) TryColor lda T_FontFlags and #T_ColorFl beq DidChanges call T_DoChange,in=(#T_ColorChange:w,T_NewColor:w,#0:w) DidChanges moveword EndFont,T_NewFont shortm moveword EndStyle,T_NewAddStyle moveword EndSize,T_NewSize moveword EndColor,T_NewColor longm call T_InsertFont,in=(T_MarkParag:w,T_MarkOffset:w,#1:w),out=(a:w) stz T_FontFlags call T_UpdatePars,in=(T_DotParag:w,T_MarkParag:w) return ENDP ;------------------------------------------------------------------------------- ; ; T_RangeFont () ; T_RangeFont PROC EXPORT ;Using T_Data ;Using T_TextEqu local TextPtr:l,ParagNo:w,Offset:w,OrStyles:w,AndStyles:w local Just:w,Spacing:w,RulBits:w,StyleMask:w begin moveword T_DotParag,ParagNo rcall T_GetRulBits,in=(a:a),out=(RulBits:a) and #T_AllJust sta Just lda RulBits and #T_AllSpacing sta Spacing rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax) lda T_TextSelect jne DoSelect call T_TrackFont,in=(TextPtr:l,T_DotOffset:w) ; Check for any D_New font changes lda T_FontFlags jeq CheckIt and #T_FontFl beq NoFont moveword T_NewFont,T_CurFont NoFont lda T_FontFlags and #T_StyleFl beq NoStyle movebyte T_NewAddStyle,T_CurStyle NoStyle lda T_FontFlags and #T_SizeFl beq NoSize movebyte T_NewSize,T_CurSize NoSize lda T_FontFlags and #T_ColorFl beq NoColor moveword T_NewColor,T_CurColor NoColor brl CheckIt DoSelect rcall T_JunkRight,in=(ParagNo:a,T_DotOffset:x),out=(Offset:a) call T_TrackFont,in=(TextPtr:l,Offset:w) shortm moveword T_CurStyle,OrStyles moveword a,AndStyles longm NextChar cmpw ParagNo,T_MarkParag blt Okay cmpw Offset,T_MarkOffset jge Done Okay moveword [TextPtr]:Offset,a inc Offset and #$ff cmp #CR beq NextParag cmp #T_ColorChange+1 bge NextChar asl a tax jmp (JumpTable,x) DoFont cmpw [TextPtr]:Offset,T_CurFont beq SameFont moveword #$FFFF,T_CurFont SameFont inc Offset inc Offset brl NextChar DoStyle shortm ldy Offset moveword [TextPtr]:y,T_CurStyle ora OrStyles sta OrStyles moveword [TextPtr]:y,a and AndStyles sta AndStyles longm inc Offset brl NextChar DoSize shortm cmpw [TextPtr]:Offset,T_CurSize beq SameSize moveword #$FF,T_CurSize SameSize longm inc Offset brl NextChar DoColor shortm cmpw [TextPtr]:Offset,T_CurColor beq SameColor moveword #$FF,T_CurColor SameColor longm inc Offset brl NextChar NextParag inc ParagNo cmpw ParagNo,T_MarkParag blt Okay2 cmpw T_MarkOffset,#T_ParHeader jeq Done Okay2 rcall T_GetRulBits,in=(ParagNo:a),out=(RulBits:a) and #T_AllJust cmp Just beq JustSame stz Just JustSame lda RulBits and #T_AllSpacing cmp Spacing beq SpaceSame stz Spacing SpaceSame rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax) cmpw [TextPtr],T_CurFont beq SameFont2 moveword #$FFFF,T_CurFont SameFont2 shortm ldy #T_ParStyle moveword [TextPtr]:y,T_CurStyle ora OrStyles sta OrStyles moveword [TextPtr]:y,a and AndStyles sta AndStyles cmpw [TextPtr]:#T_ParSize,T_CurSize beq SameSize2 moveword #$FF,T_CurSize SameSize2 cmpw [TextPtr]:#T_ParColor,T_CurColor beq SameColor2 moveword #$FF,T_CurColor SameColor2 longm moveword #T_ParHeader,Offset brl NextChar Done shortm lda OrStyles beq StyleSet moveword #$ff,T_CurStyle lda AndStyles beq StyleSet sta T_CurStyle StyleSet longm CheckIt call D_CheckMenuFID,in=(T_CurFont:l,T_CurColor:w) call P_SetFormat,in=(Just:w,Spacing:w) return JumpTable DC.W NextChar DC.W DoFont DC.W DoStyle DC.W DoSize DC.W DoColor ENDP ;------------------------------------------------------------------------------ ; ; T_Upper () ; T_Lower () ; T_Capit () ; T_Lower PROC EXPORT ;Using T_Data ;Using T_TextEqu EXPORT T_Upper EXPORT T_Capit EXPORT T_ChangeCase LOWER equ 0 UPPER equ 1 CAPIT equ 2 moveword #LOWER,>What bra T_ChangeCase T_Upper ; moveword #UPPER,>What bra T_ChangeCase T_Capit ; moveword #CAPIT,>What T_ChangeCase ; local TextPtr:l,CurOffset:w,CurParag:w,First:w,Char:w begin +b call P_BuildUndo,in=(#0:w) moveword T_DotOffset,CurOffset moveword T_DotParag,CurParag rcall T_GetTextPtr,in=(a:a),out=(TextPtr:ax) cmpw What,#Capit bne StartLoop stz First rcall T_PrevChar,in=(T_DotParag:a,T_DotOffset:x) tay beq ItsFirst lda [TextPtr],y and #$ff jsl T_IsSpace bcc StartLoop ItsFirst inc First bra StartLoop ; Loop through the selected characters Loop cmpw Char,#CR bne SamePar inc CurParag rcall T_GetTextPtr,in=(CurParag:a),out=(TextPtr:ax) moveword #T_ParHeader,CurOffset bra StartLoop SamePar ; BOGUS -- NextChar rcall T_NextChar,in=(CurParag:a,CurOffset:x),out=(CurOffset:a) StartLoop moveword [TextPtr]:CurOffset,a and #$ff sta Char cmpw CurParag,T_MarkParag blt CheckChar cmpw CurOffset,T_MarkOffset bge Update CheckChar rcall T_IsSpace,in=(Char:a) bcs IsSpace tax ldy What cpy #UPPER beq Up cpy #LOWER beq Down ldy First bne Up Down lda >D_ToLowerTable,x bra Cased Up lda >D_ToUpperTable,x Cased movebyte a,[TextPtr]:CurOffset stz First brl Loop IsSpace moveword #1,First brl Loop Update call T_UpdatePars,in=(T_DotParag:w,T_MarkParag:w) return What DS.B 2 ENDP ;------------------------------------------------------------------------------- ; ; T_IsSpace (Char:a) ; T_IsSpace PROC EXPORT cmp #32 beq GSpace cmp #TAB beq GSpace cmp #CR beq GSpace clc GSpace rtl ENDP END