Mercurial > public > mk2
view code_part1/OSTC_code_asm_part1/strings.asm @ 103:fe195f766014
Codesize optimized valconv.asm
author | JeanDo |
---|---|
date | Tue, 14 Dec 2010 11:14:32 +0100 |
parents | dc349e4264bb |
children | 6a94f96e9cea |
line wrap: on
line source
;============================================================================= ; ; File strings.asm ; ; Implementation code various string functions. ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>. ; ; Copyright (c) 2010, JD Gascuel. ;============================================================================= ; HISTORY ; 2010-12-02 : [jDG] Creation... ; ; See strings.inc for doc and public calling macros. VARARGS_BEGIN macro movff TOSL, TBLPTRL movff TOSH, TBLPTRH movff TOSU, TBLPTRU endm VARARGS_GET8 macro register tblrd*+ movff TABLAT, register endm VARARGS_GET16 macro register tblrd*+ movff TABLAT, register+0 tblrd*+ movff TABLAT, register+1 endm VARARGS_ALIGN macro btfss TBLPTRL,0 local no_tblptr_align bra no_tblptr_align incf TBLPTRL movlw 0 addwfc TBLPTRH no_tblptr_align: endm VARARGS_END macro ; Compute string length (modulo 256): movf TOSL,W subwf TBLPTRL,W ; Then 24bit add to return address addwf TOSL,F movlw 0 ; Clear WREG, but keep carry addwfc TOSH,F addwfc TOSU,F endm ;============================================================================= ; Variants that call word_processor at the end: strcpy_block_print: lfsr FSR2, letter strcat_block_print: clrf PRODL,A bra strings_common ; Variants that do not call word_processor at end: strcpy_block: lfsr FSR2, letter strcat_block: setf PRODL,A ; Common part: append the string from PROM return address: strings_common: VARARGS_BEGIN strcpy_loop: tblrd*+ movf TABLAT,W movwf POSTINC2 bnz strcpy_loop movf POSTDEC2,W ; rewind one char in string buffer. VARARGS_ALIGN VARARGS_END btfsc PRODL,0,A ; Should we print afterward ? return ; NO: then return straight away. goto word_processor ; ELSE: print it... ;============================================================================= start_small_block: clrf WREG,A movff WREG, win_font ; Need a bank-safe move here ! movff WREG, win_invert bra start_common start_small_invert_block: clrf WREG,A movff WREG, win_font ; Need a bank-safe move here ! setf WREG,A movff WREG, win_invert bra start_common start_medium_block: movlw 1 movff WREG, win_font ; Need a bank-safe move here ! clrf WREG,A movff WREG, win_invert bra start_common start_medium_invert_block: movlw 1 movff WREG, win_font ; Need a bank-safe move here ! movff WREG, win_invert bra start_common start_large_block: movlw 2 movff WREG, win_font ; Need a bank-safe move here ! clrf WREG,A movff WREG, win_invert bra start_common start_large_invert_block: movlw 2 movff WREG, win_font ; Need a bank-safe move here ! movlw 1 movff WREG, win_invert bra start_common start_common: VARARGS_BEGIN VARARGS_GET8 win_leftx2 VARARGS_GET8 win_top VARARGS_END return