; Justice Unlimited Gadget Microcode ; (C) 2004 Nathan (Acorn) Pooley ; ; gmode.inc ; ;@DOC@ code to handle and switch between modes ; ;############################################ ;############### SPIN CODE ################## ;############################################ ; ; spinner changed - update TEXT mode ; spin_text: BREAKPOINT bp_input ; ; draw line 1 ; movff v_mode_str_hi, v_str_addrhi movff v_mode_str_lo, v_str_addrlo clrf v_putl_linenum decf v_spinval,w rcall string_add rcall putl_addr ; ; fall thru to common text-menu code ; ; ; spinner changed - update MENU mode ; SKIP_BREAKPOINT spin_menu: BREAKPOINT bp_input spin_common: bcf b_spinchange ; ; draw line 2 ; movff v_mode_str_hi, v_str_addrhi movff v_mode_str_lo, v_str_addrlo setf v_putl_linenum movf v_spinval,w rcall string_add rcall putl_addr bra spin_done_keepchange ; ; spinner changed - update ENTRY mode ; spin_entry: BREAKPOINT bp_input ; ; move to line 2 ; movlw 20 rcall put_position #if USE_ENTMASK ; ; what is the new character? ; lfsr FSR0, BUF_ENTCHARS-1 movf v_spinval,w addwf FSR0L,f movff INDF0, TABLAT ; store temorarily into TABLAT #endif ; ; draw entry so far ; lfsr FSR0, BUF_ENTRY ; address the entry buffer movf v_entry_ptr,w clrf PLUSW0 ; clear last byte addlw -12 ; start 12 bytes from end btfsc STATUS,N clrf WREG ; ... or at beginning if <=12 total movwf FSR0L bra spin_entry_start spin_entry_loop: rcall putc_raw spin_entry_start: movf POSTINC0,w ; get character bnz spin_entry_loop ; not 0 - show it #if USE_ENTMASK ; ; what is the new character? ; movf TABLAT,w bnn spin_entry_finish ; regular character? ; ; special character ; 0x80 = delete/exit ; 0x81 = enter/exit ; 0x82 = exit ; addlw LOW str_entry_del-0x80 movf v_entry_ptr,f ; if first character then is exit btfsc STATUS,Z movlw str_entry_exit rcall puts bra spin_done #else ; ; what is the new character? ; ; 1 = enter (exit if first char) ; 2...27 = a...z ; 28...37 = 0...9 ; 38 = <space> ; 39 = <del> (exit if first char) ; 40 = <enter2> (exit if first char) ; 41 = <exit> ; movf v_spinval,w addlw LOW -1 bz spin_entry_special ; enter? addlw LOW -27 bn spin_entry_alpha ; alpha character? addlw LOW -10 bn spin_entry_num ; numeric digit? bz spin_entry_space ; space? spin_entry_special: ; ; exit ; ; ; it is either: ; enter (was 1, now 0) ; del (was 39, now 1) ; enter2 (was 40, now 2) ; exit (was 41, now 3) ; addlw str_entry_enter movf v_entry_ptr,f ; if first character then is exit btfsc STATUS,Z movlw str_entry_exit rcall puts bra spin_done spin_entry_space: movlw ' '-'0'-10 ; space ; ; -10...-1 = 0...9 ; spin_entry_num: addlw '0'+10-'A'-26 ; digit ; ; -26...-1 = a...z ; spin_entry_alpha: addlw 'A'+26 ; alpha letter #endif ; ; put new character in buffer and draw it ; spin_entry_finish: decf FSR0L,f movwf INDF0 ; store rcall putc_raw ; draw movlw str_entry_spc rcall puts ; erase following characters ; fall through to spin_done ; ; finish spin function ; SKIP_BREAKPOINT spin_ignore: BREAKPOINT bp_input spin_done: bcf b_spinchange spin_done_keepchange: BREAKPOINT bp_sim_input return ;############################################ ;############### CLICK CODE ################# ;############################################ #if USE_ENTMASK ; ; ENTRY Mode click ; click_entry: BREAKPOINT bp_input ; ; what character was selected? ; lfsr FSR0, BUF_ENTCHARS-1 movf v_spinval,w addwf FSR0L,f movf INDF0,w bnn click_entry_char ; ; special character ; if first char then exit (no questions asked) ; movf v_entry_ptr,f bnz click_entry_special ; not 1st char? ; ; first char & exited ; bra pop_mode click_entry_special: ; ; special character ; 0x80 = delete ; 0x81 = enter ; 0x82 = exit ; addlw LOW -0x81 bz click_entry_enter ; was 0x81 bn click_entry_del ; was 0x80 ; ; fall thru to click_entry_exit ; ; ; <exit> - are we really done? ; click_entry_exit: movlw mode_entryabort bra push_mode ; ; <enter> clicked! jump to function pointer ; click_entry_enter: movf v_mode_action,w ; function to call bra main_jump ; ; <del> (backspace) clicked ; click_entry_del: decf v_entry_ptr,f ; delete character bra spin_entry ; go here to redisplay ; ; got a character - increment ptr and check overflow ; click_entry_char: incf v_entry_ptr,f ; add character btfsc STATUS,N decf v_entry_ptr,f ; overflow? - remove char bra spin_entry ; go here to redisplay #else ; ; ENTRY Mode (type=0x80) ; ; 1 = enter (exit if first char) ; 2...27 = a...z ; 28...37 = 0...9 ; 38 = <space> ; 39 = <del> (exit if first char) ; 40 = <enter2> (exit if first char) ; 41 = <exit> ; click_entry: movf v_spinval,w addlw LOW -1 ; enter? bz click_entry_enter addlw LOW -38 bn click_entry_char ; valid character bz click_entry_del ; <del> clicked dcfsnz WREG,f bra click_entry_enter ; enter2 click_entry_exit: movlw mode_entryabort ; ABORT - return to main menu bra set_mode ; ; <enter> clicked! jump to function pointer ; click_entry_enter: movf v_entry_ptr,f bz click_entry_exit ; quit if first char movf v_mode_choice,w ; function to call movf v_entry_ptr,f bz set_default_mode1 ; if no data entered, do default bra main_jump ; ; <del> (backspace) clicked ; click_entry_del: movf v_entry_ptr,f bz click_entry_exit ; quit if first char decf v_entry_ptr,f ; delete character btfsc STATUS,N clrf v_entry_ptr ; at start of buffer? - stay there bra spin_entry ; go here to redisplay ; ; got a character - increment ptr and check overflow ; click_entry_char: incf v_entry_ptr,f ; add character btfsc STATUS,N decf v_entry_ptr,f ; overflow? - remove char bra spin_entry ; go here to redisplay #endif ; ; text click just changes to new mode ; click_text: BREAKPOINT bp_input ; ; special case if current mode is welcome mode ; movf v_mode,w bz init_to_main_menu ; ; get next mode ; movf v_mode_action,w #if 0 bra click_setmode #endif bz pop_mode ; 00 - pop bra set_mode ; ; menu click - lookup new mode ; click_menu: BREAKPOINT bp_input lfsr FSR0, BUF_MODE-1 movf v_spinval,w addwf FSR0L,f movf INDF0,w ; action bz pop_mode ; 00 - pop bra push_mode #if 0 click_setmode: ; mode ACTION ; 00 pop ; 80 init mode (pop everything) ; >0 push mode ; <0 set mode & 0x7f ; bz pop_mode ; 00 - pop bnn push_mode ; >0 - push andlw 0x7f bnz set_mode ; <0 - set rcall init_mode ; 80 - init bra load_mode #endif ;############################################ ;############### MODE FUNCS ################# ;############################################ ; TODO: finish these fn_save_name: movlw mode_gotname bra set_mode fn_switch_light: rcall light_toggle bra pop_mode fn_switch_off: rcall init_mode bsf b_sleep bsf b_turn_off return fn_irlook_end: DISABLE_IR bra pop_mode fn_pop3: rcall pop_mode_noload fn_pop2: rcall pop_mode_noload fn_pop: bra pop_mode ; ; set paremeter0 as curent mode ; fn_setmode: movf v_str_addrhi,w bra set_mode ;############################################ ;############### INIT MODE ################## ;############################################ ; ; initialize mode related variables ; init_mode: movlw LOW BUF_MODESTACK_END movwf v_modestack_ptr movlw mode_welcome #if 1 bra set_mode_noload #else bra set_mode #endif ; ; init to main menu ; init_to_main_menu: movlw LOW BUF_MODESTACK_END movwf v_modestack_ptr movlw mode_main_menu bra set_mode_noload ;############################################ ;############### PUSH/POP MODE ############## ;############################################ ; ; mode stack frame: ; ; +0 mode index ; +1 v_spinval ; pop_mode_err bra error_stackpop push_mode_err bra error_stackpush ; ; pop mode off stack - do not load resulting mode ; pop_mode_noload: lfsr FSR0,BUF_MODESTACK movf v_modestack_ptr,w bn pop_mode_err ; popped off end of stack movwf FSR0L movff PREINC0,v_spinval ; get old spinval movff PREINC0,v_mode ; get old mode movff FSR0L,v_modestack_ptr return ; ; push mode onto stack - do not load resulting mode ; push_mode_noload: movwf v_tmp lfsr FSR0,BUF_MODESTACK movf v_modestack_ptr,w bz push_mode_err movwf FSR0L movff v_mode,POSTDEC0 ; save old mode movff v_spinval,POSTDEC0 ; save old spinval movff FSR0L,v_modestack_ptr movf v_tmp,w set_mode_noload: movwf v_mode movlw 1 movwf v_spinval movf v_mode,w ; keep mode in w bcf b_popping return ; ; pop mode off stack ; pop_mode: rcall pop_mode_noload ; ; fall thru to redraw mode ; ; ; redraw current mode from scratch ; redraw_mode: bsf b_popping ; we are doing a pop! bra load_mode ; ; push current mode onto stack & set new mode ; push_mode: rcall push_mode_noload ; ; fall thru to set_mode ; ;############################################ ;############### SET NEW MODE ############### ;############################################ ; ; set new mode (replaces current mode) ; w = index of new mode ; set_mode: rcall set_mode_noload ; ; fall thru to load_mode ; ;############################################ ;############### FIND AND SETUP MODE ######## ;############################################ ; ; find mode (from v_mode) and load into mode buffer ; load_mode: BREAKPOINT bp_load_mode bsf disab_spinner ; save power by disabling spin #if 1 ; ; clear screen (TODO: is this needed?) ; rcall putc_clr ; clear screen #endif rcall setup_progread ; prepare to read flash mem movlw LOW modes ; point to mode table (in flash mem) movwf TBLPTRL movlw HIGH modes movwf TBLPTRH incf v_mode,w ; mode movwf v_tmp bra load_mode_start load_mode_loop: tblrd* ; get byte-len of mode movf TABLAT,w addwf TBLPTRL,f ; add to pointer clrf WREG addwfc TBLPTRH,f load_mode_start: decfsz v_tmp,f bra load_mode_loop ; ; load mode ; lfsr FSR0,BUF_MODE tblrd*+ ; read length of mode ; ; read type of mode and count ; tblrd*+ movf TABLAT,w andlw 0x3f movwf v_mode_cnt ; # items in menu/text or mask for entry movwf v_spinmax movwf v_tmp movf TABLAT,w andlw 0xc0 ; what type of mode? movwf v_mode_type ; ; read first string address ; tblrd*+ movf TABLAT,w movwf v_mode_str_hi movwf v_str_addrhi tblrd*+ movf TABLAT,w movwf v_mode_str_lo movwf v_str_addrlo ; ; read action ; tblrd*+ movf TABLAT,w movwf v_mode_action movwf POSTINC0 ; ; entry or function call mode? ; BREAKPOINT bp_load_mode2 movf v_mode_type,w bn load_func_or_entry load_text_or_menu: ; ; menu? ; btfsc v_mode_type,6 bra load_menu_text_com load_menu: ; ; load each action in menu ; tblrd*+ movf TABLAT,w movwf POSTINC0 decfsz v_tmp bra load_menu ; ; draw initial string (menu only) ; clrf v_putl_linenum rcall putl_addr load_menu_text_com: ; ; init & begin accepting input ; rcall input_enable ; ; set click function ; movlw func_click_text btfss v_mode_type,6 movlw func_click_menu movwf v_func_btn0_click ; button click func ; ; set spin function ; movlw func_spin_text btfss v_mode_type,6 movlw func_spin_menu movwf v_func_spinchange ; spin change func ; ; run spinchange function to draw 2nd line ; bra main_jump load_func_or_entry: addlw LOW -MTYPE_FUNC bz load_func load_entry: ; ; load character set ; movlw 0x81 ; add <enter> special character movwf POSTINC0 movlw 26 ; add uppercase characters movwf v_tmp movlw 'A' btfsc b_entmsk_upper rcall load_entry_addc movlw 26 ; add lowercase characters movwf v_tmp movlw 'a' btfsc b_entmsk_lower rcall load_entry_addc movlw 10 ; add digits movwf v_tmp movlw '0' btfsc b_entmsk_digit rcall load_entry_addc movlw ' ' ; add space btfsc b_entmsk_space movwf POSTINC0 ; special character ; 0x80 = delete/exit ; 0x81 = enter/exit ; 0x82 = exit ; movlw 3 ; add special characters movwf v_tmp movlw 0x80 rcall load_entry_addc ; ; how many characters total? ; movf FSR0L,w addlw LOW -BUF_ENTCHARS movwf v_spinmax ; ; draw initial string ; clrf v_putl_linenum rcall putl_addr ; ; empty entry buffer (unless popping) ; btfss b_popping clrf v_entry_ptr ; clear entry pointer lfsr FSR0, BUF_ENTRY movff v_entry_ptr,FSR0L clrf INDF0 ; zero last char in buffer ; ; init & begin accepting input ; rcall input_enable ; ; load function pointers ; movlw func_click_entry movwf v_func_btn0_click ; click func movlw func_spin_entry movwf v_func_spinchange ; spin change func ; ; run spinchange function to draw 2nd line ; bra main_jump ; ; add characters to character buffer ; w = 1st character to add ; v_tmp = # of characters to add ; load_entry_addc: movwf POSTINC0 incf WREG,w decfsz v_tmp,f bra load_entry_addc return load_func: ; ; call function ; Parameters (if any) are in v_str_addrhi, v_str_addrlo ; movf v_mode_cnt,w ; function id bra main_jump |
This file Copyright (C) 2004 by Nathan (Acorn) Pooley
Go to DRUID Development page
Go to DRUID page
Go to JU Gadgets page
Go to Justice Unlimited homepage
Go to Acorn's personal webpage
Contact Acorn
See comments from others
Post your own comments
File created by do_doc at Wed Aug 4 17:54:36 2004