; Justice Unlimited Gadget Microcode
; (C) 2004 Nathan (Acorn) Pooley
;
; gout_com.inc
;
;@DOC@ code for outputing characters to the display
;@DOC@ This code is common; ie it is not specific to the
;@DOC@ serial or the parallel interface
;
;
; high level output functions (common to serial vs parallel)
;
;############################################
;############### DISPLAY NAMED STRING #######
;############################################
;
; display string
; w is index of string to show (0-255)
;
puts:
rcall string_find ; find the string
;
; fall thru to display string
;
;############################################
;############### DISPLAY ADDRESSED STRING ###
;############################################
;
; display string
; v_str_addrlo, v_str_addrhi should hold address of string
;
puts_addr:
rcall string_setup_read ; setup to read from v_str_addrhi/lo
tblrd*+ ; read len and increment to first data byte
movff TABLAT,v_str_cnt ; length of string
puts_loop:
tblrd*+ ; get character
movf TABLAT,w
rcall putc
decfsz v_str_cnt
bra puts_loop
return
;############################################
;############### GET NEXT CHAR FROM STRING ##
;############################################
;
; This is used by special character functions
; to get the next character from the current string
; This should be called from within puts.
;
; next char is returned in w
puts_nextc:
tblrd*+ ; get character
movf TABLAT,w
decfsz v_str_cnt
return
bra error_nextc ; if this is last char then TROUBLE!
;############################################
;############### FIND NAMED STRING ##########
;############################################
;
; find string
; w is index of string to show (0-255)
;
string_find:
movwf v_str_cnt
movlw LOW strings
movwf v_str_addrlo
movlw HIGH strings
movwf v_str_addrhi
bra string_add_cnt ; find the string
;############################################
;############### ADD STRINGS ################
;############################################
;
; find next string
;
string_inc:
movlw 0x01
;
; add w to v_str_addrhi, v_str_addrlo
; w can be 0 (and nothing is added)
;
string_add:
movwf v_str_cnt
;
; add v_str_cnt to v_str_addrhi, v_str_addrlo
; v_str_cnt can be 0 (and nothing is added)
;
string_add_cnt:
movf v_str_cnt,f
bz string_add_done
rcall string_setup_read ; setup to read from v_str_addrhi/lo
string_add_loop:
tblrd*+ ; read len and increment to first data byte
movf TABLAT,w ; add len to get to next string
addwf TBLPTRL,f
clrf WREG
addwfc TBLPTRH,f
decfsz v_str_cnt,f
bra string_add_loop
movff TBLPTRL, v_str_addrlo
movff TBLPTRH, v_str_addrhi
string_add_done:
return
;############################################
;############### PREPARE TO READ STRING DATA
;############################################
;
; setup to read data from v_str_addrhi/lo
;
string_setup_read:
bcf b_cfgs ; access program mem (not config regs)
bsf b_eepgd ; access program mem (not eeprom)
movff v_str_addrlo, TBLPTRL
movff v_str_addrhi, TBLPTRH
clrf TBLPTRU ; zero the pointer
return
;############################################
;############### PUT LINE ###################
;############################################
;
; put string at line 0 or 1
; Will draw spaces to fill up remainder of line
; w should contain string ID
; v_linenum should contain line (only low bit is used)
; xxxxxxx0 = line1
; xxxxxxx1 = line2
;
putl:
rcall string_find
;
; same as putl, but string is in v_str_addrhi/lo
;
putl_addr:
;
; move cursor to start of line
;
rcall put_position_linestart
;
; draw string, counting characters
;
rcall puts_addr
;
; how many characters left on line?
;
movlw LOW -20
addwf v_putc_cnt,f
movf v_putc_cnt,w ; cnt
addlw LOW -20 ; cnt-20
bnn putl_end ; no spaces needed
putl_loop:
movlw 0x20 ; draw a space
rcall putc_raw
movf v_putc_cnt,w
bn putl_loop
putl_end:
return
;############################################
;############### SPECIAL CHARACTERS #########
;############################################
;
; print game time
;
sc_game_time:
movf v_time_h,w
sc_time_common:
movff v_time_m, v_ptime_min
movff v_time_s, v_ptime_sec
sc_time_common2:
bsf b_showing_time
bra put_time
;
; print real time (12 hour clock)
;
sc_real_time:
movf v_time_h,w
addlw GAME_START_HOUR
sc_real_time_loop:
addlw LOW -12
btfss STATUS,Z
bnn sc_real_time_loop
addlw 12
bra sc_time_common
sc_clue_time:
movf v_cluetime_h,w
movff v_cluetime_m, v_ptime_min
movff v_cluetime_s, v_ptime_sec
movf v_cluenum,f
btfss STATUS,Z
bra sc_time_common2
clrf WREG
clrf v_ptime_min
clrf v_ptime_sec
bra sc_time_common2
#if REPORT_ERRORS
;
; error counts
;
#if 0
sc_oerr_restart:
movf v_oerrcnt_restart,w
bra putnum_w
sc_oerr_noack:
movf v_oerrcnt_noack,w
bra putnum_w
sc_oerr_en_retry:
movf v_oerrcnt_en_retry,w
bra putnum_w
sc_oerr_bus:
movf v_oerrcnt_bus,w
bra putnum_w
sc_oerr_wcol:
movf v_oerrcnt_wcol,w
bra putnum_w
sc_oerr_nosspif:
movf v_oerrcnt_nosspif,w
bra putnum_w
#endif
sc_cnt_turnon:
movf v_cnt_turnon,w
bra putnum_w
sc_cnt_outenab:
movf v_cnt_outenab,w
bra putnum_w
#else
sc_oerr_restart:
sc_oerr_noack:
sc_oerr_enable:
sc_oerr_en_retry:
sc_oerr_bus:
sc_oerr_wcol:
sc_oerr_nosspif:
sc_cnt_turnon:
sc_cnt_outenab:
movlw '?'
bra putc
#endif
#if 1
;
; print ir rx results
;
sc_irlook:
rcall input_disable
rcall light_stay_off
ENABLE_IR
movlw 1
movwf v_ircnt ; track counts
clrf v_ircnt2
bcf b_int0if
sc_irlook_1:
movlw 4
movwf v_ircnt2
sc_irlook_2:
movlw 150
movwf v_tmp
sc_irlook_3
btfss but_click
bra sc_irlook_done ; finish on click
btfss b_int0if
bra sc_irlook_4
bcf b_int0if
SOUND_CLICK
nop
SOUND_CLICK
nop
SOUND_CLICK
nop
SOUND_OFF
incf v_ircnt,f
movf v_ircnt,w
addlw -20
btfsc STATUS,Z
decf v_ircnt,f
sc_irlook_4:
decfsz v_tmp,f
bra sc_irlook_3
call reset_sleep_time
dcfsnz v_ircnt,f
incf v_ircnt,f
decfsz v_ircnt2,f
bra sc_irlook_2
movlw 20
rcall put_position
incf v_ircnt,w
movwf v_tmp
sc_irlook_bar:
movlw 0xff ; black square
rcall putc
decfsz v_tmp,f
bra sc_irlook_bar
movf v_ircnt,w
sublw 21
movwf v_tmp
sc_irlook_spc:
movlw ' '
rcall putc
decfsz v_tmp,f
bra sc_irlook_spc
bra sc_irlook_1
sc_irlook_done:
call reset_sleep_time
DISABLE_IR
btfss but_click
bra sc_irlook_done ; wait for no button pressed
movlw func_fn_pop
bsf b_spinchange ; ensure it is displayed again
movwf v_func_spinchange
movwf v_func_btn0_click
movlw 20
movwf v_putc_cnt
return
#else
;
; print ir rx results
;
sc_irlook:
rcall reset_sleep_time ; do not fall asleep
bsf b_spinchange ; ensure it is displayed again
incf v_ircnt2,f
btfsc disab_irrx
bra sc_irlook_first ; first time? - do setup
btfss b_int0if
bra sc_irlook_none
bcf b_int0if
incf v_ircnt,f
incf v_ircnt,f
; call snd_click
SOUND_CLICK
nop
SOUND_CLICK
nop
SOUND_CLICK
nop
SOUND_OFF
sc_irlook_none:
dcfsnz v_ircnt,f
incf v_ircnt,f ; min = 1
movf v_ircnt,w
addlw -20
btfsc STATUS,C
movlw -1
addlw 20
movwf v_ircnt
incf v_ircnt,w
movwf v_tmp
sc_irlook_bar:
movlw 0xff ; black square
rcall putc
decfsz v_tmp,f
bra sc_irlook_bar
sc_irlook_first:
DISABLE_SPINNER
ENABLE_IR
movlw 1
movwf v_ircnt ; track counts
clrf v_ircnt2
bcf b_int0if
return
#endif
#if 0
; draw bar of len=W, w=0..19
draw_bar:
addwf LOW -19
btfsc STATUS,C
movlw LOW -1
addlw 20
movwf v_tmp
movlw 20
rcall putc_position
movlw 0xff
draw_bar_loop:
rcall putc
decfsz v_tmp,f
bra draw_bar_loop
movlw 19
movwf v_tmp
movlw ' '
draw_bar_spc:
rcall putc
decfsz v_tmp,f
bra draw_bar_spc
return
#endif
|
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:55:00 2004