antoine-source/appleworksgs/PL/Src/PDRAG.S

1 line
4.4 KiB
ArmAsm
Raw Normal View History

2023-03-04 02:45:20 +00:00
load 'macros.dump' include 'driver.equ' include 'pl.equ' ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT D_Deref IMPORT D_NeedHand IMPORT P_AddGuide IMPORT P_ContentRect IMPORT P_FixPt IMPORT P_H IMPORT P_PageMode IMPORT P_RoundGuide IMPORT P_Traverse IMPORT P_V IMPORT D_UnLock IMPORT P_PaperRect IMPORT P_FullPaperRect ; pdrag.s ; Notes for D_DrawProc: ; newpt of -1,-1 says to get rid of the old drawing & nothing else ; newpt == oldpt says to get rid of old, then redraw it for real. ; need to clip as necessary. ;--------------------------------------------------------------------------- ; ; P_DragStuff (OldPt:l, starting D_MouseDown Q_Point ; Array:l, array HANDLE of guides/tabs ; Count:w, Number of items currently in array. ; D_DrawProc:l, procedure/function to draw tab/guide ; TabType:w, L/D/R ; Vert:w, Vertical Guide? ; Max:w, Maximum pixel position for valid whatever ; Min:w, Minimum ' ' ' ' " ; Erase:w Erase an old whatever first? ; ; ----> NewCount, NewArrayHdl, NewPt P_DragStuff PROC EXPORT ;Using P_Data local adjpt:l,hoffset:w,voffset:w local newpt:l,tmp:l,ptr:l,ppi:l input oldpt:l,count:w,array:l,D_DrawProc:l,tabtype:w input vert:w,max:w,min:w,dist:w,erase:w output newcount:w,amt:w error err begin stz err lda oldpt+2 and #$FFFE sta oldpt+2 moveaddr D_DrawProc,DrawIt+1 ; patch in the functional moveaddr D_DrawProc,DrawIt2+1 ; parameter. moveaddr D_DrawProc,DrawIt3+1 subword P_V,P_ContentRect,voffset ; correct for subword P_H,P_ContentRect+2,a ; scrolled-over-ness and #$FFFE ; make sure it's even sta hoffset ; pixelized, to be safe... lda vert bne VertMaxMin moveword max,newpt jsr AdjustPt moveword amt,max moveword min,newpt jsr AdjustPt moveword amt,min bra DidMaxMin VertMaxMin moveword max,newpt+2 jsr AdjustPt moveword amt,max moveword min,newpt+2 jsr AdjustPt moveword amt,min DidMaxMin lda count beq StartDrag rcall D_Deref,in=(array:ax),out=(ptr:ax) StartDrag lda erase beq DragLoop movelong #-1,newpt brl OKDraw DragLoop tool _GetMouse,in=(!newpt:l) lda newpt+2 and #$FFFE sta newpt+2 lda vert ; Only redraw beq HorizCmp ; when vertical cmpw oldpt+2,newpt+2 ; or horizontal jeq ContLoop ; changes, as bra DoneCmp ; is appropriate HorizCmp cmpw oldpt,newpt ; . jeq ContLoop ; : DoneCmp jsr AdjustPt ; Check to see if it is too D_Close to another one... lda count beq OKDraw call P_Traverse,in=(array:l,amt:w,#4:w,count:w),out=(tmp:w) lsr a lsr a cmp count bge CheckLesser addword amt,dist,a scmpw a,[ptr]:tmp bge DontMove CheckLesser subword amt,dist,y subword tmp,#4,tmp bmi OKDraw tya scmpw a,[ptr]:tmp ble DontMove OKDraw pushlong oldpt pushlong newpt pushword tabtype pushword vert DrawIt jsl * bra ContLoop DontMove movelong oldpt,newpt bra CheckDown ContLoop movelong newpt,oldpt CheckDown tool _StillDown,in=(#0:w),out=(a:w) jne DragLoop PutDown movelong newpt,oldpt jsr AdjustPt scmpw amt,min jlt NoDice scmpw max,amt jlt NoDice lda count beq NeedNew rcall D_UnLock,in=(array:ax) bra Unlocked NeedNew call D_NeedHand,in=(#4:l),out=(array:l) movelong [array],ptr movelong #0,[ptr] Unlocked lda P_PageMode beq DoAddG ; Round call P_RoundGuide,in=(amt:w,vert:w),out=(amt:w) moveword amt,newpt moveword amt,newpt+2 rcall P_FixPt,in=(newpt:ax),out=(newpt:ax) pushlong oldpt pushlong newpt pushword tabtype pushword vert DrawIt3 jsl * movelong newpt,oldpt DoAddG in amt:w,array:l,count:w,tabtype:w out count:w xerr err xcall P_AddGuide bra Dice NoDice movelong #-1,newpt Dice pushlong oldpt pushlong newpt pushword tabtype pushword vert DrawIt2 jsl * moveword count,newcount return ;------------------------- ; ; AdjustPt (local ro