WeeGUI/views.s

1084 lines
18 KiB
ArmAsm

;
; views.s
; Management routines for GUI views
;
; Created by Quinn Dunki on 8/15/14.
; Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGCreateView
; Creates and selects a new view
; PARAM0: Pointer to configuration struct (LSB)
; PARAM1: Pointer to configuration struct (MSB)
;
; Configuration struct:
; ID: View ID (0-f)
; ST: Style
; XX: Screen X origin
; YY: Screen Y origin
; SW: Screen width
; SH: Screen height
; VW: View Width
; VH: View Height
;
WGCreateView:
SAVE_AXY
SAVE_ZPS
ldy #0
lda (PARAM0),y
jsr WGSelectView ; Find our new view record
asl
asl
asl
asl ; Records are 8 bytes wide
tax
iny
lda (PARAM0),y
pha ; Cache style byte for later
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen X
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen Y
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen Width
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen Height
inx
pla
sta WG_VIEWRECORDS,x ; Style
inx
lda #0 ; Initialize scrolling
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; View Width
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; View Height
lda #0
inx ; Initialize state
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x ; Initialize callback
inx
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x ; Initialize title
inx
sta WG_VIEWRECORDS,x
WGCreateView_done:
RESTORE_ZPS
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGCreateCheckbox
; Creates a new checkbox
; PARAM0: Pointer to configuration struct (LSB)
; PARAM1: Pointer to configuration struct (MSB)
;
; Configuration struct:
; ID: View ID (0-f)
; XX: Screen X origin
; YY: Screen Y origin
;
WGCreateCheckbox:
SAVE_AXY
SAVE_ZPS
ldy #0
lda (PARAM0),y
jsr WGSelectView ; Find our new view record
asl
asl
asl
asl ; Records are 16 bytes wide
tax
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen X
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen Y
inx
lda #1
sta WG_VIEWRECORDS,x ; Initialize screen width
inx
sta WG_VIEWRECORDS,x ; Initialize screen height
inx
lda #VIEW_STYLE_CHECK
sta WG_VIEWRECORDS,x ; Style
inx
lda #0 ; Initialize scrolling
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x
inx
lda #0
sta WG_VIEWRECORDS,x ; Initialize view width
inx
sta WG_VIEWRECORDS,x ; Initialize view height
inx
lda #%00000000 ; Initialize state
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x ; Initialize callback
inx
sta WG_VIEWRECORDS,x
WGCreateCheckbox_done:
RESTORE_ZPS
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGCreateButton
; Creates a new button
; PARAM0: Pointer to configuration struct (LSB)
; PARAM1: Pointer to configuration struct (MSB)
;
; Configuration struct:
; ID: View ID (0-f)
; XX: Screen X origin
; YY: Screen Y origin
; BW: Button width
WGCreateButton:
SAVE_AXY
SAVE_ZPS
ldy #0
lda (PARAM0),y
jsr WGSelectView ; Find our new view record
asl
asl
asl
asl ; Records are 16 bytes wide
tax
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen X
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen Y
inx
iny
lda (PARAM0),y
sta WG_VIEWRECORDS,x ; Screen width
inx
lda #1
sta WG_VIEWRECORDS,x ; Initialize screen height
inx
lda #VIEW_STYLE_BUTTON
sta WG_VIEWRECORDS,x ; Style
inx
lda #0 ; Initialize scrolling
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x
inx
lda #0
sta WG_VIEWRECORDS,x ; Initialize view width
inx
sta WG_VIEWRECORDS,x ; Initialize view height
inx
lda #%00000000 ; Initialize state
sta WG_VIEWRECORDS,x
inx
sta WG_VIEWRECORDS,x ; Initialize callback
inx
sta WG_VIEWRECORDS,x
inx
lda #0
sta WG_VIEWRECORDS,x ; Initialize title
inx
sta WG_VIEWRECORDS,x ; Initialize title
WGCreateButton_done:
RESTORE_ZPS
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGPaintView
; Paints the current view
;
WGPaintView:
SAVE_AY
SAVE_ZPP
SAVE_ZPS
LDY_ACTIVEVIEW
lda WG_VIEWRECORDS+4,y ; Cache style information
sta SCRATCH0
lda WG_VIEWRECORDS+0,y ; Fetch the geometry
sta PARAM0
lda WG_VIEWRECORDS+1,y
sta PARAM1
lda WG_VIEWRECORDS+2,y
sta PARAM2
lda WG_VIEWRECORDS+3,y
sta PARAM3
lda SCRATCH0 ; Draw outline
cmp #VIEW_STYLE_FANCY
beq WGPaintView_decorated
jsr WGStrokeRect
lda SCRATCH0
cmp #VIEW_STYLE_CHECK
beq WGPaintView_check
cmp #VIEW_STYLE_BUTTON
beq WGPaintView_button
bra WGPaintView_done
WGPaintView_decorated:
jsr WGFancyRect
jsr paintWindowTitle
bra WGPaintView_done
WGPaintView_check:
jsr paintCheck
bra WGPaintView_done
WGPaintView_button:
jsr paintButton
WGPaintView_done:
RESTORE_ZPS
RESTORE_ZPP
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; paintCheck
; Paints the contents of a checkbox
; Y: Index into view records of checkbox to paint
; Side effects: Clobbers A, S0
paintCheck:
lda WG_VIEWRECORDS+0,y ; Position cursor
sta WG_CURSORX
lda WG_VIEWRECORDS+1,y
sta WG_CURSORY
lda WG_VIEWRECORDS+9,y ; Determine our visual state
and #$80
bne paintCheck_selected
lda WG_VIEWRECORDS+9,y
and #$01
beq paintCheck_unselectedUnchecked
lda #'D'
bra paintCheck_plot
paintCheck_unselectedUnchecked:
lda #' '+$80
bra paintCheck_plot
paintCheck_selected:
lda WG_VIEWRECORDS+9,y
and #$01
beq paintCheck_selectedUnchecked
lda #'E'
bra paintCheck_plot
paintCheck_selectedUnchecked:
lda #' '
paintCheck_plot: ; Paint our state
jsr WGPlot
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; paintButton
; Paints the contents of a button
; Y: Index into view records of button to paint
;
paintButton:
SAVE_AX
SAVE_ZPS
lda WG_VIEWRECORDS+13,y ; Prep the title string
sta PARAM0
lda WG_VIEWRECORDS+12,y
sta PARAM1
jsr WGStrLen ; Compute centering offset for title
lsr
sta SCRATCH1
lda WG_VIEWRECORDS+2,y
lsr
sec
sbc SCRATCH1
sta SCRATCH1 ; Cache this for left margin rendering
lda #0 ; Position and print title
sta WG_LOCALCURSORX
lda #0
sta WG_LOCALCURSORY
jsr WGSyncGlobalCursor
lda WG_VIEWRECORDS+9,y ; Is button highlighted?
and #$80
bne paintButton_titleSelected
jsr WGNormal
lda #' '+$80
bra paintButton_titleMarginLeft
paintButton_titleSelected:
jsr WGInverse
lda #' '
paintButton_titleMarginLeft:
ldx #0
paintButton_titleMarginLeftLoop:
cpx SCRATCH1
bcs paintButton_title ; Left margin finished
jsr WGPlot
inc WG_CURSORX
inc WG_LOCALCURSORX
inx
jmp paintButton_titleMarginLeftLoop
paintButton_title:
jsr WGPrint
ldx WG_VIEWRECORDS+2,y
stx SCRATCH1 ; Loop until right edge of button is reached
ldx WG_LOCALCURSORX
paintButton_titleMarginRightLoop:
cpx SCRATCH1
bcs paintButton_done ; Right margin finished
jsr WGPlot
inc WG_CURSORX
inc WG_LOCALCURSORX
inx
jmp paintButton_titleMarginRightLoop
paintButton_done:
RESTORE_ZPS
RESTORE_AX
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; paintWindowTitle
; Paints the title of a fancy window
; Y: Index into view records of view title to paint
;
paintWindowTitle:
SAVE_AX
SAVE_ZPS
lda WG_VIEWRECORDS+13,y ; Prep the title string
sta PARAM0
lda WG_VIEWRECORDS+12,y
sta PARAM1
bne paintWindowTitle_compute
paintWindowTitle_checkNull:
lda PARAM0
beq paintWindowTitle_done
paintWindowTitle_compute:
jsr WGStrLen ; Compute centering offset for title
lsr
sta SCRATCH1
lda WG_VIEWRECORDS+2,y
lsr
sec
sbc SCRATCH1
sta WG_LOCALCURSORX ; Position cursor
lda #-1
sta WG_LOCALCURSORY
jsr WGSyncGlobalCursor
ldy #0
paintWindowTitleLoop:
lda (PARAM0),y
beq paintWindowTitle_done
ora #%10000000
jsr WGPlot ; Draw the character
iny
inc WG_CURSORX ; Advance cursors
bra paintWindowTitleLoop
paintWindowTitle_done:
RESTORE_ZPS
RESTORE_AX
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGEraseView
; Erases the current view (including decoration)
;
WGEraseView:
SAVE_AXY
SAVE_ZPP
LDY_ACTIVEVIEW
lda WG_VIEWRECORDS,y ; Fetch the record
dec
sta PARAM0
iny
lda WG_VIEWRECORDS,y
dec
sta PARAM1
iny
lda WG_VIEWRECORDS,y
inc
inc
sta PARAM2
iny
lda WG_VIEWRECORDS,y
inc
inc
sta PARAM3
ldx #' '+$80
jsr WGFillRect
WGEraseView_done:
RESTORE_ZPP
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGEraseViewContents
; Erases the contents of the current view (interior contents only)
;
WGEraseViewContents:
SAVE_AXY
SAVE_ZPP
LDY_ACTIVEVIEW
lda WG_VIEWRECORDS,y ; Fetch the record
sta PARAM0
iny
lda WG_VIEWRECORDS,y
sta PARAM1
iny
lda WG_VIEWRECORDS,y
sta PARAM2
iny
lda WG_VIEWRECORDS,y
sta PARAM3
ldx #' '+$80
jsr WGFillRect
WGEraseViewContents_done:
RESTORE_ZPP
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGSelectView
; Selects the active view
; A: ID
;
WGSelectView:
sta WG_ACTIVEVIEW
pha
; Initialize cursor to local origin
lda #0
sta WG_LOCALCURSORX
sta WG_LOCALCURSORY
jsr cacheClipPlanes ; View changed, so clipping cache is stale
WGSelectView_done:
pla
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewFocus
; Shifts focus to the selected view
; Side effects: Changes selected view, repaints some views
;
WGViewFocus:
SAVE_AY
lda WG_ACTIVEVIEW ; Stash current selection
pha
LDY_FOCUSVIEW ; Unfocus current view
lda WG_VIEWRECORDS+9,y
and #%01111111
sta WG_VIEWRECORDS+9,y
lda WG_FOCUSVIEW
jsr WGSelectView
jsr WGPaintView
pla
sta WG_FOCUSVIEW ; Focus on our original selection
jsr WGSelectView
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+9,y ; Change state and repaint to reflect it
ora #%10000000
sta WG_VIEWRECORDS+9,y
jsr WGPaintView
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewFocusNext
; Shifts focus to the next view
; Side effects: Changes selected view, repaints some views
;
WGViewFocusNext:
SAVE_AY
LDY_FOCUSVIEW ; Unfocus current view
lda WG_VIEWRECORDS+9,y
and #%01111111
sta WG_VIEWRECORDS+9,y
lda WG_FOCUSVIEW
jsr WGSelectView
jsr WGPaintView
WGViewFocusNext_loop:
inc WG_FOCUSVIEW ; Increment and wrap
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+2,y
bne WGViewFocusNext_wantFocus
lda #0
sta WG_FOCUSVIEW
WGViewFocusNext_wantFocus: ; Does this view accept focus?
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+4,y
cmp #VIEW_STYLE_TAKESFOCUS
bcc WGViewFocusNext_loop
WGViewFocusNext_focus:
lda WG_FOCUSVIEW ; Change state and repaint to reflect it
jsr WGSelectView
lda WG_VIEWRECORDS+9,y
ora #%10000000
sta WG_VIEWRECORDS+9,y
jsr WGPaintView
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewFocusPrev
; Shifts focus to the prev view
; Side effects: Changes selected view, repaints some views
;
WGViewFocusPrev:
SAVE_AXY
LDY_FOCUSVIEW ; Unfocus current view
lda WG_VIEWRECORDS+9,y
and #%01111111
sta WG_VIEWRECORDS+9,y
lda WG_FOCUSVIEW
jsr WGSelectView
jsr WGPaintView
WGViewFocusPrev_loop:
dec WG_FOCUSVIEW ; Decrement and wrap
bpl WGViewFocusPrev_wantFocus
ldx #$f
WGViewFocusPrev_findEndLoop:
stx WG_FOCUSVIEW
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+2,y
bne WGViewFocusPrev_wantFocus
dex
bra WGViewFocusPrev_findEndLoop
WGViewFocusPrev_wantFocus: ; Does this view accept focus?
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+4,y
cmp #VIEW_STYLE_TAKESFOCUS
bcc WGViewFocusPrev_loop
WGViewFocusPrev_focus:
lda WG_FOCUSVIEW ; Change state and repaint to reflect it
jsr WGSelectView
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+9,y
ora #%10000000
sta WG_VIEWRECORDS+9,y
jsr WGPaintView
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewFocusAction
; Performs the action of the focused view
; Side effects: Changes selected view, Repaints some views
;
WGViewFocusAction:
SAVE_AY
LDY_FOCUSVIEW
lda WG_VIEWRECORDS+4,y ; What kind of view is it?
cmp #VIEW_STYLE_CHECK
beq WGViewFocusAction_toggleCheckbox
cmp #VIEW_STYLE_BUTTON
beq WGViewFocusAction_buttonClick
bra WGViewFocusAction_done
WGViewFocusAction_toggleCheckbox:
lda WG_VIEWRECORDS+9,y ; Change the checkbox's state and redraw
eor #%00000001
sta WG_VIEWRECORDS+9,y
lda WG_FOCUSVIEW
jsr WGSelectView
jsr WGPaintView
; Fall through so checkboxes can have callbacks too
; NOTE: Self-modifying code ahead!
WGViewFocusAction_buttonClick:
lda WG_VIEWRECORDS+10,y ; Do we have a callback?
beq WGViewFocusAction_done
sta WGViewFocusAction_userJSR+2 ; Modify code below so we can JSR to user's code
lda WG_VIEWRECORDS+11,y
sta WGViewFocusAction_userJSR+1
WGViewFocusAction_userJSR:
jsr WGViewFocusAction_placeholder ; Overwritten with user's function pointer
WGViewFocusAction_done:
RESTORE_AY
WGViewFocusAction_placeholder:
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewSetTitle
; Sets the title of the active view
; PARAM0: Null-terminated string pointer (LSB)
; PARAM1: Null-terminated string pointer (MSB)
WGViewSetTitle:
SAVE_AXY
LDY_ACTIVEVIEW
lda PARAM0
sta WG_VIEWRECORDS+13,y
lda PARAM1
sta WG_VIEWRECORDS+12,y
WGViewSetTitle_done:
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewSetAction
; Sets the callback action of the active view
; PARAM0: Null-terminated function pointer (LSB)
; PARAM1: Null-terminated function pointer (MSB)
WGViewSetAction:
SAVE_AY
LDY_ACTIVEVIEW
lda PARAM0
sta WG_VIEWRECORDS+11,y
lda PARAM1
sta WG_VIEWRECORDS+10,y
WGViewSetAction_done:
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGSetCursor
; Sets the current local view cursor
; X: X
; Y: Y
;
WGSetCursor:
stx WG_LOCALCURSORX
sty WG_LOCALCURSORY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGSyncGlobalCursor
; Synchronizes the global cursor with the current local view's
; cursor
;
WGSyncGlobalCursor:
SAVE_AY
; X
LDY_ACTIVEVIEW
clc ; Transform to viewspace
lda WG_LOCALCURSORX
adc WG_VIEWRECORDS,y
iny
iny
iny
iny
iny
clc
adc WG_VIEWRECORDS,y ; Transform to scrollspace
sta WG_CURSORX
; Y
LDY_ACTIVEVIEW
iny
clc ; Transform to viewspace
lda WG_LOCALCURSORY
adc WG_VIEWRECORDS,y
iny
iny
iny
iny
iny
clc
adc WG_VIEWRECORDS,y ; Transform to scrollspace
sta WG_CURSORY
WGSyncGlobalCursor_done:
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGScrollX
; Scrolls the current view horizontally
; A: New scroll amount
; Side effects: Clobbers A
;
WGScrollX:
phy
pha
LDY_ACTIVEVIEW
iny
iny
iny
iny
iny
pla
sta WG_VIEWRECORDS,y
jsr cacheClipPlanes ; Scroll offset changed, so clipping cache is stale
WGScrollX_done:
ply
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGScrollXBy
; Scrolls the current view horizontally by a delta
; A: Scroll delta
; Side effects: Clobbers A
;
WGScrollXBy:
phy
phx
tax
SAVE_ZPS
LDY_ACTIVEVIEW
txa
bpl WGScrollXBy_contentRight
lda WG_VIEWRECORDS+2,y ; Compute left limit
sec
sbc WG_VIEWRECORDS+7,y
sta SCRATCH0
txa ; Compute new scroll value
clc
adc WG_VIEWRECORDS+5,y
cmp SCRATCH0 ; Clamp if needed
bmi WGScrollXBy_clampLeft
sta WG_VIEWRECORDS+5,y
bra WGScrollXBy_done
WGScrollXBy_clampLeft:
lda SCRATCH0
sta WG_VIEWRECORDS+5,y
bra WGScrollXBy_done
WGScrollXBy_contentRight:
clc ; Compute new scroll value
adc WG_VIEWRECORDS+5,y
cmp #0 ; Clamp if needed
beq @0
bpl WGScrollXBy_clampRight
@0: sta WG_VIEWRECORDS+5,y
bra WGScrollXBy_done
WGScrollXBy_clampRight:
lda #0
sta WG_VIEWRECORDS+5,y
WGScrollXBy_done:
RESTORE_ZPS
plx
ply
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGScrollY
; Scrolls the current view vertically
; A: New scroll amount
; Side effects: Clobbers A
;
WGScrollY:
phy
pha
LDY_ACTIVEVIEW
pla
iny
iny
iny
iny
iny
iny
sta WG_VIEWRECORDS,y
jsr cacheClipPlanes ; Scroll offset changed, so clipping cache is stale
WGScrollY_done:
ply
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGScrollYBy
; Scrolls the current view horizontally by a delta
; A: Scroll delta
; Side effects: Clobbers A
;
WGScrollYBy:
phy
phx
tax
SAVE_ZPS
LDY_ACTIVEVIEW
txa
bpl WGScrollYBy_contentDown
lda WG_VIEWRECORDS+3,y ; Compute bottom limit
sec
sbc WG_VIEWRECORDS+8,y
sta SCRATCH0
txa ; Compute new scroll value
clc
adc WG_VIEWRECORDS+6,y
cmp SCRATCH0 ; Clamp if needed
bmi WGScrollYBy_clampTop
sta WG_VIEWRECORDS+6,y
bra WGScrollYBy_done
WGScrollYBy_clampTop:
lda SCRATCH0
sta WG_VIEWRECORDS+6,y
bra WGScrollYBy_done
WGScrollYBy_contentDown:
clc ; Compute new scroll value
adc WG_VIEWRECORDS+6,y
cmp #0 ; Clamp if needed
beq @0
bpl WGScrollYBy_clampBottom
@0: sta WG_VIEWRECORDS+6,y
bra WGScrollYBy_done
WGScrollYBy_clampBottom:
lda #0
sta WG_VIEWRECORDS+6,y
WGScrollYBy_done:
RESTORE_ZPS
plx
ply
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGViewPaintAll
; Repaints all views
; Side effects: Changes selected view
;
WGViewPaintAll:
SAVE_AXY
ldx #0
WGViewPaintAll_loop:
txa
jsr WGSelectView
LDY_ACTIVEVIEW
lda WG_VIEWRECORDS+2,y ; Last view?
beq WGViewPaintAll_done
jsr WGEraseViewContents
jsr WGPaintView
inx
bra WGViewPaintAll_loop
WGViewPaintAll_done:
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; cacheClipPlanes
; Internal routine to cache the clipping planes for the view
;
cacheClipPlanes:
SAVE_AY
; Compute clip planes in view space
LDY_ACTIVEVIEW
iny ; Left edge
iny
iny
iny
iny
lda WG_VIEWRECORDS,y
eor #$ff
inc
sta WG_VIEWCLIP+0
dey ; Right edge
dey
dey
clc
adc WG_VIEWRECORDS,y
sta WG_VIEWCLIP+2
iny ; Right span (distance from window edge to view edge, in viewspace
iny
iny
iny
iny
lda WG_VIEWRECORDS,y
sec
sbc WG_VIEWCLIP+2
sta WG_VIEWCLIP+4
dey ; Top edge
lda WG_VIEWRECORDS,y
eor #$ff
inc
sta WG_VIEWCLIP+1
dey ; Bottom edge
dey
dey
clc
adc WG_VIEWRECORDS,y
sta WG_VIEWCLIP+3
RESTORE_AY
rts