From 98b83e8700246e25994d11e992b44af62d16e6a3 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Sat, 21 Apr 2018 21:09:05 -0700 Subject: [PATCH] WIP --- desk.acc/control.panel.s | 479 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 desk.acc/control.panel.s diff --git a/desk.acc/control.panel.s b/desk.acc/control.panel.s new file mode 100644 index 0000000..f1e9272 --- /dev/null +++ b/desk.acc/control.panel.s @@ -0,0 +1,479 @@ + .setcpu "6502" + + .include "apple2.inc" + .include "../inc/apple2.inc" + .include "../inc/prodos.inc" + .include "../mgtk.inc" + .include "../desktop.inc" + .include "../macros.inc" + +;;; ============================================================ + + .org $800 + +entry: + +;;; Copy the DA to AUX for easy bank switching +.scope + lda ROMIN2 + copy16 #$0800, STARTLO + copy16 #da_end, ENDLO + copy16 #$0800, DESTINATIONLO + sec ; main>aux + jsr AUXMOVE + lda LCBANK1 + lda LCBANK1 +.endscope + +.scope + ;; run the DA + sta RAMRDON + sta RAMWRTON + sta ALTZPON + lda LCBANK1 + lda LCBANK1 + jsr init + + ;; tear down/exit + sta ALTZPON + lda LCBANK1 + lda LCBANK1 + sta RAMRDOFF + sta RAMWRTOFF + rts +.endscope + +;;; ============================================================ + +screen_width := 560 +screen_height := 192 + +da_window_id := 61 +da_width := 300 +da_height := 70 +da_left := (screen_width - da_width)/2 +da_top := (screen_height - da_height - 8)/2 + +str_title: + PASCAL_STRING "Control Panel" + +.proc winfo +window_id: .byte da_window_id +options: .byte MGTK::option_go_away_box +title: .addr str_title +hscroll: .byte MGTK::scroll_option_none +vscroll: .byte MGTK::scroll_option_none +hthumbmax: .byte 32 +hthumbpos: .byte 0 +vthumbmax: .byte 32 +vthumbpos: .byte 0 +status: .byte 0 +reserved: .byte 0 +mincontwidth: .word da_width +mincontlength: .word da_height +maxcontwidth: .word da_width +maxcontlength: .word da_height +port: +viewloc: DEFINE_POINT da_left, da_top +mapbits: .addr MGTK::screen_mapbits +mapwidth: .word MGTK::screen_mapwidth +maprect: DEFINE_RECT 0, 0, da_width, da_height, maprect +pattern: .res 8, $FF +colormasks: .byte MGTK::colormask_and, MGTK::colormask_or +penloc: DEFINE_POINT 0, 0 +penwidth: .byte 1 +penheight: .byte 1 +penmode: .byte 0 +textback: .byte $7F +textfont: .addr DEFAULT_FONT +nextwinfo: .addr 0 +.endproc + +;;; ============================================================ + + +.proc event_params +kind: .byte 0 +;;; event_kind_key_down +key := * +modifiers := * + 1 +;;; event_kind_update +window_id := * +;;; otherwise +xcoord := * +ycoord := * + 2 + .res 4 +.endproc + +.proc findwindow_params +mousex: .word 0 +mousey: .word 0 +which_area: .byte 0 +window_id: .byte 0 +.endproc + +.proc trackgoaway_params +clicked: .byte 0 +.endproc + +.proc dragwindow_params +window_id: .byte 0 +dragx: .word 0 +dragy: .word 0 +moved: .byte 0 +.endproc + +.proc winport_params +window_id: .byte da_window_id +port: .addr grafport +.endproc + + +.proc screentowindow_params +window_id: .byte da_window_id + DEFINE_POINT 0, 0, screen + DEFINE_POINT 0, 0, window +.endproc + mx := screentowindow_params::window::xcoord + my := screentowindow_params::window::ycoord + +.proc grafport +viewloc: DEFINE_POINT 0, 0 +mapbits: .word 0 +mapwidth: .word 0 +cliprect: DEFINE_RECT 0, 0, 0, 0 +pattern: .res 8, 0 +colormasks: .byte 0, 0 +penloc: DEFINE_POINT 0, 0 +penwidth: .byte 0 +penheight: .byte 0 +penmode: .byte 0 +textback: .byte 0 +textfont: .addr 0 +.endproc + + +;;; ============================================================ + +.proc init + MGTK_CALL MGTK::OpenWindow, winfo + jsr draw_window + MGTK_CALL MGTK::FlushEvents + ;; fall through +.endproc + +.proc input_loop + MGTK_CALL MGTK::GetEvent, event_params + bne exit + lda event_params::kind + cmp #MGTK::event_kind_button_down + beq handle_down + cmp #MGTK::event_kind_key_down + beq handle_key + jmp input_loop +.endproc + +.proc exit + MGTK_CALL MGTK::CloseWindow, winfo + DESKTOP_CALL DT_REDRAW_ICONS + rts +.endproc + +;;; ============================================================ + +.proc handle_key + lda event_params::key + cmp #CHAR_ESCAPE + beq exit + bne input_loop +.endproc + +;;; ============================================================ + +.proc handle_down + copy16 event_params::xcoord, findwindow_params::mousex + copy16 event_params::ycoord, findwindow_params::mousey + MGTK_CALL MGTK::FindWindow, findwindow_params + bne exit + lda findwindow_params::window_id + cmp winfo::window_id + bne input_loop + lda findwindow_params::which_area + cmp #MGTK::area_close_box + beq handle_close + cmp #MGTK::area_dragbar + beq handle_drag + cmp #MGTK::area_content + beq handle_click + jmp input_loop +.endproc + +;;; ============================================================ + +.proc handle_close + MGTK_CALL MGTK::TrackGoAway, trackgoaway_params + lda trackgoaway_params::clicked + beq input_loop + bne exit +.endproc + +;;; ============================================================ + +.proc handle_drag + copy winfo::window_id, dragwindow_params::window_id + copy16 event_params::xcoord, dragwindow_params::dragx + copy16 event_params::ycoord, dragwindow_params::dragy + MGTK_CALL MGTK::DragWindow, dragwindow_params +common: lda dragwindow_params::moved + bpl :+ + + ;; Draw DeskTop's windows + sta RAMRDOFF + sta RAMWRTOFF + jsr JUMP_TABLE_REDRAW_ALL + sta RAMRDON + sta RAMWRTON + + ;; Draw DA's window + jsr draw_window + + ;; Draw DeskTop icons + DESKTOP_CALL DT_REDRAW_ICONS + +: jmp input_loop + +.endproc + +;;; ============================================================ + +fatbit_w := 8 +fatbit_ws := 3 ; shift +fatbit_h := 4 +fatbit_hs := 2 ; shift +fatbits_rect: + DEFINE_RECT 20, 15, 20 + 8 * fatbit_w + 1, 15 + 8 * fatbit_h + 1, fatbits_rect + +;;; ============================================================ + + + +.proc handle_click +moved: copy16 event_params::xcoord, screentowindow_params::screen::xcoord + copy16 event_params::ycoord, screentowindow_params::screen::ycoord + MGTK_CALL MGTK::ScreenToWindow, screentowindow_params + + dec16 mx + cmp16 mx, fatbits_rect::x1 + bcc bail + dec16 my + cmp16 my, fatbits_rect::y1 + bcs continue +bail: jmp done + +continue: + sub16 mx, fatbits_rect::x1, mx + sub16 my, fatbits_rect::y1, my + + ldy #fatbit_ws +: lsr16 mx + dey + bne :- + cmp16 mx, #8 + bcs done + + ldy #fatbit_hs +: lsr16 my + dey + bne :- + cmp16 my, #8 + bcs done + + ldx mx + ldy my + lda pattern,y + eor mask,x + sta pattern,y + + MGTK_CALL MGTK::GetWinPort, winport_params + MGTK_CALL MGTK::SetPort, grafport + MGTK_CALL MGTK::HideCursor + jsr draw_bits + MGTK_CALL MGTK::ShowCursor + +done: jmp input_loop + +mask: .byte 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7 + +.endproc + +;;; ============================================================ + +penXOR: .byte MGTK::penXOR +pencopy: .byte MGTK::pencopy +penBIC: .byte MGTK::penBIC +notpencopy: .byte MGTK::notpencopy + +pattern: + .byte %01010101 + .byte %10101010 + .byte %01010101 + .byte %10101010 + .byte %01010101 + .byte %10101010 + .byte %01010101 + .byte %10101010 + +black_pattern: + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + .byte %00000000 + + +preview_l := 99 +preview_t := 15 +preview_r := 180 +preview_b := 48 +preview_s := 21 + +preview_rect: + DEFINE_RECT preview_l+1, preview_s + 1, preview_r - 1, preview_b - 1 + +preview_line: + DEFINE_RECT preview_l, preview_s, preview_r, preview_s + +preview_frame: + DEFINE_RECT preview_l, preview_t, preview_r, preview_b + + arr_w := 6 + arr_h := 5 + arr_inset := 5 + +.proc rarr_params +viewloc: DEFINE_POINT preview_r - arr_inset - arr_w, preview_t+1 +mapbits: .addr rarr_bitmap +mapwidth: .byte 1 +reserved: .byte 0 +cliprect: DEFINE_RECT 0, 0, arr_w-1, arr_h-1 +.endproc + +rarr_bitmap: + .byte px(%1100000) + .byte px(%1111000) + .byte px(%1111110) + .byte px(%1111000) + .byte px(%1100000) + +.proc larr_params +viewloc: DEFINE_POINT preview_l + arr_inset + 1, preview_t+1 +mapbits: .addr larr_bitmap +mapwidth: .byte 1 +reserved: .byte 0 +cliprect: DEFINE_RECT 0, 0, arr_w-1, arr_h-1 +.endproc + +larr_bitmap: + .byte px(%0000110) + .byte px(%0011110) + .byte px(%1111110) + .byte px(%0011110) + .byte px(%0000110) + +;;; ============================================================ + +.proc draw_window + ;; Defer if content area is not visible + MGTK_CALL MGTK::GetWinPort, winport_params + cmp #MGTK::error_window_obscured + bne :+ + rts +: + MGTK_CALL MGTK::SetPort, grafport + MGTK_CALL MGTK::HideCursor + + MGTK_CALL MGTK::SetPenMode, penBIC + MGTK_CALL MGTK::FrameRect, fatbits_rect + MGTK_CALL MGTK::PaintBits, larr_params + MGTK_CALL MGTK::PaintBits, rarr_params + + MGTK_CALL MGTK::SetPenMode, penXOR + MGTK_CALL MGTK::FrameRect, preview_frame + + MGTK_CALL MGTK::SetPenMode, penBIC + MGTK_CALL MGTK::FrameRect, preview_line + + jsr draw_bits + +done: MGTK_CALL MGTK::ShowCursor + rts + +.endproc + +bitpos: DEFINE_POINT 0, 0, bitpos + +.proc draw_bits + MGTK_CALL MGTK::SetPenMode, pencopy + MGTK_CALL MGTK::SetPattern, pattern + MGTK_CALL MGTK::PaintRect, preview_rect + + MGTK_CALL MGTK::SetPattern, winfo::pattern + MGTK_CALL MGTK::SetPenSize, size + + copy #0, ypos + add16 fatbits_rect::y1, #1, bitpos::ycoord + +yloop: copy #0, xpos + add16 fatbits_rect::x1, #1, bitpos::xcoord + ldy ypos + lda pattern, y + sta row + +xloop: ror row + bcc zero + lda #MGTK::pencopy + bpl store +zero: lda #MGTK::notpencopy +store: sta mode + + MGTK_CALL MGTK::SetPenMode, mode + MGTK_CALL MGTK::MoveTo, bitpos + MGTK_CALL MGTK::LineTo, bitpos + +next_x: inc xpos + lda xpos + cmp #8 + beq next_y + + add16 bitpos::xcoord, #fatbit_w, bitpos::xcoord + jmp xloop + +next_y: inc ypos + lda ypos + cmp #8 + beq done + + add16 bitpos::ycoord, #fatbit_h, bitpos::ycoord + jmp yloop + +done: rts + +xpos: .byte 0 +ypos: .byte 0 +row: .byte 0 + +mode: .byte 0 +size: .byte fatbit_w, fatbit_h + +.endproc + + +;;; ============================================================ + +da_end = * +.assert * < $1B00, error, "DA too big" + ;; I/O Buffer starts at MAIN $1C00 + ;; ... but icon tables start at AUX $1B00