;;; ============================================================ ;;; DeskTop - "Language Card" Segment ;;; ;;; Compiled as part of desktop.s ;;; ============================================================ ;;; ============================================================ ;;; Segment loaded into AUX $D000-$D1FF ;;; ============================================================ .org $D000 ;;; Constants needed in both main and aux menu_id_apple = 1 menu_id_file = 2 menu_id_view = 4 menu_id_special = 5 menu_id_startup = 8 menu_id_selector = 3 ;;; Various routines callable from MAIN ;;; ============================================================ ;;; MGTK call from main>aux, call in Y, params at (X,A) .proc MGTKRelayImpl .assert * = MGTK_RELAY, error, "Entry point mismatch" sty addr-1 stax addr sta RAMRDON sta RAMWRTON MGTK_CALL 0, 0, addr sta RAMRDOFF sta RAMWRTOFF rts .endproc ;;; ============================================================ ;;; SET_POS with params at (X,A) followed by DRAW_TEXT call .proc SetPosDrawText stax addr sta RAMRDON sta RAMWRTON MGTK_CALL MGTK::MoveTo, 0, addr MGTK_RELAY_CALL MGTK::DrawText, text_buffer2 tay sta RAMRDOFF sta RAMWRTOFF tya rts .endproc ;;; ============================================================ ;;; IconTK call from main>aux, call in Y params at (X,A) .proc ITKRelayImpl .assert * = ITK_RELAY, error, "Entry point mismatch" sty addr-1 stax addr sta RAMRDON sta RAMWRTON ITK_CALL 0, 0, addr tay sta RAMRDOFF sta RAMWRTOFF tya rts .endproc ;;; ============================================================ ;;; Used/Free icon map (Aux $1F80 - $1FFF) free_icon_map := $1F80 ;;; Find first available free icon in the map; if ;;; available, mark it and return index+1. .proc AllocateIcon sta RAMRDON sta RAMWRTON ldx #0 loop: lda free_icon_map,x beq :+ inx cpx #$7F bne loop rts : inx txa dex tay lda #1 sta free_icon_map,x sta RAMRDOFF sta RAMWRTOFF tya rts .endproc ;;; Mark the specified icon as free .proc FreeIcon tay sta RAMRDON sta RAMWRTON dey lda #0 sta free_icon_map,y sta RAMRDOFF sta RAMWRTOFF rts .endproc ;;; ============================================================ ;;; Copy data to/from buffers (see cached_window_id / cached_window_icon_list / window_icon_count_table/2) ??? .proc XferWindowIconTable ptr := $6 from: lda #$80 bne :+ ; always to: lda #$00 : sta flag jsr desktop_main_push_pointers lda cached_window_id asl a ; * 2 tax copy16 window_icon_count_table,x, ptr sta RAMRDON sta RAMWRTON bit flag bpl set_length ;; assign length from cached_window_icon_list lda cached_window_icon_count ldy #0 sta (ptr),y jmp set_copy_ptr ;; assign length to cached_window_icon_list set_length: ldy #0 lda (ptr),y sta cached_window_icon_count set_copy_ptr: copy16 window_icon_list_table,x, ptr bit flag bmi copy_from ;; copy into cached_window_icon_list ldy #0 ; flag clear... : cpy cached_window_icon_count beq done lda (ptr),y sta cached_window_icon_list,y iny jmp :- ;; copy from cached_window_icon_list copy_from: ldy #0 : cpy cached_window_icon_count beq done lda cached_window_icon_list,y sta (ptr),y iny jmp :- done: sta RAMRDOFF sta RAMWRTOFF jsr desktop_main_pop_pointers rts flag: .byte 0 rts ; ??? .endproc StoreWindowIconTable := XferWindowIconTable::from LoadWindowIconTable := XferWindowIconTable::to .proc LoadActiveWindowIconTable copy active_window_id, cached_window_id jmp LoadWindowIconTable .endproc .proc LoadDesktopIconTable copy #0, cached_window_id jmp LoadWindowIconTable .endproc ;;; ============================================================ ;;; Assign active state to active_window_id window .proc OverwriteWindowPort src := $6 dst := $8 sta RAMRDON sta RAMWRTON MGTK_CALL MGTK::GetPort, src ; grab window state lda active_window_id ; which desktop window? asl a tax copy16 win_table,x, dst lda dst clc adc #MGTK::Winfo::port sta dst bcc :+ inc dst+1 : ldy #.sizeof(MGTK::GrafPort)-1 loop: lda (src),y sta (dst),y dey bpl loop sta RAMRDOFF sta RAMWRTOFF rts .endproc ;;; ============================================================ ;;; From MAIN, load AUX (A,X) into A .proc AuxLoad stx op+2 sta op+1 sta RAMRDON sta RAMWRTON op: lda dummy1234 sta RAMRDOFF sta RAMWRTOFF rts .endproc ;;; ============================================================ ;;; From MAIN, show alert ;;; ...with prompt #0 .proc ShowAlert ldx #$00 ;; fall through .endproc ;;; ... with prompt # in X .proc ShowAlertOption sta RAMRDON sta RAMWRTON jsr desktop_aux::show_alert_indirection sta RAMRDOFF sta RAMWRTOFF rts .endproc ;;; ============================================================ ;;; Input: numbers in A,X, Y (all unsigned) ;;; Output: number in A,X (unsigned) .proc Multiply_16_8_16 stax num1 sty num2 ;; Accumulate directly into A,X lda #0 tax beq test add: clc adc num1 tay txa adc num1+1 tax tya loop: asl num1 rol num1+1 test: lsr num2 bcs add bne loop rts num1: .word 0 num2: .byte 0 .endproc ;;; ============================================================ ;;; Input: dividend in A,X, divisor in Y (all unsigned) ;;; Output: quotient in A,X (unsigned) .proc Divide_16_8_16 result := dividend stax dividend sty divisor lda #0 sta divisor+1 sta remainder sta remainder+1 ldx #16 loop: asl dividend rol dividend+1 rol remainder rol remainder+1 lda remainder sec sbc divisor tay lda remainder+1 sbc divisor+1 bcc skip sta remainder+1 sty remainder inc result skip: dex bne loop ldax dividend rts dividend: .word 0 divisor: .word 0 remainder: .word 0 .endproc ;;; ============================================================ PAD_TO $D200