mirror of
https://github.com/antoinevignau/source.git
synced 2025-02-08 04:30:38 +00:00
1 line
16 KiB
Plaintext
Executable File
1 line
16 KiB
Plaintext
Executable File
load 'macros.dump'
|
|
include 'driver.equ'
|
|
include 'wp.equ'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT W_BoxAdTable
|
|
IMPORT W_BoxLocTable
|
|
IMPORT W_DTabPc
|
|
IMPORT D_DrawIcon
|
|
IMPORT W_LTabPc
|
|
IMPORT W_MargPc
|
|
IMPORT W_RTabPc
|
|
IMPORT W_TabWell
|
|
IMPORT W_IndentPc
|
|
IMPORT Q_Mask
|
|
IMPORT W_NothingPc
|
|
IMPORT W_oldnumtabs
|
|
IMPORT Q_Point
|
|
IMPORT W_TabIcons
|
|
IMPORT W_vr_indentm
|
|
IMPORT W_vr_leftm
|
|
IMPORT W_vr_numtabs
|
|
IMPORT W_vr_rightm
|
|
IMPORT W_vr_status
|
|
IMPORT W_vr_tablist
|
|
|
|
import W_r_changes
|
|
import W_RulOffset
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY W_CheckWells
|
|
ENTRY W_DeleteTab
|
|
ENTRY W_InvertBitBox
|
|
ENTRY W_SetStatBit
|
|
ENTRY W_TrackTab
|
|
****************************************************************
|
|
*
|
|
* StyleWorks word processor RULERS private routines
|
|
*______________________________________________________________*
|
|
*
|
|
* CONTENTS:
|
|
* W_OneRulClick(clickpt:l) -> changed:w
|
|
* W_DeleteTab(num:w) ;
|
|
* W_InsertTab(type:w,pos:w)
|
|
* W_TrackTab(type:w) ;
|
|
* W_SetStatBit(bit:w)
|
|
* W_InvertBitBox(bit:w)
|
|
*
|
|
****************************************************************
|
|
|
|
****************************************************************
|
|
*
|
|
* W_OneRulClick(clickpt:l) -- W_Handle a single D_MouseDown event
|
|
* in the visible ruler
|
|
*
|
|
****************************************************************
|
|
W_OneRulClick PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input clickpt:l
|
|
output changed:w
|
|
local count:w,temprect:r,rectptr:l
|
|
|
|
begin
|
|
|
|
stz changed
|
|
moveword W_vr_numtabs,W_oldnumtabs ; redraw tabwells if nec.
|
|
|
|
cmpw clickpt,#W_tabtop ; is the Q_Point in the numbers?
|
|
jlt bye
|
|
|
|
cmpw clickpt,#W_boxtop ; could it be in a box?
|
|
jge boxstuff
|
|
|
|
*--------------------------------------------------------------*
|
|
* W_Handle click in tab area
|
|
*--------------------------------------------------------------*
|
|
subword clickpt+2,#W_TabOffset,clickpt+2 ; adjust for clk detex'n
|
|
|
|
subword clickpt+2,W_vr_leftm,a ; is it the left margin?
|
|
blt notleft
|
|
cmp #W_TabSlop
|
|
bgt notleft
|
|
|
|
subword clickpt+2,W_vr_indentm,a ; COULD it be the W_Indent margin?
|
|
blt justleft
|
|
cmp #W_TabSlop
|
|
bgt justleft
|
|
|
|
cmpw clickpt,#W_tabtop+3 ; it could be. Is it low enough?
|
|
jgt itsindent
|
|
|
|
justleft pushlong #W_NothingPc ; erase the margin markers
|
|
addword W_vr_leftm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotCopy
|
|
jsl D_DrawIcon
|
|
|
|
pushlong #W_NothingPc
|
|
addword W_vr_indentm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotCopy
|
|
jsl D_DrawIcon
|
|
|
|
pushword #W_rt_leftm
|
|
addword W_vr_leftm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
jsl W_TrackTab
|
|
|
|
lda W_r_changes
|
|
ora #W_ch_left
|
|
ora #W_ch_indent ; W_Indent changed, too.
|
|
sta W_r_changes
|
|
|
|
brl done
|
|
|
|
notleft subword clickpt+2,W_vr_indentm,a ; is it the W_Indent margin?
|
|
blt notindent
|
|
cmp #W_TabSlop
|
|
bgt notindent
|
|
|
|
itsindent pushlong #W_NothingPc ; erase the marker
|
|
addword W_vr_indentm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotCopy
|
|
jsl D_DrawIcon
|
|
|
|
pushlong #W_MargPc ; redraw the left margin, just in case
|
|
addword W_vr_leftm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotBic
|
|
jsl D_DrawIcon
|
|
|
|
pushword #W_rt_indentm
|
|
addword W_vr_indentm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
jsl W_TrackTab
|
|
|
|
lda W_r_changes
|
|
ora #W_ch_indent
|
|
sta W_r_changes
|
|
|
|
brl done
|
|
|
|
notindent subword clickpt+2,W_vr_rightm,a ; is it the right margin?
|
|
blt notright
|
|
cmp #W_TabSlop
|
|
bgt notright
|
|
|
|
pushlong #W_NothingPc ; erase the marker
|
|
addword W_vr_rightm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotCopy
|
|
jsl D_DrawIcon
|
|
|
|
pushword #W_rt_rightm
|
|
addword W_vr_rightm,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
jsl W_TrackTab
|
|
|
|
lda W_r_changes
|
|
ora #W_ch_right
|
|
sta W_r_changes
|
|
|
|
brl done
|
|
|
|
notright stz count
|
|
tabloop cmpw count,W_vr_numtabs ; is it a tab?
|
|
jeq bye
|
|
|
|
lda count
|
|
asl a
|
|
asl a
|
|
tax
|
|
lda clickpt+2
|
|
sec
|
|
sbc W_vr_tablist+W_ort_Location,x
|
|
blt nexttab
|
|
cmp #W_TabSlop
|
|
bgt nexttab
|
|
|
|
pushword W_vr_tablist+W_ort_Type:x ; for W_TrackTab...
|
|
addword W_vr_tablist+W_ort_Location:x,#W_TabOffset,s
|
|
pushword #W_tabtop ;
|
|
|
|
pushword count ;delete the tab (and fix the screen)
|
|
jsl W_DeleteTab
|
|
|
|
jsl W_TrackTab ; ...here (This ;may* reinsert the tab)
|
|
|
|
brl done
|
|
|
|
nexttab inc count
|
|
brl tabloop
|
|
|
|
*--------------------------------------------------------------*
|
|
* W_Handle click in box area
|
|
*--------------------------------------------------------------*
|
|
boxstuff stz count
|
|
|
|
boxloop lda count
|
|
cmp #11 ; am I through?
|
|
jeq bye
|
|
|
|
asl a
|
|
asl a
|
|
tax
|
|
movelong W_BoxAdTable:x,rectptr ; get the icon rectangle
|
|
|
|
movelong [rectptr],temprect ; get my own copy
|
|
movelong [rectptr]:#4,temprect+4
|
|
|
|
pushlong !temprect ; W_offset by icon location
|
|
pushlong W_BoxLocTable:x
|
|
_OffsetRect
|
|
|
|
spaceword
|
|
pushlong !clickpt
|
|
pushlong !temprect
|
|
_PtInRect
|
|
pla
|
|
beq nextbox
|
|
|
|
cmpw count,#8
|
|
bge itsawell
|
|
|
|
pushword count
|
|
jsl W_SetStatBit
|
|
|
|
brl done
|
|
|
|
itsawell cmpw W_vr_numtabs,#W_maxTabs
|
|
jeq done
|
|
|
|
subword count,#9,s
|
|
pushlong clickpt
|
|
jsl W_TrackTab ; (this MAY insert a tab)
|
|
bra done
|
|
|
|
nextbox inc count
|
|
brl boxloop
|
|
|
|
done inc changed
|
|
|
|
bye return
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_DeleteTab(num:w) -- delete the num'th tab, and fix the screen
|
|
*
|
|
****************************************************************
|
|
W_DeleteTab PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input num:w
|
|
|
|
begin
|
|
|
|
lda W_r_changes
|
|
ora #W_ch_tabs
|
|
sta W_r_changes
|
|
|
|
dec W_vr_numtabs
|
|
|
|
pushlong #W_NothingPc ; erase the marker
|
|
lda num
|
|
asl a
|
|
asl a
|
|
tax
|
|
addword W_vr_tablist+W_ort_Location:x,#W_TabOffset,s
|
|
pushword #W_tabtop
|
|
pushword #NotCopy
|
|
jsl D_DrawIcon
|
|
|
|
mloop cmpw num,W_vr_numtabs
|
|
bge endmloop
|
|
|
|
lda num ; shuffle the next tab back one
|
|
asl a
|
|
asl a
|
|
tax
|
|
movelong W_vr_tablist+4:x,W_vr_tablist:x
|
|
|
|
inc num
|
|
bra mloop
|
|
|
|
endmloop return
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_InsertTab(type:w,pos:w) -- insert a tab
|
|
*
|
|
****************************************************************
|
|
W_InsertTab PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input type:w,pos:w
|
|
local count:w,count2:w
|
|
|
|
begin
|
|
|
|
lda W_r_changes
|
|
ora #W_ch_tabs
|
|
sta W_r_changes
|
|
|
|
stz count
|
|
floop cmpw count,W_vr_numtabs
|
|
bge gotit
|
|
|
|
lda count
|
|
asl a
|
|
asl a
|
|
tax
|
|
lda W_vr_tablist+W_ort_Location,x
|
|
cmp pos
|
|
bgt gotit
|
|
|
|
inc count
|
|
bra floop
|
|
|
|
gotit moveword W_vr_numtabs,count2
|
|
|
|
mloop cmpw count2,count
|
|
ble insertit
|
|
|
|
dec count2
|
|
lda count2
|
|
asl a
|
|
asl a
|
|
tax
|
|
movelong W_vr_tablist:x,W_vr_tablist+4:x
|
|
bra mloop
|
|
|
|
insertit lda count
|
|
asl a
|
|
asl a
|
|
tax
|
|
moveword type,W_vr_tablist+W_ort_Type:x
|
|
moveword pos,W_vr_tablist+W_ort_Location:x
|
|
|
|
inc W_vr_numtabs
|
|
|
|
return
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_TrackTab - track the tab marker whose type is specified by
|
|
* the accumulator
|
|
*
|
|
****************************************************************
|
|
W_TrackTab PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input type:w,lastpt:l
|
|
local iptr:l,Q_Point:l,redraw:w
|
|
local llimit:w,rlimit:w,mlimit:w
|
|
local dist:w,count:w
|
|
|
|
begin
|
|
|
|
_HideCursor
|
|
|
|
inc redraw
|
|
|
|
lda type ; Get a pointer to the icon
|
|
inc a
|
|
asl a
|
|
asl a
|
|
tax
|
|
movelong W_TabIcons:x,iptr
|
|
|
|
*--------------------------------------------------------------*
|
|
* Compute limits for various tab types
|
|
*--------------------------------------------------------------*
|
|
lda type
|
|
cmp #W_rt_leftm ; ---- PREP FOR LEFT/W_Indent MARGIN ----
|
|
beq left1
|
|
cmp #W_rt_indentm
|
|
jne notleft1
|
|
|
|
left1 subword W_vr_rightm,#W_pixPerInch*2,rlimit ; limit to rightm - 2"
|
|
|
|
lda W_vr_numtabs ; any W_Tabs?
|
|
jeq gotlimits1 ; if not, we have our limits
|
|
|
|
subword W_vr_tablist+W_ort_Location,#W_TabSlop,a
|
|
cmp rlimit ; if so, limit to the first tab
|
|
bge gotlimits1
|
|
sta rlimit
|
|
|
|
gotlimits1 cmpw type,#W_rt_indentm ; if W_Indent, start tracking!
|
|
beq in_dent2
|
|
|
|
tabfirst subword W_vr_indentm,W_vr_leftm,dist ; how far to W_Indent?
|
|
bgt in_dent
|
|
|
|
subword #-W_TabOffset,dist,llimit ; if 'out-denting', keep
|
|
brl adjlimits ; indentm positive
|
|
|
|
in_dent subword rlimit,dist,rlimit ; else limit indentm as above
|
|
in_dent2 moveword #-W_TabOffset,llimit ; and keep leftm positive
|
|
brl adjlimits
|
|
|
|
notleft1 cmp #W_rt_rightm ; ---- PREP FOR RIGHT MARGIN ----
|
|
jne notright1
|
|
|
|
addword #8*W_pixPerInch,W_RulOffset,rlimit ; keep it below 8"
|
|
|
|
lda W_vr_leftm ; which is closer, leftm or indentm?
|
|
cmp W_vr_indentm
|
|
bgt gotleft2
|
|
lda W_vr_indentm
|
|
|
|
gotleft2 addword a,#W_pixPerInch*2,llimit ; limit to that margin + 2"
|
|
|
|
lda W_vr_numtabs ; any W_Tabs?
|
|
jeq adjlimits ; if not, start trackin'
|
|
|
|
dec a
|
|
asl a
|
|
asl a
|
|
tax
|
|
addword W_vr_tablist+W_ort_Location:x,#W_TabSlop,a
|
|
|
|
cmp llimit ; if so, limit to the first tab
|
|
jle adjlimits
|
|
sta llimit
|
|
brl adjlimits
|
|
|
|
notright1 subword W_vr_rightm,#W_TabSlop,rlimit ; ---- PREP FOR W_Tabs ----
|
|
lda W_vr_leftm ; which is closer, leftm or indentm?
|
|
cmp W_vr_indentm
|
|
bgt gotleft3
|
|
lda W_vr_indentm
|
|
gotleft3 addword a,#W_TabSlop,llimit
|
|
|
|
adjlimits addword llimit,#W_TabOffset,llimit ; adjust limits for
|
|
addword rlimit,#W_TabOffset,rlimit ; tab W_offset
|
|
|
|
*--------------------------------------------------------------*
|
|
* The track loop ;
|
|
*--------------------------------------------------------------*
|
|
trloop pushlong !Q_Point ; ---- GET AND MANGLE THE MOUSE LOC ----
|
|
_GetMouse
|
|
|
|
lda type
|
|
bmi maybedrop ; check for decimal W_Tabs
|
|
cmp #W_rt_leftm ; don't drop margins
|
|
bge toohigh
|
|
|
|
maybedrop cmpw Q_Point,#200 ; << sigh... >>
|
|
bgt toohigh
|
|
cmpw Q_Point,#W_welltop ; is it in the tab area?
|
|
bge toolow
|
|
|
|
toohigh moveword #W_tabtop,Q_Point ; constrain to the tab area
|
|
bra goty
|
|
|
|
toolow moveword #W_welltop,Q_Point ; stay below the tab area
|
|
|
|
goty lda Q_Point+2 ; make the x coord even
|
|
and #$fffe
|
|
clc
|
|
adc #W_TabOffset ; tweak it a bit
|
|
sta Q_Point+2
|
|
|
|
cmpw Q_Point+2,#10000 ; << ... >>
|
|
blt @ok
|
|
moveword llimit,Q_Point+2
|
|
bra limited
|
|
|
|
@ok lda llimit ; put the Q_Point within the limits
|
|
cmp Q_Point+2
|
|
blt l_limited ; << ... >>
|
|
sta Q_Point+2
|
|
bra limited
|
|
|
|
l_limited lda rlimit
|
|
cmp Q_Point+2
|
|
bgt limited
|
|
sta Q_Point+2
|
|
|
|
limited cmpw Q_Point,#W_welltop ; If I'm not in the tab
|
|
jeq notnear ; area, I don't need to
|
|
stz count ; ---- CHECK FOR TAB COLLISION ----
|
|
|
|
tabloop cmpw count,W_vr_numtabs
|
|
jeq notnear
|
|
|
|
lda count
|
|
asl a
|
|
asl a
|
|
tax
|
|
|
|
lda Q_Point+2 ; get the distance to the left side of
|
|
sec ; the other tab marker
|
|
sbc W_vr_tablist+W_ort_Location,x
|
|
sec ; << HMMM! >>
|
|
sbc #W_TabOffset-W_TabSlop
|
|
cmp #0 ; << hmmm.... >>
|
|
ble nexttab
|
|
cmp #2*W_TabSlop
|
|
blt nearone
|
|
|
|
nexttab inc count ; maybe next W_Time
|
|
bra tabloop
|
|
|
|
nearone movelong lastpt,Q_Point ; don't move from last W_Time!
|
|
|
|
notnear lda redraw ; ---- DRAW THE ICONS IF NECESSARY ----
|
|
jne newicon
|
|
|
|
spaceword
|
|
pushword #0
|
|
_StillDown ; is the button down?
|
|
pla
|
|
jeq endtrloop ; if not, stop tracking
|
|
|
|
cmpl Q_Point,lastpt ; has the Q_Point changed?
|
|
jeq trloop ; if not, keep tracking
|
|
|
|
pushlong iptr ; erase the old one
|
|
pushlong lastpt
|
|
pushword #NotXor
|
|
jsl D_DrawIcon
|
|
|
|
cmpw type,#W_rt_leftm ; W_Indent marker, too?
|
|
bne newicon
|
|
|
|
pushlong #W_IndentPc
|
|
addword lastpt+2,dist,s
|
|
pushword lastpt
|
|
pushword #notXor
|
|
jsl D_DrawIcon
|
|
|
|
newicon pushlong iptr ; draw the D_New one
|
|
pushlong Q_Point
|
|
pushword #NotXor
|
|
jsl D_DrawIcon
|
|
|
|
cmpw type,#W_rt_leftm ; W_Indent marker, too?
|
|
bne noindent
|
|
|
|
pushlong #W_IndentPc
|
|
addword Q_Point+2,dist,s
|
|
pushword Q_Point
|
|
pushword #notXor
|
|
jsl D_DrawIcon
|
|
|
|
noindent movelong Q_Point,lastpt
|
|
stz redraw
|
|
|
|
brl trloop
|
|
|
|
*--------------------------------------------------------------*
|
|
* Set the margin/tab and D_Update the ruler
|
|
*--------------------------------------------------------------*
|
|
endtrloop pushlong iptr
|
|
pushlong lastpt
|
|
pushword #notXor
|
|
jsl D_DrawIcon
|
|
|
|
cmpw type,#W_rt_leftm
|
|
bne erased2
|
|
|
|
pushlong #W_IndentPc
|
|
addword lastpt+2,dist,s
|
|
pushword lastpt
|
|
pushword #notXor
|
|
jsl D_DrawIcon
|
|
|
|
erased2 cmpw Q_Point,#W_welltop
|
|
beq bye
|
|
|
|
pushlong iptr
|
|
pushlong Q_Point
|
|
pushword #notBic
|
|
jsl D_DrawIcon
|
|
|
|
cmpw type,#W_rt_leftm
|
|
bne notleft3
|
|
|
|
pushlong #W_IndentPc
|
|
addword Q_Point+2,dist,s
|
|
pushword Q_Point
|
|
pushword #notBic
|
|
jsl D_DrawIcon
|
|
|
|
subword Q_Point+2,#W_TabOffset,W_vr_leftm
|
|
addword Q_Point+2,dist,a
|
|
subword a,#W_TabOffset,W_vr_indentm
|
|
brl bye
|
|
|
|
notleft3 cmp #W_rt_indentm
|
|
bne notindent3
|
|
|
|
subword Q_Point+2,#W_TabOffset,W_vr_indentm
|
|
brl bye
|
|
|
|
notindent3 cmp #W_rt_rightm
|
|
bne notright3
|
|
|
|
subword Q_Point+2,#W_TabOffset,W_vr_rightm
|
|
brl bye
|
|
|
|
notright3 pushword type ; it must be a tab.
|
|
subword Q_Point+2,#W_TabOffset,s
|
|
jsl W_InsertTab
|
|
|
|
bye jsl W_CheckWells ; redraw the tabwells?
|
|
|
|
goway _ShowCursor
|
|
|
|
return
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_CheckWells -- redraw the tabwells if necessary
|
|
*
|
|
****************************************************************
|
|
W_CheckWells PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
lda W_vr_numtabs
|
|
cmp W_oldnumtabs
|
|
jeq goway
|
|
|
|
pushlong #W_TabWell ; if W_NumTabs = W_maxTabs or W_maxTabs-1,
|
|
pushword #W_t1 ; redraw the tab wells
|
|
pushword #W_welltop
|
|
pushword #notCopy
|
|
jsl D_DrawIcon
|
|
pushlong #W_TabWell
|
|
pushword #W_t2
|
|
pushword #W_welltop
|
|
pushword #notCopy
|
|
jsl D_DrawIcon
|
|
pushlong #W_TabWell
|
|
pushword #W_t3
|
|
pushword #W_welltop
|
|
pushword #notCopy
|
|
jsl D_DrawIcon
|
|
|
|
cmpw W_vr_numtabs,#W_maxTabs ; if W_maxTabs, then that's all!
|
|
beq goway
|
|
|
|
pushlong #W_LTabPc ; Otherwise, fill 'em, too.
|
|
pushword #W_t1+W_THoff
|
|
pushword #W_welltop
|
|
pushword #NotBic
|
|
jsl D_DrawIcon
|
|
pushlong #W_DTabPc
|
|
pushword #W_t2+W_THoff
|
|
pushword #W_welltop
|
|
pushword #NotBic
|
|
jsl D_DrawIcon
|
|
pushlong #W_RTabPc
|
|
pushword #W_t3+W_THoff
|
|
pushword #W_welltop
|
|
pushword #NotBic
|
|
jsl D_DrawIcon
|
|
|
|
goway rtl
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_SetStatBit -- set the specified status bit, reseting any
|
|
* others in the same family, and change the appearance
|
|
* of the ruler appropriately.
|
|
*
|
|
****************************************************************
|
|
W_SetStatBit PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input bit:w
|
|
local Q_Mask:w,family:w
|
|
|
|
begin
|
|
|
|
lda #1
|
|
ldx bit
|
|
bitloop beq gotit
|
|
asl a
|
|
dex
|
|
bra bitloop
|
|
gotit sta Q_Mask
|
|
|
|
lda Q_Mask
|
|
cmp #W_r_widow ; is it the widow bit?
|
|
jne notwidow
|
|
|
|
lda W_r_changes ; remember that I changed it...
|
|
ora #W_r_widow
|
|
sta W_r_changes
|
|
|
|
pushword bit ; ...change it on the screen...
|
|
jsl W_InvertBitBox
|
|
|
|
lda W_vr_status ; ...then change it for real.
|
|
eor #W_r_widow
|
|
sta W_vr_status
|
|
|
|
brl bye
|
|
|
|
notwidow jlt notjust ; is it justification?
|
|
moveword #W_r_just,family
|
|
bra gotfam
|
|
|
|
notjust moveword #W_r_spacing,family
|
|
|
|
gotfam lda W_r_changes ; remember ONLY the last bit set in
|
|
and #$ffff-family ; the family!!!
|
|
ora Q_Mask
|
|
sta W_r_changes
|
|
|
|
lda W_vr_status
|
|
and family
|
|
cmp Q_Mask
|
|
jeq bye ; if the bit's already set, do nothing
|
|
|
|
ldx #0
|
|
jloop lsr a
|
|
beq gotoldj
|
|
inx
|
|
bra jloop
|
|
|
|
gotoldj phx ; invert the old box
|
|
jsl W_InvertBitBox
|
|
|
|
pushword bit ; invert the D_New box
|
|
jsl W_InvertBitBox
|
|
|
|
lda W_vr_status ; set the bit
|
|
eor #$ffff
|
|
ora family ; (clear the old bit first)
|
|
eor #$ffff
|
|
ora Q_Mask
|
|
sta W_vr_status
|
|
|
|
bye return
|
|
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* W_InvertBitBox -- invert the box associated with a status bit
|
|
*
|
|
****************************************************************
|
|
W_InvertBitBox PROC EXPORT
|
|
;Using W_RulerData
|
|
|
|
input bit:w
|
|
local rectptr:r,temprect:r
|
|
|
|
begin
|
|
|
|
lda bit
|
|
asl a
|
|
asl a
|
|
tax
|
|
movelong W_BoxAdTable:x,rectptr ; get the icon rectangle
|
|
|
|
movelong [rectptr],temprect ; get my own copy
|
|
movelong [rectptr]:#4,temprect+4
|
|
|
|
pushlong !temprect ; W_offset by icon location
|
|
pushlong W_BoxLocTable:x
|
|
_OffsetRect
|
|
|
|
inc temprect
|
|
addword temprect+2,#2,temprect+2
|
|
subword temprect+4,#2,temprect+4
|
|
subword temprect+6,#4,temprect+6
|
|
|
|
pushlong !temprect
|
|
_InvertRect
|
|
|
|
return
|
|
|
|
ENDP
|
|
END
|
|
|