Mercurial > public > hwos_code
diff src/strings.asm @ 0:11d4fc797f74
init
author | heinrichsweikamp |
---|---|
date | Wed, 24 Apr 2013 19:22:45 +0200 |
parents | |
children | 40ff64d60054 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/strings.asm Wed Apr 24 19:22:45 2013 +0200 @@ -0,0 +1,308 @@ +;============================================================================= +; +; File strings.asm +; +; Implementation code various string functions. +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= +; HISTORY +; 2010-12-02 : [jDG] Creation... +; +; See strings.inc for doc and public calling macros. + +#include "ostc3.inc" +#include "varargs.inc" + + extern aa_wordprocessor + +basic CODE +;============================================================================= +; Variants that call word_processor at the end: + global strcpy_block_print +strcpy_block_print: + lfsr FSR2, buffer + global strcat_block_print +strcat_block_print: + clrf PRODL,A + bra strings_common + +; Variants that do not call word_processor at end: + global strcpy_block +strcpy_block: + lfsr FSR2, buffer + global strcat_block +strcat_block: + setf PRODL,A + +; Common part: append the string from PROM return address: +strings_common: + VARARGS_BEGIN + + rcall strcat_prom + + VARARGS_ALIGN + VARARGS_END + + btfsc PRODL,0,A ; Should we print afterward ? + return ; NO: then return straight away. + goto aa_wordprocessor ; ELSE: print it... + +;============================================================================= +; Copy multi-lingual text from FSR1 12bit pointers, to buffer. +; +; Input: FSR1 = 12bit pointer to multi-lingual text. +; Output: FSR2 points to closing null byte in buffer. +; Trashed: TBLPTR, TABLAT. + global strcpy_text +strcpy_text: + rcall text_get_tblptr + bra strcpy_prom + +; Copy then print multi-lingual text from FSR1 12bit pointers, to buffer. +; +; Input: FSR1 = 12bit pointer to multi-lingual text. +; Output: FSR2 points to closing null byte in buffer. +; Trashed: TBLPTR, TABLAT. + global strcpy_text_print +strcpy_text_print: + rcall text_get_tblptr + bra strcpy_prom_print + +; Append multi-lingual text from FSR1 12bit pointers, to buffer at FRS2. +; +; Input: FSR1 = 12bit pointer to multi-lingual text. +; FSR2 = Current position in buffer. +; Output: FSR2 points to closing null byte in buffer. +; Trashed: TBLPTR, TABLAT. + global strcat_text +strcat_text: + rcall text_get_tblptr + bra strcat_prom + +; Append then print multi-lingual text from FSR1 12bit pointers, to buffer at FRS2. +; +; Input: FSR1 = 12bit pointer to multi-lingual text. +; FSR2 = Current position in buffer. +; Output: FSR2 points to closing null byte in buffer. +; Trashed: TBLPTR, TABLAT. + global strcat_text_print +strcat_text_print: + rcall text_get_tblptr + bra strcat_prom_print + +;============================================================================= +; Get pointer to multilingual texl in TBLPTR +; +; Input: FSR1 = 12bits of text handle. +; opt_language = current language. +; Output: TBLPTR = 24bits of PROM address. +; + global text_get_tblptr +text_get_tblptr: + extern text_english_base + movlw UPPER(text_english_base); Complete 12bits to 24bits address. + movwf TBLPTRU + movlw HIGH(text_english_base) + andlw 0xF0 + iorwf FSR1H,W + movwf TBLPTRH + movff FSR1L,TBLPTRL + + movff opt_language,WREG ; Get lang + bz text_get_english ; 0 == English + dcfsnz WREG ; 1 == German + bra text_get_german + dcfsnz WREG ; 2 == French + bra text_get_french + dcfsnz WREG ; 3 == Italian + bra text_get_italian +; Other ??? Keep english... + +; Read 2-byte pointer to string +text_get_english: + tblrd*+ + movff TABLAT,WREG + tblrd*+ + movff WREG,TBLPTRL + movff TABLAT,TBLPTRH + return + +; Add correction for German table: +text_get_german: + extern text_german_base + movlw LOW(text_german_base) + addwf TBLPTRL + movlw HIGH(text_german_base) + addwfc TBLPTRH + movlw UPPER(text_german_base) + addwfc TBLPTRU + + movlw LOW(text_english_base) + subwf TBLPTRL + movlw HIGH(text_english_base) + subwfb TBLPTRH + movlw UPPER(text_english_base) + subwfb TBLPTRU + bra text_get_english + + ; Add correction for French table: +text_get_french: + extern text_french_base + movlw LOW(text_french_base) + addwf TBLPTRL + movlw HIGH(text_french_base) + addwfc TBLPTRH + movlw UPPER(text_french_base) + addwfc TBLPTRU + + movlw LOW(text_english_base) + subwf TBLPTRL + movlw HIGH(text_english_base) + subwfb TBLPTRH + movlw UPPER(text_english_base) + subwfb TBLPTRU + bra text_get_english + + ; Add correction for Spanish table: +text_get_italian: + extern text_italian_base + movlw LOW(text_italian_base) + addwf TBLPTRL + movlw HIGH(text_italian_base) + addwfc TBLPTRH + movlw UPPER(text_italian_base) + addwfc TBLPTRU + + movlw LOW(text_english_base) + subwf TBLPTRL + movlw HIGH(text_english_base) + subwfb TBLPTRH + movlw UPPER(text_english_base) + subwfb TBLPTRU + bra text_get_english + +;============================================================================= +; Copy a null-terminated string from TBLPTR to buffer. +; +; Input: TBLPTR : string pointer into PROM. +; Output: string in buffer, FSR2 pointer on the closing null byte. +; + global strcpy_prom +strcpy_prom: + lfsr FSR2,buffer + +; Append a null-terminated string from TBLPTR to buffer. +; +; Input: TBLPTR : string pointer into PROM. +; FRS2 : current character position. +; Output: string in buffer, FSR2 pointer on the closing null byte. +; + global strcat_prom +strcat_prom: + tblrd*+ + movf TABLAT,W + movwf POSTINC2 + bnz strcat_prom + movf POSTDEC2,W ; rewind one char in string buffer. + return + +;============================================================================= +; Variant that calls word processor right-away... + global strcpy_prom_print + global strcat_prom_print + +strcpy_prom_print: + lfsr FSR2,buffer +strcat_prom_print: + rcall strcat_prom + goto aa_wordprocessor + +;============================================================================= + + global start_tiny_block +start_tiny_block: + clrf WREG + movff WREG, win_font ; Need a bank-safe move here ! + movff WREG, win_invert + bra start_common + + global start_tiny_invert_block +start_tiny_invert_block: + clrf WREG + movff WREG, win_font ; Need a bank-safe move here ! + movlw 1 + movff WREG, win_invert + bra start_common + + global start_small_block +start_small_block: + movlw 1 + movff WREG, win_font ; Need a bank-safe move here ! + clrf WREG + movff WREG, win_invert + bra start_common + + global start_small_invert_block +start_small_invert_block: + movlw 1 + movff WREG, win_font ; Need a bank-safe move here ! + movff WREG, win_invert + bra start_common + + global start_std_block +start_std_block: + movlw 2 + movff WREG, win_font ; Need a bank-safe move here ! + clrf WREG + movff WREG, win_invert + bra start_common + + global start_std_invert_block +start_std_invert_block: + movlw 2 + movff WREG, win_font ; Need a bank-safe move here ! + movlw 1 + movff WREG, win_invert + bra start_common + + global start_medium_block +start_medium_block: + movlw 3 + movff WREG, win_font ; Need a bank-safe move here ! + clrf WREG + movff WREG, win_invert + bra start_common + + global start_medium_invert_block +start_medium_invert_block: + movlw 3 + movff WREG, win_font ; Need a bank-safe move here ! + movlw 1 + movff WREG, win_invert + bra start_common + + global start_large_block +start_large_block: + movlw 4 + movff WREG, win_font ; Need a bank-safe move here ! + clrf WREG + movff WREG, win_invert + bra start_common + + global start_large_invert_block +start_large_invert_block: + movlw 4 + 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 + + END \ No newline at end of file